To jest VBA lub makro, które możesz uruchomić na swoim arkuszu. Musisz nacisnąć alt+, F11aby wyświetlić monit Visual Basic for Application, przejdź do skoroszytu right click - insert - module
i wklej tam ten kod. Następnie możesz uruchomić moduł z poziomu VBA, naciskając F5. To makro nosi nazwę „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
Spowoduje to przejście przez posortowany arkusz kalkulacyjny i połączenie kolejnych wierszy pasujących zarówno do klienta, jak i roku, i usunięcie pustego teraz wiersza. Arkusz kalkulacyjny musi być posortowany w sposób, w jaki go przedstawiłeś, klientów i kolejnych lat, to konkretne makro nie będzie wykraczać poza kolejne wiersze .
Edytuj - to całkiem możliwe, że mój with statement
jest całkowicie niepotrzebny, ale nikomu nie szkodzi ...
ZMIENIONO 28.02.14
Ktoś użył tej odpowiedzi w innym pytaniu, a kiedy wróciłem, pomyślałem, że VBA jest kiepski. Ponownie to zrobiłem -
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
Ponownie odwiedzono 05/04/16
Ponownie zadane pytanie Jak połączyć wartości z wielu wierszy w jeden wiersz? Posiadaj moduł, ale potrzebujesz wyjaśnień zmiennych i znowu jest dość ubogi.
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
Jednak w zależności od problemu lepszym rozwiązaniem może być step -1
numer wiersza, aby nic nie zostało pominięte.
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
Najskuteczniejszym sposobem na to jest zrzucenie wszystkich danych do tabeli przestawnej i upuszczenie „klienta” w etykietach wierszy, a następnie sprawdzenie pozostałych kolumn. Możesz upuścić „Rok” w nagłówku kolumny, jeśli chcesz zobaczyć podział według roku
Tabele przestawne można znaleźć w obszarze Wstaw w programie Excel 2010
źródło
Oto kroki tworzenia oddzielnej tabeli ze skondensowanymi danymi.
Customer
iYear
. Zapewni to ramy dla tabeli skondensowanej.W polu B2 (pierwszy wpis dla
Value A
) wprowadź następujące dane:=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))),"")
Wprowadź formułę jako formułę tablicową, naciskając Ctrl+ Shift+ Enter.
Wypełnij formułę w dół kolumny. Następnie wypełnij, aby wypełnić również
Value B
kolumnę. Voila!Kilka uwag:
1000000
s w formule na coś większego niż liczba wierszy.źródło
Każdy używa do tego dużo kodu VBA lub skomplikowanych funkcji. Mam metodę, której wdrożenie zajmuje sekundę, ale jest o wiele bardziej zrozumiała i bardzo łatwa do dostosowania w zależności od różnych innych możliwości.
W podanym powyżej przykładzie wklej te (4) funkcje odpowiednio do komórek: E2, F2, G2 i H2 (komórki referencyjne funkcji F&G powyżej):
Przeciągnij te formuły tak daleko, jak to konieczne. Generuje pojedynczy wiersz danych za każdym razem, gdy obecne są 2 wiersze, pozostawiając niezmienione pojedyncze wiersze. Wklej specjalnie wartości (w celu usunięcia formuł) kolumn EFGH w innym miejscu i posortuj je według klienta, aby usunąć wszystkie dodatkowe wiersze.
źródło