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

10

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

wprowadź opis zdjęcia tutaj

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

W niektórych przypadkach nie ma wartości A ani wartości B. W powyższym przykładzie widać, że klient 1 nie ma wartości B w 2011 r., Więc nie wygenerowano dla tego wiersza. I chociaż nie przedstawiono tego w przykładzie, niektórzy klienci nie będą mieli danych dla żadnej wartości w ciągu roku (a zatem nie będzie wiersza dla tego klienta w tym roku). W tej sytuacji brak wiersza dla tego klienta w tym roku jest w porządku.

Chcę umieścić to w arkuszu, w którym jest jeden wiersz dla obu wartości dla każdego roku i klienta. Tzn. Chcę, aby dane wyglądały tak:

wprowadź opis zdjęcia tutaj

Jaki jest najskuteczniejszy sposób na osiągnięcie tego wyniku?

Greg R.
źródło

Odpowiedzi:

6

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 - modulei 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 statementjest 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 -1numer 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
Raystafarian
źródło
2

Inna opcja:

  1. Wybierz kolumnę B, naciśnij CTRL+G-> Special-> Blanks->OK
  2. Wpisz następnie =naciśnijCTRL+ENTER
  3. Wybierz kolumnę C, naciśnij CTRL+G-> Special-> Blanks->OK
  4. Wpisz =IF(prasy typu =prasa prasa typu ,naciśnij typ ,0)następnieCTRL+ENTER
  5. Wybierz wszystkie dane CopyiPaste Special as Values
  6. Usuń duplikaty.

EDYTOWAĆ:

Objaśnienie: Próbuję skorzystać z opcji GoTo Blanks . Po wybraniu spacji możesz wprowadzić tę samą formułę dla wszystkich wybranych pustych komórek. Jeśli chodzi o pytanie OP, dane wyglądają, jakby miały spójne puste miejsca, tj .: Value Apuste kolumny mają to samo, CustomerIDco powyżej niepustego wiersza. W ten sam sposób Value Bpuste kolumny mają to samo, CustomerIDco poniżej niepustego wiersza.

zx8754
źródło
Witaj Zx8754. Czy mógłbyś dodać wyjaśnienia, na czym polega twoje rozwiązanie?
nixda
@nixda Wyjaśnienie dodano, przepraszam, że kroki były wystarczająco jasne.
zx8754
0

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

xXPhenom22Xx
źródło
Wystąpią problemy z komórkami, które nie mają wartości w kolumnie B, ponieważ Excel nie będzie w stanie wiedzieć, że wartości w B2 i B3 są w jakiś sposób powiązane.
xXPhenom22Xx
Wprawdzie mam niewielkie doświadczenie z tabelami przestawnymi, ale nie sądzę, że tabele przestawne rozwiązują mój problem. Chcę danych dla wszystkich wartości dla klienta w jednym wierszu rocznie, abym mógł nimi manipulować (np. Utworzyć kolumnę z wartością A + wartością B), a nie tylko zmieniać sposób wyświetlania jej za pomocą tabeli przestawnej. Dosłownie chcę, aby dane były ułożone w inny sposób w arkuszu.
Greg R.
Tak, byłoby ciężko, chyba że zawsze masz naprzemienne kolumny z brakującymi danymi, tak jak w przykładzie. Jeśli tak nie jest, to nie ma sposobu, aby Excel logicznie zrobił to, co chcesz.
xXPhenom22Xx
Greg - możesz rozwiązać problem w ten sposób: gdy znajdzie się w tabeli przestawnej w żądanym formacie, skopiuj go z tabeli przestawnej w inne miejsce (ten sam arkusz lub inny) - a następnie możesz nim manipulować w dowolny sposób , w tym dodawanie kolumn, wzorów itp.
yosh m
0

Oto kroki tworzenia oddzielnej tabeli ze skondensowanymi danymi.

  1. Skopiuj cały stół i wklej go na nowy arkusz.
  2. Wybierz nową tabelę i Usuń duplikaty (wstążka danych -> Usuń duplikaty) w kolumnach Customeri Year. Zapewni to ramy dla tabeli skondensowanej.
  3. 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.

  4. Wypełnij formułę w dół kolumny. Następnie wypełnij, aby wypełnić również Value Bkolumnę. Voila!

Kilka uwag:

  • Będziesz oczywiście musiał dostosować adresy do swoich danych. W celach informacyjnych Arkusz 1 to oryginalne dane w kolumnach od A do D.
  • Zakładam, że Twoje dane (lub nagłówki) zaczynają się od wiersza 1. Prawdopodobnie jest to prawdą, jeśli jest to zrzut danych. Formuła będzie musiała zostać dostosowana, jeśli tak nie jest.
  • Zakładam, że twoja tabela ma mniej niż milion wierszy. Jeśli masz coś więcej, zmień 1000000s w formule na coś większego niż liczba wierszy.
  • Jeśli twoja tabela ma wiele tysięcy wierszy (100 000+), możesz rozważyć zastosowanie rozwiązania VBA, ponieważ formuły tablicowe mogą zostać zapchane dużymi tablicami.
Excellll
źródło
0

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):

=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, 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.

Życzliwy
źródło