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.
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:
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.
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.
Formule en C2 (recopiez-la dans la colonne): = IF (A2 <> A1, B2, C1 & "," & B2)
Formule dans D2 (recopiez-la dans la colonne): = A2 <> A3
Filtrez pour "VRAI" sur la colonne D pour obtenir les résultats souhaités. Voir ci-dessous:
Voici la solution VBA pour vous. Premièrement, voici à quoi ressemblent les résultats:
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
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))))