6 votes

Excel INDEX MATCH vérifiant plusieurs colonnes

Le problème que j'essaie essentiellement de résoudre est un VLOOKUP qui recherche une valeur dans les colonnes A:E et renvoie la valeur contenue dans la colonne F si elle est trouvée dans l'une de ces colonnes.

VLOOKUP n'étant pas à la hauteur de la tâche, je me suis penché sur la syntaxe INDEX-MATCH, mais j'ai du mal à comprendre comment effectuer cette opération pour un tableau de valeurs, par opposition à une seule colonne. J'ai construit un ensemble de données d'exemple ci-dessous pour essayer d'expliquer cela :

A------B------C------D------E------F

1------2------3------4------5------Apple

12-----13--------------------------Banana

14---------------------------------Carrot

Si la cellule contrôlée contient 1,2,3,4 ou 5, le résultat de la formule devrait être Pomme. Si elle contient 12 ou 13, elle devrait retourner Banane et enfin si elle contient 14, elle devrait retourner Carotte.

La deuxième partie du problème vient du fait que la cellule référencée n'est pas une valeur unique, mais un tableau complet. En tant que telle, cette recherche sera effectuée un grand nombre de fois en fonction de différentes valeurs.

Ainsi, pour démontrer, il y a une autre table ailleurs (comme ci-dessous) qui a ces valeurs. J'essaie de faire en sorte que le système identifie la ligne, et donc la valeur "pomme, banane, carotte" à associer à chaque colonne. La table se présente comme suit

H------I------------

1------(Apple)----

2------(Apple)----

12-----(Banana)-

etc.-----------------

Les valeurs entre parenthèses correspondent à l'endroit où la formule calcule ces valeurs.

4voto

Gary's Student Points 18946

Vous avez un certain nombre de cas différents. Considérons un cas :

Quelque part dans les colonnes A par le biais de E il existe une seule et unique cellule contenant 13, renvoyer le contenu de la cellule dans la colonne F dans la même rangée.

Nous utiliserons une colonne "auxiliaire". Dans G1 Entrez :

=COUNTIF(A1:E1,13)

et le copier vers le bas. Cela nous permet d'identifier la rangée :

enter image description here
Nous pouvons maintenant utiliser MATCH()/INDEX() :

Choisis une cellule et entre :

=INDEX(F:F,MATCH(1,G:G,0))

enter image description here

Si les "règles" changent et qu'il peut y avoir plus d'un 13 dans une rangée ou plusieurs rangées contenant un 13, nous modifierons la colonne des aides.

EDIT#1 :

Sur la base de votre mise à jour, la première étape serait de retirer le code dur 13 des formules de la colonne "aide" et la placer dans sa propre cellule, (dire H1 ) . Vous pouvez alors exécuter différents cas en changeant simplement une seule cellule.

Si vous avez un grand nombre de cas dans une table, vous pouvez créer une macro pour configurer chaque cas. (mise à jour H1 ) et enregistrez les résultats.

2voto

Scott Craner Points 20779

Pour une seule formule en H1 :

=INDEX($F$1:INDEX(F:F,MATCH("ZZZ",F:F)),AGGREGATE(15,6,ROW($A$1:INDEX(E:E,MATCH("ZZZ",F:F)))/($A$1:INDEX(E:E,MATCH("ZZZ",F:F))=H1),1))

Comme il s'agit d'une formule de tableau, nous devons limiter les références à la taille de l'ensemble de données. Toutes les INDEX(E:E,MATCH("ZZZ",F:F)) faire ça. Elle renvoie la dernière ligne de la colonne F qui contient du texte. Elle la définit ensuite comme la dernière ligne à itérer.

La méthode de @GaryStudent évite les formules Array et peut être la méthode nécessaire. Plus l'ensemble de données et le nombre de formules augmentent, plus le temps de calcul est long. Jusqu'à, à un moment donné, faire planter Excel. Habituellement, cela ne prend que quelques milliers de minutes, mais je tiens à lancer l'alerte.

enter image description here


EDIT

Pour éviter d'utiliser les formules Array tout en restant une seule formule :

