Excel - Làm thế nào để vlookup trả về nhiều giá trị?


18

Tôi đang tìm cách sử dụng Excel để tra cứu và trả về nhiều giá trị tham chiếu cho một khóa đã cho. VLookup làm một cái gì đó rất giống với những gì tôi cần - nhưng chỉ trả về một trận đấu duy nhất.

Tôi cho rằng nó sẽ liên quan đến các phương thức xử lý và trả về mảng, mặc dù tôi chưa từng xử lý các phương thức này trước đây. Một số Googling bắt đầu dựa vào if ([lookuparray] = [value], row [lookuparray]) như một phần của giải pháp - mặc dù tôi không thể khiến nó trả về một trận đấu duy nhất ...

Ví dụ: nếu tôi có dữ liệu tham khảo này:

Adam    Red
Adam    Green
Adam    Blue
Bob     Red
Bob     Yellow
Bob     Green
Carl    Red 

Tôi đang cố gắng để có được nhiều giá trị trả về ở bên phải. (Dấu phẩy được phân tách, nếu có thể)

Red      Adam, Bob, Carl
Green    Adam, Bob
Blue     Adam
Yellow   Bob

(Tôi đã có giá trị khóa ở bên trái - không cần phải rút ra các giá trị đó)

Bất kỳ trợ giúp nào về cách tiếp cận xử lý nhiều giá trị trong bối cảnh này đều được đánh giá cao. Cảm ơn.

Câu trả lời:


13

Giả sử bạn muốn có một cách tiếp cận công thức như đã nêu (không sử dụng VLOOKUP, nhưng vẫn là một công thức), đây là cách tôi trình bày dữ liệu:

Giao diện dữ liệu

Sau đó tôi đã sử dụng công thức sau trong ô C12:

=INDEX($C$2:$C$8, SMALL(IF($B12=$B$2:$B$8, ROW($B$2:$B$8)-MIN(ROW($B$2:$B$8))+1, ""), 1))

Đây là một công thức mảng nên sau khi bạn sao chép và dán nó vào ô bạn phải nhấn Ctrl+Shift+Enter. Sau đó tôi chỉ cần kéo nó sang phải và xuống dưới cùng.

Nếu không có giá trị nào còn lại, nó sẽ #NUM!báo lỗi, tôi đã đưa ra một ví dụ cho màu vàng trong ví dụ hình ảnh được tải lên.

Tôi nghĩ rằng cách tiếp cận VBA / Macro sẽ là một giải pháp tốt hơn nếu bạn có hàng tấn hàng.


Đối với những người tìm kiếm tổng giá trị được truy xuất (trong trường hợp thứ tự không quan trọng), việc sử dụng IF với một mảng sẽ đơn giản hơn=SUM(IF($B$2:$B$8="Key", $C$2:$C$8, 0))
Aralox

Tôi đã thử công thức này nhưng đầu ra tôi nhận được sau khi kéo qua và bên dưới chỉ trả về Adam và Bob - tôi có làm gì sai không? Xem screenshot đây snag.gy/qW7UKM.jpg
Ziggy

@ziggy bạn đã nhấn ctrl + shift + enter?
Dan

5
  1. Hoán đổi các cột sao cho màu sắc nằm trong cột A và tên nằm trong cột B, sau đó sắp xếp theo màu.

  2. Công thức trong C2 (sao chép nó xuống cột): = IF (A2 <> A1, B2, C1 & "," & B2)

  3. Công thức trong D2 (sao chép nó xuống cột): = A2 <> A3

  4. Lọc "TRUE" trên cột D để có kết quả mong muốn. Xem bên dưới:

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


TIL bạn có thể sử dụng toán tử "&" thay vì công thức CONCATENATE () cồng kềnh. Cảm ơn!
bpcookson

3

Nếu bạn muốn một cách tiếp cận công thức thì việc lấy kết quả trong các ô riêng biệt sẽ đơn giản hơn nhiều, vì vậy hãy giả sử rằng bảng đầu tiên của bạn là A2: B8 và các màu được liệt kê lại trong D2: D5. Hãy thử công thức này trong E2

=IFERROR(INDEX($A$2:$A$8,SMALL(IF($B$2:$B$8=$D2,ROW($B$2:$B$8)-ROW($B$2)+1),COLUMNS($E2:E2))),"")

xác nhận với CTRL+SHIFT+ENTERvà sao chép trên và xuống. Khi trận đấu hết, bạn nhận được khoảng trống.

Công thức giả định Excel 2007 trở lên - nếu phiên bản cũ hơn, bạn có thể sử dụng COUNTIF thay vì IFERROR, tức là

=IF(COLUMNS($E2:E2)>COUNTIF($B$2:$B$8,$D2),"",INDEX($A$2:$A$8,SMALL(IF($B$2:$B$8=$D2,ROW($B$2:$B$8)-ROW($B$2)+1),COLUMNS($E2:E2))))


3

Đây là giải pháp VBA dành cho bạn. Đầu tiên, đây là kết quả trông như thế nào:

Ảnh chụp màn hình

Và đây là mã:

Option Explicit
Function LookupCSVResults(lookupValue As Variant, lookupRange As Range, resultsRange As Range) As String

    Dim s As String 'Results placeholder
    Dim sTmp As String  'Cell value placeholder
    Dim r As Long   'Row
    Dim c As Long   'Column
    Const strDelimiter = "|||"  'Makes InStr more robust

    s = strDelimiter
    For r = 1 To lookupRange.Rows.Count
        For c = 1 To lookupRange.Columns.Count
            If lookupRange.Cells(r, c).Value = lookupValue Then
                'I know it's weird to use offset but it works even if the two ranges
                'are of different sizes and it's the same way that SUMIF works
                sTmp = resultsRange.Offset(r - 1, c - 1).Cells(1, 1).Value
                If InStr(1, s, strDelimiter & sTmp & strDelimiter) = 0 Then
                    s = s & sTmp & strDelimiter
                End If
            End If
        Next
    Next

    'Now make it look like CSV
    s = Replace(s, strDelimiter, ",")
    If Left(s, 1) = "," Then s = Mid(s, 2)
    If Right(s, 1) = "," Then s = Left(s, Len(s) - 1)

    LookupCSVResults = s 'Return the function

End Function
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.