Excel - Birden çok değer döndürmek için vlookup nasıl?


18

Belirli bir anahtar için birden çok referans değeri aramak ve döndürmek için Excel'i kullanmak istiyorum. VLookup ihtiyacım olana çok benzer bir şey yapıyor - ama sadece tek bir eşleşme döndürüyor.

Daha önce bunlarla uğraşmamış olsam da, dizi döndürme ve işleme yöntemlerini içereceğini varsayıyorum. Bazı Googling, bir çözümün parçası olarak if ([lookuparray] = [value], row [lookuparray]) üzerine yaslanmaya başlar - ancak tek bir eşleşme döndürmeyi alamıyorum ...

Örneğin, bu referans verileri varsa:

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

Sağdaki çoklu dönüş değerlerini almaya çalışıyorum. (Mümkünse virgülle ayrılmış)

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

(Zaten solda anahtar değere sahibim - bu değerleri çıkarmaya gerek yok)

Bu bağlamda birden çok değerin işlenmesine nasıl yaklaşılacağı konusunda herhangi bir yardım onaylanır. Teşekkürler.

Yanıtlar:


13

Belirtildiği gibi bir formül yaklaşımı istediğinizi varsayarsak (DÜŞEYARA'yı kullanma, ancak yine de bir formül), verileri nasıl ortaya koyduğum:

Veri Düzeni

Daha sonra C12 hücresinde aşağıdaki formülü kullandım:

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

Bu bir dizi formülüdür, bu yüzden kopyalayıp hücreye yapıştırdıktan sonra vurmanız gerekir Ctrl+Shift+Enter. Daha sonra onu sağa ve alta sürükledim.

Kalan değer yoksa #NUM!hata verirse , yüklenen resim örneğinde sarıya bir örnek verdim.

Bence tonlarca satırınız varsa VBA / Makro yaklaşımı daha iyi bir çözüm olacaktır.


Alınan değerleri toplamak isteyenler için (siparişin önemli olmadığı yerlerde) IF'yi bir dizi ile kullanmak daha kolaydır:=SUM(IF($B$2:$B$8="Key", $C$2:$C$8, 0))
Aralox

Bu formülü denedim ama aşağıdan ve aşağıya sürükledikten sonra aldığım çıktı sadece Adam ve Bob döndürüyor - yanlış bir şey mi yapıyorum? Burada ekran görüntüsüne bakın snag.gy/qW7UKM.jpg
ziggy

@ziggy ctrl + shift + enter tuşlarına bastınız mı?
Dan

5
  1. Sütunları, renkler A sütununda ve adlar B sütununda olacak şekilde değiştirin ve ardından rengi sıralayın.

  2. C2'deki formül (sütuna kopyalayın): = EĞER (A2 <A1, B2, C1 & "," & B2)

  3. D2'deki formül (sütuna kopyalayın): = A2 <> A3

  4. İstenen sonuçları elde etmek için D sütununda "TRUE" için filtre uygulayın. Aşağıya bakınız:

resim açıklamasını buraya girin


TIL, clunky CONCATENATE () formülü yerine "&" operatörünü kullanabilirsiniz. Teşekkürler!
bpcookson

3

Bir formül yaklaşımı istiyorsanız, sonuçları ayrı hücrelerde almak çok daha basittir, bu yüzden ilk tablonuzun A2: B8 olduğunu ve renklerin tekrar D2: D5'te listelendiğini varsayalım. E2'de bu formülü deneyin

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

ile onaylanır CTRL+SHIFT+ENTERve aşağı ve yukarı kopyalanır. Maçlar bittiğinde boşluklar alırsınız.

Formül Excel 2007 veya üstünü varsayar; önceki bir sürümse IFERROR yerine COUNTIF kullanabilirsiniz;

=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

İşte sizin için VBA çözümü. İlk olarak, sonuçlar şöyle görünür:

Ekran görüntüsü

Ve işte kod:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.