=IFERROR(INDEX(F:F,MIN(IFERROR(MATCH($H1,A:A,0),1050000),IFERROR(MATCH($H1,B:B,0),1050000),IFERROR(MATCH($H1,C:C,0),1050000),IFERROR(MATCH($H1,D:D,0),1050000),IFERROR(MATCH($H1,E:E,0),1050000))),"")

Ceci est basé sur la réponse de l'OP, j'ai juste combiné cette méthode en une seule formule.

Cette formule ignore les entrées doubles et renvoie la première ligne dans laquelle le numéro est trouvé.

Et comme il ne s'agit pas d'un tableau, les références en pleine colonne ne nuisent pas aux temps de calcul.

! enter image description here

2voto

Richard Allan Points 83

Sur la base de mes propres recherches et des discussions avec @Gary'sStudent, la solution que j'ai utilisée a consisté à créer une formule MATCH pour chacune des colonnes possibles dans lesquelles la valeur pourrait être contenue, ainsi qu'une instruction "IFERROR" d'échappement.

I1 =IFERROR(MATCH($H1,A$1:A$3,0),"")     
J1 =IFERROR(MATCH($H1,B$1:B$3,0),"")     
K1 =IFERROR(MATCH($H1,C$1:C$3,0),"")    
L1 =IFERROR(MATCH($H1,D$1:D$3,0),"")    
M1 =IFERROR(MATCH($H1,E$1:E$3,0),"")
etc.

Ces colonnes peuvent désormais être masquées pour éviter toute confusion/interaction de la part des utilisateurs.

J'ai ensuite créé un index qui les accumule en une seule valeur, qui devrait correspondre à la rangée en question. Là encore, il y a un contrôle (premier SUM) pour entrer une valeur vide si la valeur n'est pas trouvée dans la table.

N1 =IF(SUM(I1:M1)=0,"",INDEX($A$1:$F$3,SUM(I1:M1),6))

INDEX-MATCH ARRAY Enfin, j'ai entré quelques formules de formatage conditionnel pour m'assurer que l'utilisateur identifie et remplace/supprime toute donnée en double.

A1:E3 Cell contains a blank value                [Formatting None Set, Stop if True]
A1:E3 =COUNTIF($A$1:$E$3,A1)>1                   [Formatting Text:White, Background:Red]

H1:N1 =COUNTIF($A$1:$E$3,H1)>1       [Formatting Text:Red, Background:Red]

Il s'agit simplement d'une indication à l'utilisateur de supprimer ces données en double.

enter image description here

1voto

NiklasJ Points 671

Une méthode différente serait basée sur une table auxiliaire, qui représente la façon dont cela "devrait" être structuré en premier lieu. Cela éviterait les équations monstres qui sont ennuyeuses à déboguer et à modifier par la suite, et cela permet de résoudre proprement un nombre variable de colonnes, contrairement à l'idée d'avoir 5 colonnes de recherche.

Si ce qui précède est dans la feuille 1, ajoutez une feuille 2. Sur cette feuille, placez quatre colonnes : Row, Column, ID, Name.

Formule en Row devrait être (en psuedo code, "Last" signifie "pour la ligne ci-dessus dans la feuille 2")

=IF(Column = 1, Last row + 1 , Last row)

Formule en Column :

=IF(OR(Last Column = 5; INDEX(StartTable, last row, last column + 1) = ""), 1, Last column+1)

Formule en ID y Name :

=INDEX(StartTable, Row, Column)    
=INDEX(NameColumn, Row, 1)

Ensuite, vous le remplissez (en gros jusqu'à ce que row >nombre de lignes dans le tableau original).

Enfin, vous utilisez la nouvelle table avec un vlookup ou un index/match ordinaire.

PRO : Formules beaucoup plus simples, plus faciles à utiliser et à comprendre.

CONS : Besoin d'une table supplémentaire, doit maintenir la longueur de la table. En ce qui concerne les performances, il y a un risque, car cela nécessite un seul thread pour toute la "chaîne" de valeurs.

De plus, si quelques lignes d'erreur sont acceptables, le code peut être un peu plus simple et peut-être plus performant, nous pouvons alors supposer que le nombre de colonnes est toujours de 5, ce qui donne à la fois la ligne et la colonne .

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X