Excel - Bagaimana cara vlookup untuk mengembalikan banyak nilai?

18

Saya ingin menggunakan Excel untuk mencari dan mengembalikan beberapa nilai referensi untuk kunci yang diberikan. VLookup melakukan sesuatu yang sangat mirip dengan yang saya butuhkan - tetapi hanya mengembalikan satu pertandingan.

Saya menganggap itu akan melibatkan metode pengembalian array dan penanganan, meskipun saya belum pernah membahas ini sebelumnya. Beberapa Googling mulai bersandar pada if ([lookuparray] = [value], row [lookuparray]) sebagai bagian dari solusi - meskipun saya tidak bisa mendapatkannya untuk mengembalikan satu pertandingan ...

Misalnya, jika saya memiliki data referensi ini:

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

Saya mencoba untuk mendapatkan beberapa nilai pengembalian di sebelah kanan. (Dipisahkan koma, jika memungkinkan)

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

(Saya sudah memiliki nilai kunci di sebelah kiri - tidak perlu mengeluarkan nilai-nilai itu)

Bantuan apa pun tentang cara pendekatan menangani berbagai nilai dalam konteks ini telah disetujui. Terima kasih.

meluap
sumber

Jawaban:

13

Dengan asumsi Anda menginginkan pendekatan rumus seperti yang disebutkan (tidak menggunakan VLOOKUP, tetapi masih rumus), berikut adalah cara saya meletakkan data:

Tata Letak Data

Saya kemudian menggunakan rumus berikut dalam sel 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))

Ini adalah rumus array, jadi setelah Anda menyalin dan menempelkannya ke dalam sel yang harus Anda tekan Ctrl+Shift+Enter. Saya kemudian hanya menyeretnya ke kanan dan ke bawah.

Jika tidak ada nilai yang tersisa yang memberikan #NUM!kesalahan, saya berikan contoh untuk kuning pada contoh gambar yang diunggah.

Saya pikir pendekatan VBA / Makro akan menjadi solusi yang lebih baik jika Anda memiliki banyak baris.

Dan
sumber
Bagi mereka yang mencari untuk menjumlahkan nilai yang diambil (di mana urutan tidak menjadi masalah), lebih mudah menggunakan IF dengan array:=SUM(IF($B$2:$B$8="Key", $C$2:$C$8, 0))
Aralox
Saya mencoba formula ini tetapi output yang saya dapatkan setelah menyeret ke seberang dan di bawah hanya mengembalikan Adam dan Bob - apakah saya melakukan sesuatu yang salah? Lihat tangkapan layar di sini snag.gy/qW7UKM.jpg
ziggy
@ziggy apakah Anda menekan ctrl + shift + enter?
Dan
5
  1. Tukar kolom sehingga warnanya ada di kolom A dan namanya ada di kolom B, lalu urutkan warnanya.

  2. Formula dalam C2 (salin ke kolom): = IF (A2 <> A1, B2, C1 & "," & B2)

  3. Formula dalam D2 (salin ke kolom): = A2 <> A3

  4. Saring untuk "TRUE" pada kolom D untuk mendapatkan hasil yang diinginkan. Lihat di bawah:

masukkan deskripsi gambar di sini

F106dart
sumber
TIL Anda bisa menggunakan operator "&" alih-alih rumus CONCATENATE () yang kikuk. Terima kasih!
bpcookson
3

Jika Anda menginginkan pendekatan rumus maka jauh lebih mudah untuk mendapatkan hasil dalam sel yang terpisah, jadi mari kita asumsikan bahwa tabel pertama Anda adalah A2: B8 dan warnanya terdaftar lagi dalam D2: D5. Coba rumus ini di 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))),"")

dikonfirmasi dengan CTRL+SHIFT+ENTERdan disalin melintasi dan ke bawah. Ketika pertandingan habis Anda mendapatkan kosong.

Rumus mengasumsikan Excel 2007 atau lebih baru - jika versi sebelumnya Anda dapat menggunakan COUNTIF alih-alih IFERROR, yaitu

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

barry houdini
sumber
3

Inilah solusi VBA untuk Anda. Pertama, seperti inilah hasilnya:

Tangkapan layar

Dan ini kodenya:

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
Toast insinyur
sumber