Làm cách nào để kết hợp các giá trị từ nhiều hàng thành một hàng trong Excel?


10

Tôi có kết xuất dữ liệu trong Excel bao gồm dữ liệu khách hàng hàng năm cho hai giá trị khác nhau. Dữ liệu được cung cấp một hàng riêng cho giá trị cho mỗi năm và khách hàng. Tức là nó trông như thế này:

nhập mô tả hình ảnh ở đây

Tôi bị mắc kẹt với một hàng cho Khách hàng 1 cho Giá trị A trong năm 2009 và một hàng riêng cho Giá trị B cho cùng một khách hàng trong cùng một năm.

Trong một số trường hợp không có Giá trị A hoặc Giá trị B. Trong ví dụ trên, bạn có thể thấy rằng Khách hàng 1 không có Giá trị B trong năm 2011, do đó không có hàng nào được tạo cho điều đó. Và, mặc dù không được trình bày trong ví dụ, một số khách hàng sẽ không có dữ liệu cho giá trị nào trong một năm (và do đó không có hàng cho khách hàng đó trong năm đó). Trong tình huống đó, thiếu một hàng cho khách hàng đó trong năm đó là ổn.

Tôi muốn đưa cái này vào một bảng tính trong đó có một hàng cho cả hai giá trị cho mỗi năm và khách hàng. Tức là tôi muốn dữ liệu trông như thế này:

nhập mô tả hình ảnh ở đây

Cách hiệu quả nhất để tạo ra kết quả đó là gì?

Câu trả lời:


6

Đây là VBA hoặc macro bạn có thể chạy trên trang tính của mình. Bạn phải nhấn alt+ F11để hiển thị dấu nhắc Visual Basic for Application, truy cập sổ làm việc của bạn right click - insert - modulevà dán mã này vào đó. Sau đó, bạn có thể chạy mô-đun từ bên trong VBA bằng cách nhấn F5. Macro này được đặt tên là "thử nghiệm"

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

Điều này sẽ chạy qua một bảng tính được sắp xếp và kết hợp các hàng liên tiếp phù hợp với cả khách hàng và năm và xóa hàng trống bây giờ. Bảng tính phải được sắp xếp theo cách bạn đã trình bày, khách hàng và năm tăng dần, macro cụ thể này sẽ không nhìn xa hơn các hàng liên tiếp .

Chỉnh sửa - hoàn toàn có thể tôi with statementhoàn toàn không cần thiết, nhưng nó không làm tổn thương bất cứ ai ..

DOANH THU 02/11/14

Ai đó đã sử dụng câu trả lời này trong một câu hỏi khác và khi tôi quay lại, tôi nghĩ rằng VBA này kém. Tôi đã làm lại nó -

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

Xem lại ngày 04/05/2016

Hỏi lại Làm thế nào để kết hợp các giá trị từ nhiều hàng thành một hàng? Có một mô-đun, nhưng cần các biến giải thích và một lần nữa, nó khá nghèo.

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

Tuy nhiên, tùy thuộc vào vấn đề, có thể tốt hơn là step -1trên một số hàng để không có gì bị bỏ qua.

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

Một lựa chọn khác:

  1. Chọn Cột B, nhấn CTRL+G-> Special-> Blanks->OK
  2. =bấm , sau đóCTRL+ENTER
  3. Chọn Cột C, nhấn CTRL+G-> Special-> Blanks->OK
  4. =IF(báo chí loại =báo chí báo chí loại ,báo chí kiểu ,0)rồiCTRL+ENTER
  5. Chọn tất cả dữ liệu CopyPaste Special as Values
  6. Loại bỏ các bản sao.

BIÊN TẬP:

Giải thích: Tôi đang cố gắng sử dụng tùy chọn GoTo Blanks . Khi bạn đã chọn khoảng trống, bạn có thể nhập cùng một công thức cho tất cả các ô trống đã chọn. Về câu hỏi của OP, dữ liệu trông giống như có khoảng trắng nhất quán , nghĩa là: Value Akhoảng trống cột có giống CustomerIDnhư hàng không trống ở trên. Trong cùng một cách các Value Bkhoảng trống cột có giống CustomerIDnhư bên dưới hàng không trống.


Xin chào zx8754. Bạn có thể vui lòng thêm một số giải thích ý tưởng đằng sau giải pháp của bạn là gì?
nixda

@nixda Giải thích thêm, xin lỗi nghĩ rằng các bước đã đủ rõ ràng.
zx8754

0

