Excel - Comment vlookup pour retourner plusieurs valeurs?

18

Je cherche à utiliser Excel pour rechercher et retourner plusieurs valeurs de référence pour une clé donnée. VLookup fait quelque chose de très similaire à ce dont j'ai besoin - mais ne renvoie qu'une seule correspondance.

Je suppose que cela impliquera des méthodes de retour et de gestion de tableaux, bien que je ne les ai pas traités auparavant. Certains googleurs commencent à s'appuyer sur l'if ([lookuparray] = [valeur], ligne [lookuparray]) dans le cadre d'une solution - bien que je ne puisse pas obtenir qu'il renvoie une seule correspondance ...

Par exemple, si j'ai ces données de référence:

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

J'essaie d'obtenir les multiples valeurs de retour sur la droite. (Séparé par des virgules, si possible)

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

(J'ai déjà la valeur clé sur la gauche - pas besoin de retirer ces valeurs)

Toute aide sur la façon d'aborder la gestion de plusieurs valeurs dans ce contexte est appréciée. Merci.

survolé
la source

Réponses:

13

En supposant que vous souhaitiez une approche de formule comme indiqué (sans utiliser RECHERCHEV, mais toujours une formule), voici comment j'ai présenté les données:

Disposition des données

J'ai ensuite utilisé la formule suivante dans la cellule 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))

Il s'agit d'une formule matricielle, donc après l'avoir copiée et collée dans la cellule, vous devez frapper Ctrl+Shift+Enter. Je l'ai ensuite simplement glissé vers la droite et vers le bas.

S'il ne reste aucune valeur, cela donne l' #NUM!erreur, j'ai donné un exemple de jaune dans l'exemple d'image téléchargée.

Je pense qu'une approche VBA / Macro serait une meilleure solution si vous avez des tonnes de lignes.

Dan
la source
Pour ceux qui cherchent à additionner les valeurs récupérées (où l'ordre n'a pas d'importance), il est plus simple d'utiliser IF avec un tableau:=SUM(IF($B$2:$B$8="Key", $C$2:$C$8, 0))
Aralox
J'ai essayé cette formule mais la sortie que j'obtiens après avoir glissé à travers et en dessous ne renvoie qu'Adam et Bob - est-ce que je fais quelque chose de mal? Voir la capture d'écran ici snag.gy/qW7UKM.jpg
ziggy
@ziggy avez-vous appuyé sur Ctrl + Maj + Entrée?
Dan
5
  1. Échangez les colonnes afin que les couleurs soient dans la colonne A et les noms dans la colonne B, puis triez la couleur.

  2. Formule en C2 (copiez-la dans la colonne): = IF (A2 <> A1, B2, C1 & "," & B2)

  3. Formule en D2 (copiez-la dans la colonne): = A2 <> A3

  4. Filtrez «VRAI» dans la colonne D pour obtenir les résultats souhaités. Voir ci-dessous:

entrez la description de l'image ici

F106dart
la source
TIL vous pouvez utiliser l'opérateur "&" au lieu de la formule maladroite CONCATENATE (). Merci!
bpcookson
3

Si vous voulez une approche par formule, il est beaucoup plus simple d'obtenir les résultats dans des cellules distinctes, supposons donc que votre premier tableau est A2: B8 et que les couleurs sont à nouveau répertoriées dans D2: D5. Essayez cette formule en 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))),"")

confirmé avec CTRL+SHIFT+ENTERet copié de part et d'autre. Lorsque les matchs sont épuisés, vous obtenez des blancs.

La formule suppose qu'Excel 2007 ou version ultérieure - si la version antérieure vous pouvez utiliser COUNTIF au lieu de IFERROR, c.-à-d.

=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
la source
3

Voici la solution VBA pour vous. Tout d'abord, voici à quoi ressemblent les résultats:

Capture d'écran

Et voici le 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
Ingénieur Toast
la source