Excel - วิธี vlookup เพื่อคืนค่าหลายค่า?


18

ฉันต้องการใช้ Excel เพื่อค้นหาและคืนค่าการอ้างอิงหลายค่าสำหรับคีย์ที่กำหนด VLookupทำบางสิ่งที่คล้ายกับสิ่งที่ฉันต้องการ - แต่คืนค่าการจับคู่เดียวเท่านั้น

ฉันคิดว่ามันจะเกี่ยวข้องกับวิธีคืนค่าอาเรย์และการจัดการแม้ว่าฉันจะไม่เคยจัดการกับสิ่งเหล่านี้มาก่อน Googling บางคนเริ่มพึ่งพา if ([lookuparray] = [value], row [lookuparray]) ซึ่งเป็นส่วนหนึ่งของการแก้ปัญหา - แม้ว่าฉันจะไม่สามารถคืนการแข่งขันได้ครั้งเดียว ...

ตัวอย่างเช่นถ้าฉันมีข้อมูลอ้างอิงนี้:

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

ฉันกำลังพยายามหาค่าส่งคืนหลายค่าทางด้านขวา (คั่นด้วยเครื่องหมายจุลภาคหากเป็นไปได้)

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

(ฉันมีค่าคีย์ด้านซ้ายแล้ว - ไม่จำเป็นต้องดึงค่าเหล่านั้นออก)

ความช่วยเหลือใด ๆ เกี่ยวกับวิธีการจัดการค่าหลายค่าในบริบทนี้ได้รับการชื่นชม ขอบคุณ

คำตอบ:


13

สมมติว่าคุณต้องการวิธีการสูตรตามที่ระบุไว้ (ไม่ใช้ VLOOKUP แต่ยังเป็นสูตร) ​​นี่คือวิธีที่ฉันวางข้อมูล:

เค้าโครงข้อมูล

ฉันใช้สูตรต่อไปนี้ในเซลล์ 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))

Ctrl+Shift+Enterนี้เป็นสูตรอาร์เรย์ดังนั้นหลังจากที่คุณคัดลอกและวางลงในเซลล์ที่คุณต้องตี จากนั้นฉันก็ลากมันไปทางขวาและด้านล่าง

หากไม่มีค่าที่เหลืออยู่มันทำให้เกิด#NUM!ข้อผิดพลาดฉันให้ตัวอย่างสำหรับสีเหลืองในตัวอย่างรูปภาพที่อัปโหลด

ฉันคิดว่าวิธี VBA / Macro จะเป็นทางออกที่ดีกว่าถ้าคุณมีแถวจำนวนมาก


สำหรับผู้ที่มองหาค่าผลรวมที่ดึงมา (โดยที่คำสั่งไม่สำคัญ) มันง่ายกว่าที่จะใช้ IF กับอาเรย์:=SUM(IF($B$2:$B$8="Key", $C$2:$C$8, 0))
Aralox

ฉันลองสูตรนี้ แต่ผลลัพธ์ที่ฉันได้รับหลังจากลากไปด้านล่างจะส่งกลับเฉพาะอดัมและบ็อบ - ฉันทำอะไรผิดหรือเปล่า? ดูภาพหน้าจอได้ที่นี่snag.gy/qW7UKM.jpg
ziggy

@ziggy คุณกด ctrl + shift + enter หรือไม่
ด่าน

5
  1. สลับคอลัมน์เพื่อให้สีอยู่ในคอลัมน์ A และชื่ออยู่ในคอลัมน์ B จากนั้นเรียงลำดับตามสี

  2. สูตรใน C2 (คัดลอกลงคอลัมน์): = IF (A2 <> A1, B2, C1 & "," & B2)

  3. สูตรใน D2 (คัดลอกลงคอลัมน์): = A2 <> A3

  4. กรองสำหรับ "TRUE" ในคอลัมน์ D เพื่อรับผลลัพธ์ที่ต้องการ ดูด้านล่าง:

ป้อนคำอธิบายรูปภาพที่นี่


TIL คุณสามารถใช้โอเปอเรเตอร์ "&" แทนสูตร CONCATENATE () clunky ขอบคุณ!
bpcookson

3

หากคุณต้องการวิธีการสูตรแล้วจะง่ายกว่ามากที่จะได้ผลลัพธ์ในเซลล์ที่แยกต่างหากดังนั้นให้สมมติว่าตารางแรกของคุณคือ A2: B8 และสีจะแสดงรายการอีกครั้งใน D2: D5 ลองสูตรนี้ใน 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))),"")

ยืนยันด้วยCTRL+SHIFT+ENTERและคัดลอกข้ามและลง เมื่อการแข่งขันหมดลงคุณจะได้รับช่องว่าง

สูตรถือว่า Excel 2007 หรือใหม่กว่า - หากเวอร์ชันก่อนหน้านี้คุณสามารถใช้ COUNTIF แทน IFERROR เช่น

=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

นี่คือโซลูชัน VBA สำหรับคุณ ครั้งแรกนี่คือผลลัพธ์ที่มีลักษณะ:

ภาพหน้าจอ

และนี่คือรหัส:

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.