Conforme solicitado segue comentários sobre código:
Sub MontaForma()
' Declaração de variáveis
Dim rng As Range
Dim nl As Boolean
Dim sm1 As Double, sm2 As Double, sm3 As Double, sm4 As Double
'Atribuição dos valores às variáveis de controle
nl = False
'Verificação se o processo já foi executado no arquivo para não executar novamente sobre dados já ordenados
If Range("I1").Value = "Feito" Then
MsgBox ("Processo já efetuado nestes dados, faça nova cópia de dados da planilha 2 para executar novamente")
Exit Sub
End If
'Desliga a atualização do monitor
Application.ScreenUpdating = False
'Insere uma coluna com uma fórmula para verificar se registro está com valor de INATIVO na coluna B (linha amarela), _
se estiver INATIVO atribui o valor VERDADEIRO senão FALSO
Columns("A:A").Select
Selection.Insert shift:=xlToRight, copyorigin:=xlFormatFromLeftOrAbove
Range("A1").FormulaR1C1 = _
"=OR(IF(RC[2]=""INATIVO"",TRUE,FALSE),AND(R[1]C[1]=RC[1],R[1]C=TRUE))"
Range("A1").Copy Destination:=Range("A2:A267")
Application.CutCopyMode = False
' Faz uma verificação em cada célula da coluna A (criada acima) para verificar se é verdadeiro ou falso
For Each rng In Range("A:A")
'Verifica se o controle para inserir nova linha está ligado ou desligado, caso VERDADEIRO então insere nova linha e atribui o valor das _
variáveis de soma às células das colunas C,D,E,F da linha corrente e zera variáveis de soma
If nl = True Then
rng.EntireRow.Insert shift:=xlDown, copyorigin:=xlFormatFromLeftOrAbove
rng.Offset(-1, 3).Value = sm1
rng.Offset(-1, 4).Value = sm2
rng.Offset(-1, 5).Value = sm3
rng.Offset(-1, 6).Value = sm4
rng.Offset(-1, 1).Value = rng.Offset(-2, 1).Value
nl = False
sm1 = 0
sm2 = 0
sm3 = 0
sm4 = 0
End If
'Verifica se a célula tem valor VERDADEIRO, caso afirmativo atribui os valores das colunas C,D,E,F na linha corrente para as _
variáveis de soma.
If rng.Value = True Then
sm1 = sm1 + rng.Offset(0, 3).Value
sm2 = sm2 + rng.Offset(0, 4).Value
sm3 = sm3 + rng.Offset(0, 5).Value
sm4 = sm4 + rng.Offset(0, 6).Value
End If
'Verifica se a célula tem valor VERDADEIRO, caso afirmativo compara os valores das células da coluna B da linha corrente com o _
valor da célula de baixo. Se os valores forem difentes ou se o valor da célula de baixo referente a coluna A for FALSO então _
atribui a variável de controle para inserção de nova linha
If rng.Value = True And (rng.Offset(0, 1).Value <> rng.Offset(1, 1).Value Or rng.Offset(1, 0).Value = False) Then nl = True
If rng.Value = "" Then Exit For
Next rng
'Copia e cola como valores para que as células que contém fórmulas não percam o seu conteúdo durante o processamento de exclusão de linhas
Columns("A:A").Select
Selection.Copy
Range("A1").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
'Vai para rotina de exclusão das linhas que contém VERDADEIRO na coluna A
DeleteRowsWithWord
'Deleta a coluna auxiliar A
Range("A:A").EntireColumn.Delete
'Atribui o valor Feito na célula I1 da planilha para evitar que a rotina seja executada em cima de dados já processados.
Range("I1").Value = "Feito"
'Libera a atualização no monitor
Application.ScreenUpdating = True
End Sub
Sub DeleteRowsWithWord()
Dim Col As Integer, Word As Variant
Let Col = 1
Let Word = True
With Columns(Col)
.Replace Word, "#N/A", xlWhole
.SpecialCells(xlCellTypeConstants, xlErrors).EntireRow.Delete
End With
End Sub
Postado : 28/11/2012 8:16 am