Cách thêm nội dung của nhiều hàng vào một ô, nhóm theo hàng thứ ba trong Excel 2010


0

Tôi đang cố gắng để có nhiều tên từ các hàng khác nhau vào một ô trong một hàng, nhưng nhóm nó theo một giá trị trong một cột khác. Tôi cũng cần danh sách các tên để ngắt dòng giữa chúng, không phải là danh sách được phân tách bằng dấu phẩy. Tôi không chắc nếu điều này thậm chí sẽ có thể. Tôi đã có một số phần tôi cần, như = CONCATENATE (TRANSPOSE (B2: B19)) để lấy dữ liệu vào một ô và char (10) để thêm ngắt dòng, nhưng tôi không thể để đặt nó lại với nhau để có được những gì tôi muốn.

Dữ liệu hiện tại như thế này:

enter image description here

Những gì tôi muốn:

enter image description here

Ngay cả một giải pháp VBA cũng ổn - mặc dù đó không phải là sở trường của tôi. ;) Tôi cần dữ liệu như thế này để sử dụng trong kết hợp thư Word.

Cũng lưu ý rằng có một số cột dữ liệu khác trong bảng tính. Tôi để lại cho đơn giản.

Câu trả lời:


1

Tôi đề nghị một giải pháp đòi hỏi một chút VBA.

Trong ví dụ này, dữ liệu mẫu nằm trong B2: C10. Để lại E1 làm ô tiêu đề và trong E2 đặt công thức sau và nhấn CTRL + SHIFT + ENTER từ trong thanh công thức để tạo Công thức mảng. Công thức bây giờ sẽ được đặt trong dấu ngoặc nhọn để chỉ ra rằng đó là một công thức mảng.

=IFERROR(INDEX($B$2:$B$10, MATCH(0, COUNTIF(E$1:$E1, $B$2:$B$10), 0),1),"") 

Kéo cái này xuống cho đến khi bạn có khoảng trống. Điều này đầu tiên tạo ra một danh sách các giá trị duy nhất từ ​​nhóm tại B2: B10. Lưu ý rằng bất cứ nơi nào bạn đặt công thức này, ít nhất một ô phía trên nó sẽ có sẵn để được tham chiếu. E1 trong trường hợp này là công thức bắt đầu trong E2.

Chúng ta sẽ sử dụng một Hàm gọi là TEXTJOIN. Tuy nhiên, trong hầu hết các phiên bản Excel, điều này không có sẵn. Bạn có thể có nó trong trường hợp bạn đang sử dụng phiên bản Office 365 của Excel 2016. Nếu không có sẵn, hãy sử dụng bên dưới UDF (Hàm xác định người dùng) trong VBA để sao chép cùng chức năng.

Nhấn ALT + F11 để truy cập VBA Editor. Chèn một mô-đun từ Menu Chèn. Đặt UDF sau vào nó.

Function TEXTJOIN1(delimiter As String, ignore_empty As Boolean, ParamArray cell_ar() As Variant)
For Each cellrng In cell_ar
    For Each cell In cellrng
        If ignore_empty = False Then
            result = result & cell & delimiter
        Else
            If cell <> "" Then
                result = result & cell & delimiter
            End If
        End If
    Next cell
Next cellrng
TEXTJOIN1 = Left(result, Len(result) - Len(delimiter))
End Function

Bây giờ trở lại Bảng tính Excel, chúng ta sẽ sử dụng hàm này làm UDF trong công thức. Trong F2, đặt công thức sau và nhấn CTRL + SHIFT + ENTER để tạo Công thức mảng.

=IFERROR(TEXTJOIN1(CHAR(10),TRUE,IF($B$2:$B$10=E2,$C$2:$C$10,"")),"")

Kéo nó xuống cho đến khi hàng dự định. Đợi đã, điều này tạo ra một danh sách các tên theo nhóm được ghép bởi Char (10) nhưng để thấy hiệu ứng phù hợp, bạn cần bật Wrap Text trên các ô dự định. Bạn có thể thực hiện thủ công từ Tùy chọn ô định dạng trong Excel hoặc bạn có thể sử dụng Macro đơn giản dưới đây để làm điều đó cho bạn. Chỉ cần xác định Phạm vi trong đầu. Trong ví dụ này, đó là E2: F4.

Nhấn ALT + F11 để truy cập VBA Editor. Chèn một mô-đun từ Menu Chèn và qua đoạn mã sau vào nó. Điều này tạo ra một Macro có tên Format1

Định dạng phụ1 ()

    Range("E2:F4").Select
    With Selection
        .HorizontalAlignment = xlLeft
        .VerticalAlignment = xlTop
        .WrapText = True
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = False
    End With
End Sub

Quay lại trang tính Excel Nhấn ALT + F8 để truy cập hộp thoại Macro và Chạy Format1.

Kiểm tra giải pháp này vào cuối của bạn và cho tôi biết trong trường hợp có bất kỳ vấn đề.

enter image description here


Cảm ơn! Có vẻ như nó cũng hoạt động. Chúng tôi đã có thể tìm một giải pháp khác trước khi tôi quay lại và kiểm tra câu trả lời.
Graeck

1

Sau khi đăng, và trước khi thấy câu trả lời khác, tôi đã làm việc với đồng nghiệp và chúng tôi đã làm cho nó hoạt động.

Bắt đầu bằng cách sắp xếp theo Nhóm rồi Tên.

Sau đó, chúng tôi đã thêm một cột sẽ kiểm tra cả hai để xem tên đã được thêm vào chưa (có trùng lặp không) và nếu nhóm giống hay khác. Nếu tên đó chưa được thêm vào và nó vẫn là cùng một nhóm, nó sẽ ghép tên mới vào danh sách từ ô bên trên, sử dụng:

=IF(B2=B1,C1,IF(A2=A1,CONCATENATE(C1,CHAR(10),B2),B2))

Trong một cột khác, chúng tôi đã tạo ra một số lượng ngược tên trong nhóm.

=IF(A2=A1,D1-1,COUNTIF(A:A,A2))

Mà có được điều này:

enter image description here

Sau đó, chúng tôi chỉ lọc cột D theo "1":

enter image description here


0

enter image description here

Private Sub MergeDuplicates()


Dim Rng As Range, xCell As Range
Dim xRows As Integer


xTitleId = "Merge Duplicates"

Set WorkRng = Application.Selection
Set WorkRng = Application.InputBox("Range", xTitleId, WorkRng.Address, Type:=8)

Application.ScreenUpdating = False
Application.DisplayAlerts = False

xRows = WorkRng.Rows.count

For Each Rng In WorkRng.Columns
    For i = 1 To xRows - 1
        For j = i + 1 To xRows
            If Rng.Cells(i, 1).Value <> Rng.Cells(j, 1).Value Then
                Exit For
            End If
        Next
        WorkRng.Parent.Range(Rng.Cells(i, 1), Rng.Cells(j - 1, 1)).Merge
        i = j - 1

    Next
Next

Application.DisplayAlerts = True
Application.ScreenUpdating = True

End Sub

N.B. Chèn mã này dưới dạng Mô-đun và quay lại trang tính để CHẠY nó, chọn phạm vi dữ liệu cần thiết khi INPUT BOX xuất hiện và kết thúc với Ok.

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.