web-dev-qa-db-fra.com

Recherche tridimensionnelle à l'aide de INDEX/MATCH

Ceci a été repris et légèrement amélioré par rapport à la question supprimée depuis

Pour ceux qui peuvent voir les messages supprimés, cela a été pris à partir d'ici: https://stackoverflow.com/questions/39793322/three-dimensional-lookup-no-concatenate-or-named-ranges-Excel


J'essaie de faire une recherche en trois dimensions sans plages nommées ou concaténés. Simplifié, mes données sont sur le formulaire:

    Column1 Column2 Column3
Scott           
P   1       2       3
M   4       5       6
N   7       8       9
George          
P   10      11      12
M   13      14      15
N   16      17      18

Je souhaite maintenant rechercher un nom spécifique, puis une lettre spécifique dans cette table de noms, puis associer ce numéro de ligne à une colonne spécifique. 

J'ai essayé un INDEX/MATCH simple:

=INDEX(A:D,MATCH("M",A:A,0),MATCH("Column1",1:1,0))

Et cela fonctionne pour le nom du poing mais pas pour les autres, car il trouve la première instance de M.

Comment puis-je le modifier pour chercher un nom différent?


J'ai répondu ci-dessous, mais je veux voir si quelqu'un a une meilleure solution.

21
Scott Craner

Vous pouvez utiliser deux autres index/match dans le premier match pour définir la plage de recherche. Ensuite, vous devez simplement ajouter MATCH () pour trouver la position absolue du nom.

=INDEX(A:D,MATCH($H$4,INDEX(A:A,MATCH($H$3,A:A,0)):INDEX(A:A,MATCH($H$3,A:A,0)+4),0)+MATCH($H$3,A:A,0)-1,MATCH($H$5,$1:$1,0))

 ![enter image description here

13
Scott Craner

Vous pouvez le faire simplement en additionnant les résultats de deux matchs. Une correspondance pour les noms plus une correspondance pour la lettre est égale à la ligne totale.

= INDICE (A: D, MATCH (G5, A3: A5,0) + MATCH (G3, A: A, 0), MATCH (G4,1: 1,0))

En d'autres termes: index (toutes les données, correspondance (nom, colonne du nom, exact) + correspondance (lettre, colonne de la lettre, exact), correspondance (nom de la colonne, dans la ligne de la colonne, exact)

Capture d'écran de la feuille de travail

6
Reeves

Je pense que cela peut être légèrement plus ordonné, et un peu plus facile à modifier peut-être.

=INDEX(OFFSET(INDIRECT("A"&MATCH($H$3,$A:$A,0),TRUE),0,0,4,4),MATCH($H$4,$A:$A,0),MATCH(H5,$1:$1,0))

En utilisant d'abord l'offset pour créer la plage, nous pouvons utiliser le nom de H3 pour la définir, puis nous ne faisons qu'indexer dans cette nouvelle plage.

Maintenant, cela dépend toujours de rester dans la colonne A pour les noms.

2
Jacob Edmond

En supposant que le format des données est toujours Name puis P, M et N, cette formule fait le travail:

=INDEX($A:$D,
MATCH($H$3,$A:$A,0)
+LOOKUP($H$4,{"P",1;"M",2;"N",3}),
MATCH($H$5,$1:$1,0))
2
EEM

Je voudrais utiliser la zone (4ème paramètre) de Index (). Vous trouverez ci-dessous une capture d'écran des données de test. Cet exemple suppose que les mêmes colonnes et les mêmes clés sont triées et cohérentes.

Cela fonctionne en utilisant (Range1, Range2) comme premier paramètre de l'index. Pour le 4ème paramètre d'index, utilisez N pour quelle zone de la valeur () vous souhaitez que Index renvoie.

 enter image description here

2
Kevin

Cette solution fonctionne dans presque toutes les conditions. Une restriction que j’ai trouvée est celle où un des sujets (Noms) n’a pas de données pour les détails (lettres), mais à présent la même chose se produit avec toutes les autres réponses.

La formule suppose que les données se trouvent à B6:F30 (afin de garantir qu’elles peuvent être appliquées quel que soit l’emplacement de la plage source).

La formule utilise les fonctions Index\Match:

Tout d’abord, un MATCH pour récupérer la position de la variable Name:

MATCH($H8,$B$6:$B$30,0)

Avec cette information, il utilise INDEX pour créer une plage permettant d’obtenir la position de la Detail (lettre) à l’aide d’une deuxième fonction MATCH:

+ MATCH($I8,INDEX($B$6:$B$30, 1 + MATCH($H8,$B$6:$B$30,0))
:INDEX($B$6:$B$30,ROWS($B$6:$B$30)),0),

L'ajout des résultats des première et deuxième fonctions MATCH permet d'obtenir la position de la combinaison Name`Detail` et de l'utiliser dans un index pour l'intégralité des données. La position de la colonne de données requise est obtenue avec une correspondance:

INDEX($B$6:$F$30, 1st.MATCH + 2nd.MATCH,
MATCH(J$6,$B$6:$F$6,0))

Avec les résultats situés à G6:L30, entrez cette formule dans J8 puis copiez-la dans J8:L30:

= INDEX( $B$6:$F$30,
MATCH( $H8, $B$6:$B$30, 0)
+MATCH( $I8, INDEX( $B$6:$B$30 , 1 + MATCH( $H8, $B$6:$B$30 ,0))
: INDEX( $B$6:$B$30, ROWS($B$6:$B$30) ),0),
MATCH( J$6, $B$6:$F$6, 0)),"")

 enter image description here

