1 votes

Chercher une valeur dans une liste et renvoyer TOUTES les valeurs multiples correspondantes

La réponse de base à ma question est fournie ici : Comment rechercher une valeur dans une liste et renvoyer plusieurs valeurs correspondantes ? . Cependant, une fois la formule saisie, je dois glisser vers le bas, ou copier/coller la formule, pour obtenir le reste des valeurs correspondantes. Je cite l'article :

Lorsque vous saisissez ou remplissez cette formule dans les cellules suivantes, la formule renvoie les valeurs correspondantes suivantes

Cependant, je n'ai aucun moyen de savoir combien de valeurs je dois attendre, et donc aucun moyen de savoir jusqu'où copier/coller la formule. Copier et coller la formule jusqu'au bout fait planter Excel.

EDITAR Si mes données ressemblent à ça :

Tag | Loc | Time
---|---|----
NN | IN | 7
CD | OUT | 4
VB | OUT | 12
NN | OUT | 4
NN | IN | 2
NN | OUT | 6
VB | OUT | 23
VB | OUT | 4
VB | IN | 6

Je voudrais effectuer des tests t pour chaque étiquette, en comparant les temps d'entrée et de sortie. En utilisant la formule INDEX, je pourrais, hypothétiquement, récupérer tous les temps pour, par exemple, NN & OUT.

2voto

XOR LX Points 1127

Je pense que le problème ici est que la suggestion donnée dans ce lien pour traiter les résultats des formules dans les lignes au-delà du nombre de retours attendus est simplement d'envelopper la formule dans une sorte de clause IFERROR.

Toutefois, cette configuration est extrêmement inefficace, en particulier si l'ensemble de données en question est dynamique et potentiellement en expansion.

Le fait est que, si vous avez une installation telle que :

\=IFERROR([ une_grande_formule_réseau ],"")

qui est destiné à être copié sur un nombre suffisant de lignes de manière à encapsuler tous les retours souhaités, vous serez alors confronté à deux choix.

Tout d'abord, vous pouvez effectuer un calcul pour déterminer précisément le nombre de déclarations de ce type que vous aurez à un moment donné, puis faire glisser cette formule sur ce nombre de lignes. Évidemment, ce n'est pas idéal, et encore moins si vous avez, comme je l'ai dit, un ensemble de données qui change de façon dynamique.

Deuxièmement, nous pouvons copier les formules sur un nombre arbitrairement grand de lignes, de sorte que nous sommes assurés de couvrir tous les rendements possibles, même si notre ensemble de données s'élargit à l'avenir, et nous n'avons donc pas à nous en préoccuper à nouveau.

Il est évident que cette deuxième méthode est préférable dans la pratique. Le problème avec la construction IFERROR (encore pire si vous êtes en 2003 ou avant et que vous devez utiliser une clause IF(ISERROR) répétée) est que, dans les lignes où la formule est copiée au-delà de ce qui est effectivement nécessaire, il n'y a rien pour empêcher la formule de tableau volumineuse et lourde en ressources de calculer inutilement.

Le fait est que, dans la construction ci-dessus, même dans les lignes au-delà de celle contenant notre dernier rendement attendu, Excel doit encore dépenser toutes les ressources pour calculer la partie de la formule du tableau avant de pouvoir décider par lui-même s'il s'agit en fait d'une erreur ou non.

Bien, bien mieux que cette approche IFERROR oiseuse - qui est malheureusement recommandée de manière presque omniprésente pour cette configuration dans les diverses sources sur Internet - est, comme James le fait remarquer, d'utiliser une seule cellule "d'aide" pour déterminer d'abord le nombre de lignes que l'on s'attend à avoir en retour, puis d'y faire référence dans la formule.

Ainsi, par exemple, si les données affichées se trouvent dans A1:C10 (avec les en-têtes à la ligne 1) et que nous mettons par exemple NN dans E1 et OUT dans F1, nous commencerons par saisir une formule unique, hors tableau, dans G1 par exemple :

\=SUMPRODUCT(0+(A2:A10=E1),0+(B2:B10=F1))

La **formule du tableau**** dans notre première cellule de choix serait alors :

\=IF(ROWS($1:1)>$G$1,"",INDEX($C$2:$C$10,SMALL(IF($A$2:$A$10=$E$1,IF($B$2:$B$10=$F$1,ROW($C$2:$C$10)-MIN(ROW($C$2:$C$10)))+1)),ROWS($1:1))))

et copié vers le bas si nécessaire.

Certes, il reste à savoir jusqu'où copier cette formule. Et même si nous avons mis en place un calcul pour déterminer le nombre de lignes requis, nous ne voulons toujours pas avoir à réajuster manuellement le nombre de cellules contenant les formules chaque fois que nous voulons mettre à jour les résultats. Il doit s'agir d'un travail initial unique.

Je ne recommanderais certainement pas de copier jusqu'à la fin de la feuille de calcul. Toutefois, si l'on peut choisir une limite supérieure suffisamment large, le fait de se retrouver avec plusieurs milliers de cellules superflues contenant des formules ne devrait pas avoir une grande incidence sur les performances. La raison en est qu'ici, la clause initiale, et la grande différence entre cette configuration et l'approche IFERROR "paresseuse", est la suivante :

\=IF(ROWS($1:1)>$G$1,""

signifie que, dans les lignes qui dépassent le nombre de retours prévu, la clause IF renvoie VRAI et un blanc est donc renvoyé. L'avantage de la fonction IF est que, si la clause qui lui est transmise est VRAIE, la partie FAUSSE (ici, une formule de tableau volumineuse et gourmande en ressources) n'est même pas prise en compte dans le calcul.

Ce n'est pas du tout le cas de la version IFERROR, qui continue à tourner sans se soucier du fait que ses calculs sont inutiles et représentent une charge pour les ressources.

Salutations

**Les formules de tableau ne sont pas saisies de la même manière que les formules "standard". Au lieu d'appuyer simplement sur ENTRÉE, vous devez d'abord maintenir les touches CTRL et SHIFT enfoncées, puis appuyer sur ENTRÉE. Si vous l'avez fait correctement, vous remarquerez qu'Excel place des accolades {} autour de la formule (mais n'essayez pas de les insérer manuellement vous-même).

0voto

CallumDA Points 1015

Je dirais que vous devez formater vos données dans un tableau (Accueil>Formater en tableau), ou créer une plage dynamique nommée sur vos données. Cela résout le problème de ne pas savoir combien de données vous aurez, car la plage/tableau augmentera au fur et à mesure que de nouvelles données seront ajoutées, tout en vous permettant de vous référer à la plage/tableau par son nom.

tldr : format comme tableau, si c'est le premier tableau de votre classeur, le tableau sera nommé "Tableau1".

Je vous suggère de créer un tableau croisé dynamique à ce stade (en utilisant le nom de votre tableau/plage comme source) et de mettre "Tag" dans les étiquettes de ligne, "Loc" dans les étiquettes de colonne et "Time" dans les valeurs. Vous obtiendrez des données qui ressemblent à ceci :

. IN OUT CD 4 NN 9 10 VB 6 39

Vous pouvez ensuite ajouter une formule simple à droite et la faire glisser vers le bas pour calculer la différence entre IN et OUT.

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