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 - module
diesen 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 statement
vö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 -1
eine 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
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
quelle
Hier finden Sie Schritte zum Erstellen einer separaten Tabelle mit den komprimierten Daten.
Customer
undYear
. Dies bildet den Rahmen für die komprimierte Tabelle.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.
Füllen Sie die Formel in der Spalte aus. Füllen Sie dann über, um auch die
Value B
Spalte zu füllen . Voila!Ein paar Anmerkungen:
1000000
s in der Formel in etwas, das größer als Ihre Anzahl von Zeilen ist.quelle
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):
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.
quelle