Excel - Wie kann ich nachschlagen, um mehrere Werte zurückzugeben?


18

Ich möchte Excel verwenden, um mehrere Referenzwerte für einen bestimmten Schlüssel nachzuschlagen und zurückzugeben. VLookup macht etwas sehr Ähnliches wie ich - gibt aber nur ein einziges Match zurück.

Ich gehe davon aus, dass es sich dabei um Array-Rückgabe- und -Handhabungsmethoden handelt, obwohl ich mich zuvor noch nicht damit befasst habe. Einige Googler beginnen, sich auf das if ([lookuparray] = [value], row [lookuparray]) als Teil einer Lösung zu stützen - obwohl ich es nicht schaffen kann, ein einzelnes Match zurückzugeben ...

Zum Beispiel, wenn ich diese Referenzdaten habe:

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

Ich versuche, die mehreren Rückgabewerte auf der rechten Seite zu erhalten. (Komma getrennt, falls möglich)

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

(Ich habe bereits den Schlüsselwert auf der linken Seite - diese Werte müssen nicht herausgezogen werden.)

Jede Hilfe, um in diesem Zusammenhang mit mehreren Werten umzugehen, ist willkommen. Vielen Dank.

Antworten:


13

Angenommen, Sie möchten einen Formelansatz wie angegeben (ohne VLOOKUP, aber dennoch mit einer Formel), dann habe ich die Daten folgendermaßen angeordnet:

Datenlayout

Ich habe dann die folgende Formel in Zelle C12 verwendet:

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

Dies ist eine Matrixformel. Nachdem Sie sie kopiert und in die Zelle eingefügt haben, müssen Sie drücken Ctrl+Shift+Enter. Ich habe es dann einfach nach rechts und unten gezogen.

Wenn es keine verbleibenden Werte gibt, wird der #NUM!Fehler angezeigt. Im Beispiel für das hochgeladene Bild habe ich ein Beispiel für Gelb angegeben.

Ich denke, ein VBA / Makro-Ansatz wäre eine bessere Lösung, wenn Sie Tonnen von Zeilen haben.


Für diejenigen, die nach abgerufenen Summenwerten suchen (bei denen die Reihenfolge keine Rolle spielt), ist es einfacher, IF mit einem Array zu verwenden:=SUM(IF($B$2:$B$8="Key", $C$2:$C$8, 0))
Aralox,

Ich habe diese Formel ausprobiert, aber die Ausgabe, die ich nach dem Ziehen über und unter erhalte, gibt nur Adam und Bob zurück - mache ich etwas falsch? Screenshot hier ansehen snag.gy/qW7UKM.jpg
ziggy

@ziggy hast du STRG + UMSCHALT + EINGABETASTE gedrückt?
Dan

5
  1. Tauschen Sie die Spalten aus, sodass sich die Farben in Spalte A und die Namen in Spalte B befinden, und sortieren Sie dann nach der Farbe.

  2. Formel in C2 (in die Spalte kopieren): = IF (A2 <> A1, B2, C1 & "," & B2)

  3. Formel in D2 (in die Spalte kopieren): = A2 <> A3

  4. Filtern Sie nach "TRUE" in Spalte D, um die gewünschten Ergebnisse zu erhalten. Siehe unten:

Bildbeschreibung hier eingeben


Bis Sie den Operator "&" anstelle der klobigen CONCATENATE () - Formel verwenden können. Vielen Dank!
Bpcookson

3

Wenn Sie einen Formelansatz wünschen, ist es viel einfacher, die Ergebnisse in separaten Zellen abzurufen. Nehmen wir also an, dass Ihre erste Tabelle A2: B8 lautet und die Farben in D2: D5 erneut aufgeführt sind. Versuchen Sie diese Formel in 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))),"")

bestätigt mit CTRL+SHIFT+ENTERund kopiert quer und runter. Wenn Streichhölzer ausgehen, erhält man Leerzeichen.

Die Formel geht von Excel 2007 oder höher aus - wenn Sie eine frühere Version verwenden, können Sie COUNTIF anstelle von IFERROR verwenden, d. H

=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

Hier ist die VBA-Lösung für Sie. Zunächst sehen die Ergebnisse so aus:

Bildschirmfoto

Und hier ist der Code:

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.