Este é o VBA, ou uma macro que você pode executar na sua planilha. Você deve pressionar alt+ F11para exibir o prompt do Visual Basic for Application, vá para sua pasta de trabalho right click - insert - module
e cole esse código lá. Você pode executar o módulo no VBA pressionando F5. Essa macro é chamada "teste"
Sub test()
'define variables
Dim RowNum as long, LastRow As long
'turn off screen updating
Application.ScreenUpdating = False
'start below titles and make full selection of data
RowNum = 2
LastRow = Cells.SpecialCells(xlCellTypeLastCell).Row
Range("A2", Cells(LastRow, 4)).Select
'For loop for all rows in selection with cells
For Each Row In Selection
With Cells
'if customer name matches
If Cells(RowNum, 1) = Cells(RowNum + 1, 1) Then
'and if customer year matches
If Cells(RowNum, 4) = Cells(RowNum + 1, 4) Then
'move attribute 2 up next to attribute 1 and delete empty line
Cells(RowNum + 1, 3).Copy Destination:=Cells(RowNum, 3)
Rows(RowNum + 1).EntireRow.Delete
End If
End If
End With
'increase rownum for next test
RowNum = RowNum + 1
Next Row
'turn on screen updating
Application.ScreenUpdating = True
End Sub
Isso será executado em uma planilha classificada e combinará linhas consecutivas que correspondem ao cliente e ao ano e excluirão a linha agora vazia. A planilha deve ser classificada da maneira que você a apresentou, clientes e anos subindo; essa macro em particular não ficará além das linhas consecutivas .
Editar - é perfeitamente possível que o meu with statement
seja completamente desnecessário, mas não está machucando ninguém.
REVISITADO 28/02/14
Alguém usou essa resposta em outra pergunta e, quando voltei, achei esse VBA ruim. Eu refeito -
Sub CombineRowsRevisited()
Dim c As Range
Dim i As Integer
For Each c In Range("A2", Cells(Cells.SpecialCells(xlCellTypeLastCell).Row, 1))
If c = c.Offset(1) And c.Offset(,4) = c.Offset(1,4) Then
c.Offset(,3) = c.Offset(1,3)
c.Offset(1).EntireRow.Delete
End If
Next
End Sub
Revisitado em 05/04/16
Perguntado novamente Como combinar valores de várias linhas em uma única linha? Tenha um módulo, mas precisa das variáveis explicando e, novamente, é muito ruim.
Sub CombineRowsRevisitedAgain()
Dim myCell As Range
Dim lastRow As Long
lastRow = Cells(Rows.Count, "A").End(xlUp).Row
For Each myCell In Range(Cells("A2"), Cells(lastRow, 1))
If (myCell = myCell.Offset(1)) And (myCell.Offset(0, 4) = myCell.Offset(1, 4)) Then
myCell.Offset(0, 3) = myCell.Offset(1, 3)
myCell.Offset(1).EntireRow.Delete
End If
Next
End Sub
No entanto, dependendo do problema, pode ser melhor step -1
inserir um número de linha para que nada seja ignorado.
Sub CombineRowsRevisitedStep()
Dim currentRow As Long
Dim lastRow As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
For currentRow = lastRow To 2 Step -1
If Cells(currentRow, 1) = Cells(currentRow - 1, 1) And _
Cells(currentRow, 4) = Cells(currentRow - 1, 4) Then
Cells(currentRow - 1, 3) = Cells(currentRow, 3)
Rows(currentRow).EntireRow.Delete
End If
Next
End Sub
A maneira mais eficaz de fazer isso é despejar todos os dados em uma Tabela Dinâmica e soltar 'Cliente' nos Rótulos das Linhas e, em seguida, acompanhar as outras colunas. Você pode soltar o 'Ano' no cabeçalho da coluna, se quiser ver o detalhamento por ano
Tabelas dinâmicas podem ser encontradas em Inserir no Excel 2010
fonte
Aqui estão as etapas para criar uma tabela separada com os dados condensados.
Customer
eYear
. Isso fornecerá a estrutura para a tabela condensada.Em B2 (a primeira entrada para
Value A
), digite o seguinte:=IFERROR(INDEX(Sheet1!B$1:B$11,MIN(IF(Sheet1!$A$1:$A$11=$A2,IF(Sheet1!$D$1:$D$11=$D2,IF(Sheet1!B$1:B$11<>"",ROW(Sheet1!$A$1:$A$11),1000000),1000000),1000000))),"")
Digite a fórmula como uma fórmula de matriz pressionando Ctrl+ Shift+ Enter.
Preencha a fórmula na coluna. Em seguida, preencha para preencher a
Value B
coluna também. Voila!Algumas notas:
1000000
s na fórmula para algo maior que o seu número de linhas.fonte
Todo mundo está usando muito código VBA ou funções complicadas para isso. Eu tenho um método que leva um segundo para implementar, mas é muito mais compreensível e muito fácil de ajustar, dependendo de várias outras possibilidades.
No exemplo que você deu acima, cole estas (4) funções nas células E2, F2, G2 e H2, respectivamente (as funções F&G referenciam as células acima):
Arraste essas fórmulas o mais para baixo, conforme necessário. Ele gera uma única linha de dados cada vez que duas linhas estão presentes, deixando as linhas únicas não afetadas. Cole os valores especiais (para remover as fórmulas) das colunas EFGH em outro lugar e os classifique por cliente para remover todas as linhas extras.
fonte