Como combinar valores de várias linhas em uma única linha no Excel?

10

Eu tenho um dump de dados no Excel que consiste em dados anuais do cliente para dois valores diferentes. Os dados foram fornecidos com uma linha separada de valor para cada ano e cliente. Ou seja parece assim:

EstoupresoaumalinhaparaoCliente1paraoValorAem2009eumalinhaseparadaparaoValorBparaomesmoclientenomesmoano.

Emalgunscasos,nãoháValorAouValorB.Noexemploacima,vocêpodeverqueoCliente1nãopossuioValorBem2011,portanto,nenhumalinhafoigeradaparaisso.E,emboranãorepresentadonoexemplo,algunsclientesnãoterãodadosparanenhumvaloremumano(e,portanto,nenhumalinhaparaesseclientenaqueleano).Nessasituação,afaltadeumalinhaparaesseclientenaqueleanoéboa.

Euquerocolocarissoemumaplanilhaondeháumalinhaparaosvaloresambosparacadaanoecliente.Ouseja,queroqueosdadostenhamestaaparência:

Qual é a maneira mais eficaz de criar esse resultado?

    
por Greg R. 28.02.2012 / 23:05

5 respostas

6

Este é o VBA ou uma macro que você pode executar na sua planilha. Você deve pressionar alt + F11 para abrir o prompt do Visual Basic for Application, vá para sua pasta de trabalho e right click - insert - module e cole este código lá. Você pode então executar o módulo a partir do VBA pressionando F5 . Esta macro é denominada "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á a linha agora vazia. A planilha deve ser classificada da maneira que você a apresentou, clientes e anos em ascensão, essa macro em particular não vai olhar além das linhas consecutivas .

Editar - é totalmente possível que meu with statement seja completamente desnecessário, mas não está prejudicando ninguém ..

REVISITADO em 28/02/14

Alguém usou essa resposta em outro pergunta e quando voltei achei esse VBA pobre. Eu refiz isso -

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 05/04/16

Perguntado novamente Como combinar valores de várias linhas em uma única linha? Tem 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, talvez seja melhor usar step -1 em 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
    
por 29.02.2012 / 13:18
2

Outra opção:

  1. Selecione a coluna B, pressione CTRL + G - > Special - > Blanks - > %código%
  2. Digite OK press e, em seguida, CTRL + ENTER
  3. Selecione a coluna C, pressione CTRL + G - > = - > Special - > %código%
  4. Digite Blanks press tipo OK press pressione tipo =IF( press = então CTRL + ENTER
  5. Selecione todos os dados e , e ,0)
  6. Remover duplicatas.

EDITAR:

Explicação: Estou tentando usar Ir para espaços em branco opção. Depois de selecionar os espaços em branco, você poderá inserir a mesma fórmula para todas as células em branco selecionadas. Com relação à pergunta do OP, os dados parecem ter espaços em branco consistentes , ou seja,% de espaços em branco da colunaCopy têm o mesmo Paste Special as Values da linha não-vazia em branco. Da mesma forma, Value A de espaços em branco da coluna têm o mesmo CustomerID abaixo da linha não vazia.

    
por 17.07.2013 / 20:08
0

A maneira mais eficaz de fazer isso é despejar todos os dados em uma Tabela Dinâmica e soltar 'Cliente' em Rótulos de Linha e, em seguida, acompanhar as outras colunas. Você pode soltar o "Ano" no cabeçalho da coluna se quiser ver a divisão por ano

Tabelas dinâmicas podem ser encontradas em Inserir no Excel 2010

    
por 28.02.2012 / 23:15
0

Aqui estão os passos para criar uma tabela separada com os dados condensados.

  1. Copie sua tabela inteira e cole-a em uma nova planilha.
  2. Selecione sua nova tabela e Remover duplicatas (Faixa de dados - > Remover duplicatas) nas colunas Customer e Year . Isso fornecerá a estrutura para a tabela condensada.
  3. 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))),"")

    Insira a fórmula como uma fórmula de matriz pressionando Ctrl + Deslocamento + Enter .

  4. Preencha a fórmula na coluna. Em seguida, preencha para preencher também a coluna Value B . Voila!

Algumas notas:

  • É claro que você precisa ajustar os endereços para ajustar seus dados. Para referência, Sheet1 são os dados originais nas colunas A a D.
  • Estou supondo que seus dados (ou cabeçalhos) iniciem na Linha 1. Isso provavelmente será verdadeiro se esse for um despejo de dados. A fórmula terá que ser ajustada se não for o caso.
  • Estou supondo que sua tabela tenha menos de um milhão de linhas. Se você tiver mais do que isso, altere o 1000000 s na fórmula para algo maior que o número de linhas.
  • Se a sua tabela tiver muitas mil linhas (mais de 100.000), convém considerar o uso de uma solução VBA, pois as fórmulas de matriz podem ficar sobrecarregadas com grandes matrizes.
por 29.02.2012 / 19:12
0

Todos estão 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 essas (4) funções nas células, E2, F2, G2 e H2, respectivamente (as células de referência das funções F & G acima):

=IF(D2=D3, A2,         IF(D2<>D1, A2,            ""))    
=IF(D2=D3, MAX(B2:B3), IF(D2<>D1, B2,            ""))    
=IF(D2=D3, MAX(B2:B3), IF(D2<>D1, IF(C2=0,"",C2),""))    
=IF(D2=D3, D2,         IF(D2<>D1, D2,            ""))

Arraste essas fórmulas até o limite necessário. Ele gera uma única linha de dados cada vez que duas linhas estão presentes, deixando linhas únicas inalteradas. Cole os valores especiais (para remover as fórmulas) das colunas E-F-G-H em outro lugar e ordene-os pelo cliente para remover todas as linhas extras.

    
por 15.07.2016 / 18:44