2012-02-28 22:05:49 +0000 2012-02-28 22:05:49 +0000
10
10

Wie kann man in Excel Werte aus mehreren Zeilen in einer einzigen Zeile kombinieren?

Ich habe einen Datenabzug in Excel, der aus jährlichen Kundendaten für zwei verschiedene Werte besteht. Die Daten wurden mit einer separaten Zeile für den Wert für jedes Jahr und jeden Kunden versehen. D.h. es sieht folgendermaßen aus:

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

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

Ich möchte dies in ein Arbeitsblatt bringen, in dem es eine Zeile für beide Werte für jedes Jahr und jeden Kunden gibt. D.h., die Daten sollen wie folgt aussehen:

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

Antworten (5)

6
6
6
2012-02-29 12:18:49 +0000

Dies ist VBA, oder ein Makro, das Sie auf Ihrem Blatt ausführen können. Sie müssen alt+F11 drücken, um die Visual Basic for Application-Eingabeaufforderung aufzurufen, zu Ihrer Arbeitsmappe und right click - insert - module gehen und diesen Code dort einfügen. Sie können das Modul dann aus VBA heraus ausführen, indem Sie F5 drücken. 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

Es durchläuft ein sortiertes Tabellenblatt und kombiniert aufeinanderfolgende Zeilen, die sowohl mit dem Kunden als auch mit dem Jahr übereinstimmen, und löscht die nun leere Zeile. Das Tabellenblatt muss so sortiert sein, wie Sie es vorgelegt haben, Kunden und Jahre aufsteigend, dieses spezielle Makro schaut nicht über aufeinanderfolgende Zeilen hinaus.

Bearbeiten - es ist durchaus möglich, dass mein with statement völlig überflüssig ist, aber es tut niemandem weh…

REVISITED 02/28/14

Jemand hat diese Antwort in einer anderen Frage verwendet und als ich zurückging, fand ich diese VBA schlecht. Ich habe es neu gemacht -

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

Revisited 05/04/16

Erneut gefragt Wie kombiniert man Werte aus mehreren Zeilen in einer einzigen Zeile? Habe ein Modul, brauche aber die Variablen zur Erklärung 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

Je nach Problem könnte es jedoch besser sein, step -1 auf eine Zeilennummer zu setzen, 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
2
2
2013-07-17 18:08:36 +0000

Eine andere Möglichkeit:

  1. Wählen Sie Spalte B, drücken Sie STRG+G -> Special-> Blanks -> OK
  2. Tippen Sie = drücken Sie ↑, dann STRG+ENTER
  3. Wählen Sie Spalte C, drücken Sie CTRL+G -> Special-> Blanks -> OK
  4. Tippen Sie =IF( drücken Sie ← tippen Sie = drücken Sie ← drücken Sie ↓ tippen Sie , drücken Sie ↓ tippen Sie ,0) dann CTRL+ENTER
  5. Alle Daten auswählen und Copy und Paste Special as Values
  6. Entfernen Sie Duplikate.

EDIT:

Erläuterung: Ich versuche, die Option GoTo Blanks zu nutzen. Wenn Sie Leerzeichen ausgewählt haben, können Sie die gleiche Formel für alle ausgewählten leeren Zellen eingeben. In Bezug auf die Frage des OPs sehen die Daten so aus, als hätten sie konsistente Leerzeichen, d. h.: Value A Spaltenleerzeichen haben das gleiche CustomerID wie die darüber liegende nicht-leere Zeile. Auf die gleiche Weise haben Value B Spaltenleerzeichen die gleichen CustomerID wie unter der nicht leeren Zeile.

0
0
0
2012-02-29 18:12:36 +0000

Hier sind die Schritte zum Erstellen einer separaten Tabelle mit den kondensierten 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 (Menüband Daten -> Duplikate entfernen) in den Spalten Customer und Year. Dadurch wird der Rahmen für die komprimierte Tabelle geschaffen.
  3. Geben Sie in B2 (dem ersten Eintrag für Value A) Folgendes ein:

  4. Füllen Sie die Formel unten in der Spalte aus. Füllen Sie anschließend auch die Spalte Value B aus. Voila!

Ein paar Hinweise:

  • Sie müssen die Adressen natürlich an Ihre Daten anpassen. Zur Orientierung: Blatt1 sind die Originaldaten in den Spalten A bis D.
  • Ich nehme an, dass Ihre Daten (oder Kopfzeilen) in Zeile 1 beginnen. Das ist wahrscheinlich richtig, wenn es sich um einen Daten-Dump handelt. Wenn dies nicht der Fall ist, muss die Formel angepasst werden.
  • Ich nehme an, dass Ihre Tabelle weniger als eine Million Zeilen hat. Wenn Sie irgendwie mehr als das haben, ändern Sie die 1000000s in der Formel in etwas, das größer ist als Ihre Zeilenzahl.
  • Wenn Ihre Tabelle viele tausend Zeilen hat (100.000+), sollten Sie stattdessen eine VBA-Lösung in Betracht ziehen, da Array-Formeln bei großen Arrays ins Stocken geraten können.
0
0
0
2016-07-15 16:44:30 +0000

Alle verwenden dafür eine Menge VBA-Code oder komplizierte Funktionen. Ich habe eine Methode, die zwar eine Sekunde für die Implementierung braucht, aber viel verständlicher ist und sehr einfach an verschiedene andere Möglichkeiten angepasst werden kann.

Fügen Sie im obigen Beispiel diese (4) Funktionen in die Zellen E2, F2, G2 bzw. H2 ein (die F&G-Funktionen referenzieren die Zellen 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 nach unten wie nötig. Es wird jeweils eine einzelne Datenzeile erzeugt, wenn 2 Zeilen vorhanden sind, wobei einzelne Zeilen unberührt bleiben. Fügen Sie speziell die Werte (zum Entfernen der Formeln) der Spalten E-F-G-H an anderer Stelle ein und sortieren Sie sie nach Kunden, um alle zusätzlichen Zeilen zu entfernen.

0
0
0
2012-02-28 22:15:04 +0000

Am effektivsten ist es, alle Daten in eine Pivot-Tabelle zu übertragen und “Kunde” in die Zeilenbeschriftung fallen zu lassen und dann mit den anderen Spalten fortzufahren. Sie können das ‘Jahr’ in der Spaltenüberschrift fallen lassen, wenn Sie die Aufschlüsselung nach Jahr sehen möchten

Pivot-Tabellen finden Sie unter Einfügen in Excel 2010