Cách hiệu quả nhất để thực hiện việc này là kết xuất tất cả dữ liệu vào Bảng Pivot và thả 'Khách hàng' vào Nhãn Hàng và sau đó theo dõi với các cột khác. Bạn có thể thả 'Năm' vào tiêu đề cột nếu bạn muốn xem phân tích theo năm

Bảng Pivot có thể được tìm thấy trong Chèn trong Excel 2010


Bạn sẽ gặp vấn đề mặc dù với các ô không có giá trị trong cột B vì Excel sẽ không có cách nào để biết rằng giá trị trong B2 và B3 có liên quan đến nhau.
xXPhenom22Xx

Tôi thừa nhận có ít kinh nghiệm với Bảng Pivot, nhưng tôi không nghĩ rằng Bảng Pivot giải quyết vấn đề tôi gặp phải. Tôi muốn dữ liệu cho tất cả các giá trị cho một khách hàng trong một hàng năm để tôi có thể thao tác với nó (ví dụ: tạo một cột thêm Giá trị A + Giá trị B), không chỉ thay đổi cách tôi xem nó thông qua Bảng Pivot. Tôi thực sự muốn dữ liệu có cấu trúc khác nhau trong bảng tính.
Greg R.

Yea sẽ khó khăn trừ khi bạn luôn có các cột xen kẽ với dữ liệu bị thiếu như bạn làm trong ví dụ. Nếu đây không phải là trường hợp thì không có cách nào để Excel thực hiện một cách hợp lý những gì bạn muốn.
xXPhenom22Xx

Greg - bạn có thể giải quyết vấn đề như vậy: một khi nó ở trong bảng trụ theo định dạng bạn muốn, hãy sao chép nó ra khỏi bảng xoay sang vị trí khác (cùng một trang hoặc một bảng khác) - và sau đó bạn có thể thao tác theo bất kỳ cách nào bạn muốn , bao gồm thêm các cột, công thức, v.v.
yosh m

0

Dưới đây là các bước để tạo một bảng riêng biệt với dữ liệu cô đọng.

  1. Sao chép toàn bộ bảng của bạn và dán nó vào một tờ mới.
  2. Chọn bảng mới của bạn và Xóa trùng lặp (Dải băng dữ liệu -> Xóa trùng lặp) trên các cột CustomerYear. Điều này sẽ cung cấp khung cho bảng cô đọng.
  3. Trong B2 (mục nhập đầu tiên cho Value A), nhập thông tin sau:

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

    Nhập công thức dưới dạng công thức mảng bằng cách nhấn Ctrl+ Shift+ Enter.

  4. Điền công thức xuống cột. Sau đó điền vào để điền vào Value Bcột là tốt. Voila!

Một vài lưu ý:

  • Tất nhiên bạn sẽ cần điều chỉnh các địa chỉ để phù hợp với dữ liệu của bạn. Để tham khảo, Sheet1 là dữ liệu gốc trong các cột từ A đến D.
  • Tôi giả sử dữ liệu của bạn (hoặc các tiêu đề) bắt đầu ở Hàng 1. Điều này có thể đúng nếu đây là kết xuất dữ liệu. Công thức sẽ phải được điều chỉnh nếu đây không phải là trường hợp.
  • Tôi giả sử bảng của bạn có ít hơn một triệu hàng. Nếu bạn bằng cách nào đó có nhiều hơn thế, hãy thay đổi 1000000s trong công thức thành thứ gì đó lớn hơn số hàng của bạn.
  • Nếu bảng của bạn có nhiều nghìn hàng (100.000+), bạn có thể muốn xem xét sử dụng giải pháp VBA thay vì các công thức mảng có thể bị sa lầy với các mảng lớn.

0

Mọi người đều sử dụng rất nhiều mã VBA hoặc các hàm phức tạp cho việc này. Tôi có một phương pháp cần một giây để thực hiện nhưng dễ hiểu hơn nhiều và rất dễ điều chỉnh tùy thuộc vào các khả năng khác nhau.

Trong ví dụ bạn đã đưa ra ở trên, dán các hàm (4) này vào các ô, lần lượt là E2, F2, G2 và H2 (các ô tham chiếu chức năng F & G ở trên):

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

Kéo các công thức này càng xa càng tốt. Nó tạo ra một hàng dữ liệu mỗi lần có 2 hàng, khiến các hàng đơn không bị ảnh hưởng. Dán đặc biệt các giá trị (để loại bỏ các công thức) của các cột EFGH ở nơi khác và sắp xếp chúng theo khách hàng để xóa tất cả các hàng thừa.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.