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

10

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

insira a descrição da imagem aqui

Estou preso a uma linha do Cliente 1 para o Valor A em 2009 e uma linha separada para o Valor B para o mesmo cliente no mesmo ano.

Em alguns casos, não há Valor A ou Valor B. No exemplo acima, você pode ver que o Cliente 1 não possui Valor B em 2011, portanto, nenhuma linha foi gerada para isso. E, embora não representados no exemplo, alguns clientes não terão dados para nenhum valor em um ano (e, portanto, nenhuma linha para esse cliente naquele ano). Nessa situação, a falta de uma linha para esse cliente nesse ano é boa.

Quero colocar isso em uma planilha em que há uma linha para os valores de cada ano e cliente. Ou seja, quero que os dados sejam assim:

insira a descrição da imagem aqui

Qual é a maneira mais eficaz de criar esse resultado?

Greg R.
fonte

Respostas:

6

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 - modulee 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 statementseja 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 -1inserir 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
Raystafarian
fonte
2

Outra opção:

  1. Selecione a Coluna B, pressione CTRL+G-> Special-> Blanks->OK
  2. Digite =pressione , depoisCTRL+ENTER
  3. Selecione a coluna C, pressione CTRL+G-> Special-> Blanks->OK
  4. Digite =IF(imprensa Tipo de =imprensa de imprensa Tipo de ,imprensa tipo ,0), em seguida,CTRL+ENTER
  5. Selecione todos os dados CopyeePaste Special as Values
  6. Remova duplicatas.

EDITAR:

Explicação: Estou tentando fazer uso da opção GoTo Blanks . Depois de selecionar os espaços em branco, você poderá inserir a mesma fórmula para todas as células em branco selecionadas. Em relação à pergunta do OP, os dados parecem ter espaços em branco consistentes , ou seja: Value Aespaços em branco da coluna têm o mesmo CustomerIDque a linha não em branco acima. Da mesma forma Value B, os espaços em branco da coluna têm o mesmo valor CustomerIDabaixo da linha não vazia.

zx8754
fonte
Olá zx8754. Você poderia adicionar algumas explicações sobre qual é a idéia por trás da sua solução?
Nixda 17/07/2013
@ nixda Explicação adicionada, desculpe-me por as etapas serem claras o suficiente.
Zx8754 17/07/2013
0

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

xXPhenom22Xx
fonte
Você encontrará problemas com células que não têm valor na coluna B porque o Excel não tem como saber que o valor em B2 e B3 está relacionado de alguma forma.
xXPhenom22Xx
É certo que tenho pouca experiência com tabelas dinâmicas, mas não acho que as tabelas dinâmicas resolvam o problema que tenho. Quero os dados de todos os valores de um cliente em uma linha por ano para que eu possa manipulá-los (por exemplo, crie uma coluna adicionando Valor A + Valor B), e não apenas altere a maneira como os visualizo por meio de uma Tabela Dinâmica. Eu literalmente quero que os dados sejam estruturados de maneira diferente na planilha.
Greg R.
Sim, seria difícil, a menos que você sempre tenha colunas alternadas com dados ausentes, como no exemplo. Se esse não for o caso, não há como o Excel fazer logicamente o que você deseja.
XXPhenom22Xx
Greg - você pode resolver o problema da seguinte maneira: quando estiver na tabela dinâmica no formato desejado, copie-o da tabela dinâmica para outro local (mesma folha ou outra) - e então poderá manipulá-lo da maneira que desejar , incluindo adicionar colunas, fórmulas etc.
yosh m 28/02
0

Aqui estão as etapas 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 Customere 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))),"")

    Digite a fórmula como uma fórmula de matriz pressionando Ctrl+ Shift+ Enter.

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

Algumas notas:

  • Obviamente, você precisará ajustar os endereços para ajustar seus dados. Para referência, Sheet1 são os dados originais nas colunas A a D.
  • Presumo que seus dados (ou cabeçalhos) iniciem na Linha 1. Isso provavelmente é verdade se for um despejo de dados. A fórmula terá que ser ajustada se não for esse o caso.
  • Suponho que sua tabela tenha menos de um milhão de linhas. Se, de alguma forma, você tiver mais do que isso, altere os 1000000s na fórmula para algo maior que o seu número de linhas.
  • Se sua tabela tiver muitos milhares de linhas (mais de 100.000), convém usar uma solução VBA, pois as fórmulas de matriz podem ficar atoladas em matrizes grandes.
Excellll
fonte
0

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):

=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 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.

Kindlin
fonte