web-dev-qa-db-fra.com

Excel INDEX MATCH Vérification de plusieurs colonnes

Le problème que je cherche essentiellement à résoudre est un VLOOKUP qui vérifie une valeur de la colonne A: E et renvoie la valeur conservée dans la colonne F si celle-ci était trouvée.

Comme VLOOKUP n’est pas à la hauteur de la tâche, j’ai examiné la syntaxe INDEX-MATCH, mais j’ai du mal à comprendre pourquoi le compléter pour un tableau de valeurs, par opposition à une seule colonne. J'ai construit un exemple de jeu de données ci-dessous pour essayer d'expliquer ceci:

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

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

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

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

Si la cellule vérifiée contient 1,2,3,4 ou 5, le résultat de la formule doit être Apple. S'il a 12 ou 13 ans, il devrait retourner Banana et enfin s'il en contient 14, il devrait renvoyer Carotte.

La seconde moitié de cela provient du fait que la cellule référencée n'est pas une valeur unique, mais une table complète elle-même. En tant que telle, cette recherche sera complétée un grand nombre de fois selon différentes valeurs.

Donc, pour démontrer, il existe un autre tableau ailleurs (comme ci-dessous) qui contient ces valeurs. Je tente de faire en sorte que le système identifie la ligne, et donc celle des valeurs "Pomme, Banane, Carotte" à associer à chaque colonne. La table ressemblerait à celle ci-dessous

SALUT------------

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

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

12 ----- (banane) -

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

Les valeurs entre parenthèses sont les endroits où la formule calcule ces valeurs.

6
Richard Allan

Sur la base de mes propres recherches et discussions avec @ Gary'sStudent, la solution que j'ai utilisée était de créer une formule MATCH pour chacune des colonnes possibles contenant la valeur, ainsi qu'une instruction "IFERROR" avec saisie vierge.

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 maintenant être masquées pour éviter toute confusion/interaction de l'utilisateur.

J'ai ensuite créé un index qui les accumule en une seule valeur, qui doit correspondre à l'emprise en question. De nouveau, il y a un contrôle (premier SUM) pour entrer ceci comme 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 saisi quelques formules de mise en forme conditionnelle pour que l’utilisateur identifie et remplace/supprime les données 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’un signal invitant l’utilisateur à supprimer ces données dupliquées.

enter image description here

2
Richard Allan

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

Quelque part dans les colonnes Avia Eil y a une et une seule cellule contenant 13, renvoie le contenu de la cellule dans la colonne Fdans la même ligne.

Nous allons utiliser une colonne "helper". Dans G1entrez:

=COUNTIF(A1:E1,13)

et copier. Cela nous permet d'identifier la ligne:

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

Choisissez une cellule et entrez:

=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 ligne ou plusieurs lignes contenant 13, nous modifierons la colonne d'assistance.

EDIT # 1:

Sur la base de votre mise à jour, la première étape consisterait à extraire le 13codé en dur des formules de la colonne "aide" et à le placer dans sa propre cellule, (disons H1) . Ensuite, vous pouvez exécuter différents cas en modifiant simplement une cellule.

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

4
Gary's Student

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

Ceci est une formule matricielle, nous devons donc limiter les références à la taille de l'ensemble de données. Tous les INDEX(E:E,MATCH("ZZZ",F:F)) font cela. Ceci retourne la dernière ligne de la colonne F contenant du texte. Il définit ensuite cela comme dernière ligne à parcourir.

La méthode @ Gary'sStudent évite les formules Array et peut être la méthode nécessaire. À mesure que le jeu de données et le nombre de formules augmentent, le temps nécessaire aux calculs augmente également. Même à, à un moment donné, le crash d’Excel. Habituellement, cela prend quelques milliers, mais je tiens à faire l'avertissement.

enter image description here


MODIFIER

Pour éviter d'utiliser des formules Array et rester une 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),I‌​FERROR(MATCH($H1,E:E,0),1050000))),"")

Ceci est basé sur la réponse du PO qui vient de combiner cette méthode en une seule formule.

Cette formule ignorera les entrées en double et renverra la première ligne dans laquelle le nombre est trouvé.

Et comme il s’agit d’une colonne complète non tableau, les références ne nuisent pas aux temps de calcul.

![enter image description here

2
Scott Craner

Une méthode différente serait basée sur une table auxiliaire, qui représente comment ce "devrait" avoir été structuré en premier lieu. Cela éviterait les équations de monstres qui sont gênantes à déboguer et à modifier par la suite, et il est capable 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 Sheet1, ajoutez une feuille Sheet2. Sur cette place, quatre colonnes; Rangée, colonne, identifiant, nom

La formule dans Row devrait être (en code psuedo, "Dernier" signifie "pour la ligne ci-dessus dans la feuille2")

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

Formule dans Column:

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

Formule dans ID et Name:

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

Ensuite, vous remplissez ceci (en gros jusqu'à row> nombre de lignes dans la table d'origine).

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

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

Inconvénients: Besoin d'une table supplémentaire, il faut maintenir la longueur de la table. En termes de performances, il y a un risque, car cela nécessite à peu près un seul thread pour l'ensemble de la "chaîne" de valeurs.

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

1
NiklasJ