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

Jak połączyć wartości z wielu wierszy w jeden wiersz w Excelu?

Mam zrzut danych w programie Excel, który składa się z rocznych danych klienta dla dwóch różnych wartości. Dane zostały dostarczone z oddzielnym wierszem dla wartości dla każdego roku i klienta. Tzn. wygląda to tak:

Utknąłem z wierszem dla klienta 1 dla wartości A w 2009 roku i oddzielnym wierszem dla wartości B dla tego samego klienta w tym samym roku.

W niektórych przypadkach nie ma wartości A lub wartości B. W powyższym przykładzie widać, że klient 1 nie ma wartości B w 2011 roku, więc nie został wygenerowany żaden wiersz dla tego klienta. Ponadto, choć nie jest to przedstawione w przykładzie, niektórzy klienci nie mają danych dla żadnej z wartości w danym roku (a tym samym nie ma wiersza dla tego klienta w danym roku). W takiej sytuacji, brak wiersza dla tego klienta w tym roku jest w porządku.

Chcę to przenieść do arkusza, w którym jest jeden wiersz dla obu wartości dla każdego roku i klienta. Tzn. Chcę, aby dane wyglądały w ten sposób:

Jaki jest najbardziej efektywny sposób na stworzenie takiego wyniku?

Odpowiedzi (5)

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

To jest VBA, czyli makro, które możesz uruchomić na swoim arkuszu. Musisz nacisnąć alt+F11, aby wywołać monit Visual Basic for Application, przejść do swojego skoroszytu i right click - insert - module i wkleić tam ten kod. Następnie możesz uruchomić moduł z poziomu VBA, naciskając klawisz F5. Makro to 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

Przejdzie ono przez posortowany arkusz kalkulacyjny i połączy kolejne wiersze, które pasują zarówno do klienta, jak i roku, a następnie usunie pusty wiersz. Arkusz musi być posortowany w sposób, w jaki go przedstawiłeś, klienci i lata rosnąco, to konkretne makro nie będzie patrzyło poza kolejne wiersze.

Edycja - bardzo możliwe, że moje with statement jest zupełnie niepotrzebne, ale nikomu nie szkodzi…

REVISITED 02/28/14

Ktoś użył tej odpowiedzi w innym pytaniu i kiedy się cofnąłem, pomyślałem, że to VBA biedne. Zrobiłem to od nowa -

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

Zapytany ponownie Jak połączyć wartości z wielu wierszy w jeden wiersz? Mam moduł, ale potrzebuję zmiennych objaśniających i znowu jest to dość ubogie.

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, może być lepiej step -1 na numerze wiersza, więc nic nie zostanie 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
2
2
2
2013-07-17 18:08:36 +0000

Inna opcja:

  1. Zaznacz kolumnę B, naciśnij CTRL+G - Special - Blanks
  2. Wpisz OK naciśnij ↑, a następnie CTRL+ENTER
  3. Zaznacz kolumnę C, naciśnij CTRL+G - = - Special - Blanks
  4. Wpisz OK naciśnij ← wpisz =IF( naciśnij ← wpisz ↓ wpisz = naciśnij ↓ wpisz , następnie CTRL+ENTER
  5. Zaznacz wszystkie dane i ,0) oraz Copy
  6. Usuń duplikaty.

EDIT:

Wyjaśnienie: Próbuję wykorzystać opcję GoTo Blanks . Po wybraniu pustych komórek można wprowadzić tę samą formułę dla wszystkich wybranych pustych komórek. Jeśli chodzi o pytanie OP, dane wyglądają tak, jakby miały spójne puste komórki, tj.: puste komórki w kolumnach Paste Special as Values mają takie samo Value A jak w pustym wierszu powyżej. W ten sam sposób CustomerID kolumny puste mają takie samo Value B jak poniżej niepustego wiersza.

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

Oto kroki do stworzenia osobnej tabeli z zagęszczonymi danymi.

  1. Skopiuj całą swoją tabelę i wklej ją do nowego arkusza.
  2. Zaznacz swoją nową tabelę i usuń duplikaty (wstążka Dane -> Usuń duplikaty) w kolumnach Customer i Year. W ten sposób powstanie szkielet dla skondensowanej tabeli.
  3. W B2 (pierwsza pozycja dla Value A) wpisz następujące dane:

  4. Wypełnij formułę w dół kolumny. Następnie wypełnij również kolumnę Value B. Voila!

Kilka uwag:

  • Oczywiście będziesz musiał dostosować adresy, aby pasowały do Twoich danych. Dla odniesienia, Arkusz1 to oryginalne dane w kolumnach od A do D.
  • Zakładam, że twoje dane (lub nagłówki) zaczynają się od wiersza 1. Jest to prawdopodobnie prawda, jeśli jest to zrzut danych. Jeśli tak nie jest, formuła będzie musiała zostać dostosowana.
  • Zakładam, że twoja tabela ma mniej niż milion wierszy. Jeśli w jakiś sposób masz więcej niż to, zmień 1000000s w formule na coś większego niż twoja liczba wierszy.
  • Jeśli twoja tabela ma wiele tysięcy wierszy (100,000+), możesz rozważyć użycie rozwiązania VBA, ponieważ formuły tablicowe mogą utknąć w dużych tablicach.
0
0
0
2016-07-15 16:44:30 +0000

Wszyscy używają do tego wielu kodów VBA lub skomplikowanych funkcji. Ja mam metodę, której implementacja 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 przykładzie, który podałeś powyżej, wklej te (4) funkcje do komórek, odpowiednio, E2, F2, G2 i H2 (funkcje F&G odnoszą się do komórek powyżej):

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

Przeciągnij te formuły tak daleko w dół, jak to konieczne. Generuje to pojedynczy wiersz danych za każdym razem, gdy obecne są 2 wiersze, pozostawiając pojedyncze wiersze nienaruszone. Wklej specjalne wartości (aby usunąć formuły) z kolumn E-F-G-H w innym miejscu i posortuj je według klientów, aby usunąć wszystkie dodatkowe wiersze.

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

Najskuteczniejszym sposobem na to jest zrzucenie wszystkich danych do tabeli przestawnej i upuszczenie ‘Customer’ do Etykiety wiersza, a następnie kontynuowanie tego z innymi kolumnami. Możesz upuścić ‘Rok’ do nagłówka kolumny, jeśli chcesz zobaczyć podział na lata

Tabele przestawne można znaleźć w sekcji Wstawianie w Excelu 2010.