Rapport de message :*
 

Re: Recherche de valeur dans une colonne

Titre du sujet : Re: Recherche de valeur dans une colonne
par JeanMarie le 14/10/2012 10:32:48

Bonjour Turfman, Didier, le Forum

Pour savoir si une valeur numérique existe dans une plage, il y a une fonction nommée NB.SI()
=nb.si(C6:C25;E6)
elle retourne soit 0 ou 1. 
Si ceci vaut pour une seule valeur numérique, on peut le faire sur une suite de valeurs
=NB.SI(C6:C25;E6:E25)
Pour que cela fonctionne correctement il faut valider cette partie en matricielle, c'est à dire par les touches Ctrl+Shift+Entrer. Cette partie va retourner une suite de 20 valeurs comportant des 0 ou des 1. Pour voir cette suite de valeur sélectionne une plage de cellules (I6:I25), rentre la formule et valide par Ctrl+Shift+Entrer.


Tu peux remarquer qu'il y a une correspondance entre les valeurs E6:E25 avec les valeurs retournées, elles sont ordonnées. Si l'on recherche dans cette plage retournée la position de la première valeur 1, on pourra l'associer avec la valeur de la plage E6:E25.


Normalement, on devrait utiliser les valeurs de la fonction NB.SI dans une plage (ou tableau) intermédiaire et utiliser une autre cellule pour rechercher et retourner la valeur. Mais restons dans une formule unique qui retournera les valeurs voulues, même si cela va se compliquer....


Ensuite avec la fonction EQUIV on va rechercher la première égale à 1 et avec la fonction INDEX on retourne la valeur. Ce qui donne une formule avec 3 fonctions imbriquées. Validation par Ctrl+Shift+Entrer
=INDEX(E$6:E$25;EQUIV(1;NB.SI(C$6:C$25;E$6:E$25);0);1);"")
Si l'on glisse vers le bas cette formule, on obtiendra systématiquement la même valeur. Il faut donc aller plus loin
et écarter la première valeur déjà retournée. On pourrait le faire par une imbrication dans la fonction NB.SI
=NB.SI(SI(NB.SI(G$6:G6;C6:C25)=0;C$6:C$25;"");E$6:E$25)
Mais seulement voilà, même si Excel ne retourne pas de message d'erreur lors de la validation, la fonction retourne un message d'erreur #VALEUR!, cela veut dire qu'elle n'accepte pas la partie conditionnelle dans le premier argument.
Il faut donc utiliser une autre fonction pouvant retourner une suite de 0 ou de 1 et acceptant la partie conditionnelle. Cette fonction s'appelle FREQUENCE.
Sans vouloir rentrer dans les détails du fonctionnement de cette fonction, il faut remplacer ce qui ne fonctionne pas par 
=FREQUENCE(SI(NB.SI(G$5:G5;C$6:C$25);"";C$6:C$25);(E:E;C:C))


En intégrant cette partie dans la fonction INDEX(...;EQUIV(1;...;0);1), voici la formule à mettre en G6, et à glisser vers le bas.
=SIERREUR(INDEX(E$6:E$25;EQUIV(1;FREQUENCE(SI(NB.SI(G$5:G5;C$6:C$25);"";C$6:C$25);(E:E;C:C));0);1);"")
Je profite que tu es en version office 2007, pour utiliser la fonction SIERREUR pour écarter le message d'erreur.

trufman, j'espère que le développement de la construction de la formule te permettra de comprendre dans les essais infructueux que tu avais fait ce qui n'allait pas. Si tu as une incompréhension sur mes explications, n'hésite pas à me le dire, j'essayerai d'y apporter un éclaircissement.

Si tu souhaites aussi voir la construction de la fonction INDEX(EQUIV()) avec la fonction des tableaux intermédiaires, pose moi la question.
@+Jean-Marie