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