2
EEM

Cette solution fonctionne dans toutes les conditions discutées jusqu'à présent (informez-moi de toute condition que cela ne fonctionne pas et que j'essaierai de la couvrir)} _. Je publie cette réponse en tant que réponse séparée: les formules appliquées dans la réponse précédente s'appliquent à juste titre aux conditions qui y sont énoncées. En tant que telles, elles seront utiles aux utilisateurs avec ces scénarios spécifiques, de sorte qu'ils n'ont pas besoin d'appliquer ces formules longues.

Cette formule suppose que les données se trouvent à B6:E30(afin de garantir qu’elles peuvent être appliquées quel que soit l’emplacement de la plage source)).

Cette formule utilise les fonctions Index\Match et constitue un tableau de formules.

Les tableaux de formules sont entrés en appuyant[Ctrl]+[Shift]+[Enter]simultanément, vous verrez} _ {et}autour de la formule si elle est entrée correctement}

Syntaxe:

=IFERROR(INDEX(DataRng,
MATCH(Value1,NamesRng,0)
+IFERROR(MATCH(Value2,INDEX(NamesRng,
1+MATCH(Value1,NamesRng,0))
:INDEX(NamesRng, IFERROR(MATCH(Value1,NamesRng,0)
+MATCH("#",IF((INDEX(Col1Rng,1+MATCH(Value1,NamesRng,0))
:INDEX(Col1Rng,ROWS(NamesRng)))="","#","!"),0),
ROWS(NamesRng))),0),NA()),MATCH(ValCol,DataHdr,0)),"")

Arguments:En supposant que les données se trouvent en B6: E30.

Value1 = Name à trouver dans Data, c’est-à-dire George, Scott, etc.

Value2 = Detail à trouver dans Data, c’est-à-dire Detail1, Detalle2, etc.

ValCol = Column à trouver dans les données, à savoir Column1, Column2, etc.

DataRng = $B$6:$E$30

DataHdr = $B$6:$E$6

NamesRng = $B$6:$B$30

Col1Rng = $C$6:$C$30

1st MATCH: Récupère la position du nom:

MATCH(Value1,NamesRng,0)

2nd MATCH: récupère la position de fin des détails correspondants du nom, qui est déterminée par une valeur vide dans la colonne C ou par la fin de la plage de données:

MATCH("#",IF((INDEX(Col1Rng, 1 + 1stMATCH)
:INDEX(Col1Rng,ROWS(NamesRng)))="","#","!"),0),

Construit une plage (vRange)}: avec les détails des noms à l'aide des fonctions de correspondance 1 et 2. Si 2nd Match renvoie une erreur, il utilise la dernière ligne de la plage de données:

INDEX(NamesRng, 1 + 1stMATCH )
:INDEX(NamesRng, IFERROR( 1stMATCH + 2ndMATCH, ROWS(NamesRng)))

3rd MATCH: Récupère la position de la Detail dans la vRange. Il retourne #NA si la combinaison n'est pas présente.

IFERROR(MATCH(Value2, vRange,0), NA())

L'ajout des résultats des fonctions de correspondance 1 et 3 permet d'obtenir l'index de ligne de la combinaison Name`Detailcombination or # NAif no found. The Column index is obtained with a Match from the Header of the Data. It then applying the INDEX function to the Data Range returns the value of theNom\Détail\Colonnecombination. If theNom\Code__ détails n'est pas retournée. 

=IFERROR( INDEX( DataRng, 1stMATCH + 3rdMATCH, MATCH(Column,DataHdr,0)),"")

Avec les résultats situés en H6: L37, entrez ce tableau de formules dans J8, puis copiez-les dans K8: L37 et dans J9: L37:

=IFERROR( INDEX($B$6:$E$30,
MATCH($H8,$B$6:$B$30,0)
+IFERROR( MATCH($I8, INDEX($B$6:$B$30,
1+MATCH($H8,$B$6:$B$30,0))
:INDEX($B$6:$B$30, IFERROR(MATCH($H8,$B$6:$B$30,0)
+MATCH("#", IF((INDEX($C$6:$C$30,1+MATCH($H8,$B$6:$B$30,0))
:INDEX($C$6:$C$30,ROWS($B$6:$B$30)))="","#","!"),0),
ROWS($B$6:$B$30))),0),NA()),
MATCH(J$6,$B$6:$E$6,0)), "")

 enter image description here

1
EEM

Wow ... Tant de solutions déjà.

Je pense qu'une solution plus simple pourrait utiliser l'offset pour obtenir une réponse plus générique.

=INDEX($A$1:$D$9, MATCH($G$3,OFFSET($A$1,MATCH($G$2,$A$1:$A$9,0),0,3,1),0)+MATCH($G$2,$A$1:$A$9,0), MATCH($G$4,$B$1:$D$1,0)+1)

La seule variable à rechercher est 3, qui correspond au nombre d'options M/N/P présentes car cela affectera le nombre de lignes. Sinon, la solution fonctionne correctement dans tous les scénarios possibles et selon différents ordres.

0
Som Shekhar