Wie kombiniere ich Werte aus mehreren Zeilen in einer einzigen Zeile in Excel?


10

Ich habe einen Datendump in Excel, der aus jährlichen Kundendaten für zwei verschiedene Werte besteht. Die Daten wurden mit einer separaten Wertzeile für jedes Jahr und jeden Kunden versehen. Dh es sieht so aus:

Geben Sie hier die Bildbeschreibung ein

Ich habe 2009 eine Zeile für Kunde 1 für Wert A und eine separate Zeile für Wert B für denselben Kunden im selben Jahr.

In einigen Fällen gibt es keinen Wert A oder Wert B. Im obigen Beispiel können Sie sehen, dass Kunde 1 2011 keinen Wert B hat, daher wurde dafür keine Zeile generiert. Und obwohl im Beispiel nicht dargestellt, haben einige Kunden in keinem Jahr Daten für einen der beiden Werte (und daher in diesem Jahr keine Zeile für diesen Kunden). In dieser Situation ist es in Ordnung, in diesem Jahr keine Zeile für diesen Kunden zu haben.

Ich möchte dies in ein Arbeitsblatt aufnehmen, in dem für jedes Jahr und jeden Kunden eine Zeile für beide Werte vorhanden ist. Das heißt, ich möchte, dass die Daten so aussehen:

Geben Sie hier die Bildbeschreibung ein

Was ist der effektivste Weg, um dieses Ergebnis zu erzielen?

Antworten:


6

Dies ist VBA oder ein Makro, das Sie auf Ihrem Blatt ausführen können. Sie müssen alt+ F11drücken, um die Eingabeaufforderung von Visual Basic für Anwendung aufzurufen, zu Ihrer Arbeitsmappe zu wechseln und right click - insert - modulediesen Code dort einzufügen . Sie können das Modul dann in VBA ausführen, indem Sie auf drücken F5. Dieses Makro heißt "Test"

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

Dies durchläuft eine sortierte Tabelle und kombiniert aufeinanderfolgende Zeilen , die sowohl dem Kunden als auch dem Jahr entsprechen, und löscht die jetzt leere Zeile. Die Tabelle muss so sortiert sein, wie Sie sie präsentiert haben, Kunden und Jahre aufsteigend. Dieses spezielle Makro sieht nicht über aufeinanderfolgende Zeilen hinaus aus .

Bearbeiten - es ist durchaus möglich, dass ich with statementvöllig unnötig bin , aber es tut niemandem weh.

ÜBERARBEITET 28.02.14

Jemand hat diese Antwort in einer anderen Frage verwendet, und als ich zurückkam, fand ich diesen VBA arm. Ich habe es überarbeitet -

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

Überarbeitet am 04.05.16

Nochmals gefragt Wie kombiniere ich Werte aus mehreren Zeilen in einer einzigen Zeile? Haben Sie ein Modul, aber brauchen Sie die Variablen zu erklären und wieder ist es ziemlich schlecht.

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

Abhängig vom Problem ist es jedoch möglicherweise besser, step -1eine Zeilennummer anzugeben, damit nichts übersprungen wird.

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

2

Andere Option:

  1. Wählen Sie Spalte B aus und drücken Sie CTRL+G-> Special-> Blanks->OK
  2. Geben Sie =drücken , dannCTRL+ENTER
  3. Wählen Sie Spalte C aus und drücken Sie CTRL+G-> Special-> Blanks->OK
  4. Typ =IF(Presse Typ =Presse Presse Typ ,Presse Typ ,0)dannCTRL+ENTER
  5. Wählen Sie alle Daten und CopyundPaste Special as Values
  6. Duplikate entfernen.

BEARBEITEN:

Erläuterung: Ich versuche, die Option " GoTo-Leerzeichen " zu verwenden. Nachdem Sie Leerzeichen ausgewählt haben, können Sie für alle ausgewählten Leerzeichen dieselbe Formel eingeben. In Bezug auf die Frage von OP sehen die Daten so aus, als hätten sie konsistente Leerzeichen, dh: Value ASpalten-Leerzeichen haben die gleichen CustomerIDwie in der obigen nicht leeren Zeile. Auf die gleiche Weise haben Value BSpaltenrohlinge die gleichen CustomerIDwie unter nicht leeren Zeilen.


Hallo zx8754. Könnten Sie bitte einige Erklärungen hinzufügen, was die Idee hinter Ihrer Lösung ist?
Nixda

@nixda Erklärung hinzugefügt, sorry dachte, die Schritte waren klar genug.
zx8754

0

