web-dev-qa-db-fra.com

Excel - Comment vlookup pour renvoyer plusieurs valeurs?

Je cherche à utiliser Excel pour rechercher et renvoyer 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 gestion et de retour de matrice, bien que je ne les aie pas traitées auparavant. Certains Google commencent à s'appuyer sur le if ([lookuparray] = [valeur], row [lookuparray]) dans le cadre d'une solution - bien que je ne parvienne pas à obtenir un résultat unique ...

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 valeurs de retour multiples sur la droite. (Séparés 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 d'extraire ces valeurs)

Toute aide sur la manière de traiter plusieurs valeurs dans ce contexte est appréciée. Merci.

18
overflew

En supposant que vous souhaitiez utiliser la formule indiquée (sans utiliser VLOOKUP, mais toujours une formule), voici comment j'ai présenté les données:

Data Layout

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

Ceci est une formule matricielle, donc après l'avoir copié et collé dans la cellule, vous devez cliquer sur Ctrl+Shift+Enter. Je l'ai ensuite simplement déplacé vers la droite et vers le bas.

S'il ne reste aucune valeur, cela donne l'erreur #NUM!, j'ai donné un exemple pour le 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.

12
Dan
  1. Echangez les colonnes de sorte que les couleurs figurent dans la colonne A et les noms dans la colonne B, puis effectuez un tri sur la couleur.

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

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

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

enter image description here

5
F106dart

Voici la solution VBA pour vous. Premièrement, voici à quoi ressemblent les résultats:

Screenshot

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
3
Engineer Toast

Si vous souhaitez utiliser une formule, il est beaucoup plus simple d'obtenir les résultats dans des cellules distinctes. Supposons donc que votre premier tableau est au format A2: B8 et que les couleurs figurent à nouveau 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+ENTER et copié en travers et en bas. Lorsque les matchs sont épuisés, vous obtenez des blancs.

La formule suppose Excel 2007 ou une version ultérieure. Si vous utilisez une 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))))

3
barry houdini