Der effektivste Weg, dies zu tun, besteht darin, alle Daten in eine Pivot-Tabelle zu kopieren und "Kunde" in Zeilenbeschriftungen abzulegen und dann die anderen Spalten zu verfolgen. Sie können das 'Jahr' in die Spaltenüberschrift einfügen, wenn Sie die Aufschlüsselung nach Jahr anzeigen möchten

Pivot-Tabellen finden Sie unter In Excel 2010 einfügen


Sie werden jedoch auf Probleme mit Zellen stoßen, die keinen Wert in Spalte B haben, da Excel nicht wissen kann, dass der Wert in B2 und B3 in irgendeiner Weise zusammenhängt.
xXPhenom22Xx

Ich habe zwar wenig Erfahrung mit Pivot-Tabellen, aber ich glaube nicht, dass Pivot-Tabellen das Problem lösen, das ich habe. Ich möchte die Daten für alle Werte für einen Kunden in einer Zeile pro Jahr, damit ich sie bearbeiten kann (z. B. eine Spalte erstellen, die Wert A + Wert B hinzufügt), und nicht nur ändern, wie ich sie über eine Pivot-Tabelle ansehe. Ich möchte buchstäblich, dass die Daten im Arbeitsblatt anders strukturiert sind.
Greg R.

Ja, es wäre schwierig, wenn Sie nicht immer abwechselnde Spalten mit fehlenden Daten hätten, wie Sie es im Beispiel tun. Wenn dies nicht der Fall ist, gibt es für Excel keine Möglichkeit, logisch das zu tun, was Sie möchten.
xXPhenom22Xx

Greg - Sie können das Problem folgendermaßen lösen: Sobald es sich in dem gewünschten Format in der Pivot-Tabelle befindet, kopieren Sie es aus der Pivot-Tabelle an einen anderen Ort (dasselbe Blatt oder ein anderes) - und bearbeiten Sie es dann nach Belieben , einschließlich Hinzufügen von Spalten, Formeln usw.
yosh m

0

Hier finden Sie Schritte zum Erstellen einer separaten Tabelle mit den komprimierten Daten.

  1. Kopieren Sie Ihre gesamte Tabelle und fügen Sie sie in ein neues Blatt ein.
  2. Wählen Sie Ihre neue Tabelle aus und entfernen Sie Duplikate (Datenband -> Duplikate entfernen) in den Spalten Customerund Year. Dies bildet den Rahmen für die komprimierte Tabelle.
  3. Geben Sie in B2 (der erste Eintrag für Value A) Folgendes ein:

    =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))),"")

    Geben Sie die Formel als Array-Formel ein, indem Sie Ctrl+ Shift+ drücken Enter.

  4. Füllen Sie die Formel in der Spalte aus. Füllen Sie dann über, um auch die Value BSpalte zu füllen . Voila!

Ein paar Anmerkungen:

  • Natürlich müssen Sie die Adressen an Ihre Daten anpassen. Als Referenz ist Sheet1 die Originaldaten in den Spalten A bis D.
  • Ich gehe davon aus, dass Ihre Daten (oder Header) in Zeile 1 beginnen. Dies ist wahrscheinlich der Fall, wenn es sich um einen Datendump handelt. Die Formel muss angepasst werden, wenn dies nicht der Fall ist.
  • Ich gehe davon aus, dass Ihre Tabelle weniger als eine Million Zeilen enthält. Wenn Sie irgendwie mehr als das haben, ändern Sie das 1000000s in der Formel in etwas, das größer als Ihre Anzahl von Zeilen ist.
  • Wenn Ihre Tabelle viele tausend Zeilen (100.000+) enthält, sollten Sie stattdessen eine VBA-Lösung verwenden, da Array-Formeln mit großen Arrays überlastet sein können.

0

Jeder verwendet dafür viel VBA-Code oder komplizierte Funktionen. Ich habe eine Methode, deren Implementierung eine Sekunde dauert, die jedoch weitaus verständlicher und je nach verschiedenen anderen Möglichkeiten sehr einfach anzupassen ist.

Fügen Sie in dem oben angegebenen Beispiel diese (4) Funktionen in die Zellen E2, F2, G2 bzw. H2 ein (die Referenzzellen für die F & G-Funktionen oben):

=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,            ""))

Ziehen Sie diese Formeln so weit wie nötig nach unten. Jedes Mal, wenn 2 Zeilen vorhanden sind, wird eine einzelne Datenzeile generiert, sodass einzelne Zeilen davon nicht betroffen sind. Fügen Sie die Werte (um die Formeln zu entfernen) der Spalten EFGH an einer anderen Stelle ein und sortieren Sie sie nach Kunden, um alle zusätzlichen Zeilen zu entfernen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.