Bonjour
Il faut valider les deux formules,colonnes J et K, en matricielle, donc avec les 3 touches Ctrl+maj+entrer, et pas juste avec entrer. Si tu oublies de le faire, il faut sélectionner la cellule, cliquer dans la barre de formule, et appuyer sur les 3 touches. Cela fait apparaitre les accolades, { et }, devant et derrière.
Si tu veux voir ce que cela donne, cliques sur Formules, puis sur Evaluation de formule, puis suivant, et regarde les résultats intermédiaires présentés dans la fenêtre.
Dans la colonne J, tu avais oublié de valider en matriciel, donc la formule ne fonctionnait pas.
Quelques explications. Dans J7, tu as :
SI(LIGNES($1:1)>SOMME(1*(Liste!B$2:B$30=$G$4));"";INDEX(Liste!D$1: D$30;MIN(SI((Liste!$B$2:$B$30=$G$4)*(NB.SI(J$6:J6;Liste!D$2: D$30)=0);LIGNE($2:$26)))))
LIGNES($1:1) te renvoie 1, c.à-d. le nombre de lignes depuis le début des calculs.
SOMME(1*(Liste!B$2:B$30=$G$4)) te donne le nombre de cellules dans la feuille Liste dans la colonne B, contenant la même chose que le service contenu dans G4.
Cela ne fonctionne ainsi que parce qu’on a validé en matriciel. Si on ne le fait pas, Excel ne compare que B2 à G4, alors qu'il faut comparer B2, B3, B4, et ainsi de suite jusqu'à B30 à G4. Regardes bien la différence sur les deux images ci-dessous, la première sans validation, la seconde avec.
Regarde la pièce jointe 1009474 Regarde la pièce jointe 1009475
ce qui donnent respectivement
Regarde la pièce jointe 1009476 Regarde la pièce jointe 1009477
Le gros morceau...(Liste!$B$2:$B$30=$G$4)*(NB.SI(J$6:J6;Liste!D$2: D$30)=0)*(NB.SI(J$6:J6;Liste!D$2: D$30)=0)
Dans Excel, on peut presque tout le temps remplacer le ET par un * (et le OU par un +), comme en automatisme, en logique, en...
(Liste!$B$2:$B$30=$G$4) renvoie VRAI si Bx contient la même chose que G4, FAUX dans le cas contraire. On a donc une série de VRAI et de FAUX, par ex {FAUX;FAUX;FAUX;VRAI;VRAI;VRAI;FAUX;FAUX;FAUX....}. Cela permet de ne garder que les lignes correspondant au service concerné.
NB.SI(J$6:J6;Liste!D$2: D$30) te renvoie le nombre de J6 dans la plage D$2: D$30. Donc, comme J6 = "", et qu'il ni y a pas de cellule vide dans la plage D$2: D$30, cela renvoie {0;0;0;0....} (D2 n'est pas égal à J6, D3 n'est pas égal à J6, et ainsi de suite).
(NB.SI(J$6:J6;Liste!D$2: D$30)=0) renvoie donc une série de VRAI
On a donc un produit du style {FAUX;FAUX;FAUX;VRAI;VRAI;VRAI;FAUX;FAUX;FAUX....} * {VRAI;VRAI;VRAI;VRAI...} = {0;0;0;1;1;1;0;0;0...} puisque VRAI*VRAI donne 1 alors que tous les produits contenant au moins un FAUX donne 0.
Avec SI((Liste!$B$2:$B$30=$G$4)*(NB.SI(J$6:J6;Liste!D$2: D$30)=0);LIGNE($2:$26)), chaque 1 reçoit le n° de la ligne correspondante.
MIN renvoie le plus petit de ces n°.
INDEX(....; ...) renvoie le contenu de la ligne choisie dans la plage D1: D30.
Dans J8, on veut faire la mêm chose, en éliminant le nom déja cité dans J7. Donc, dans J8, on a presque la même équation :
=SI(
LIGNES($1:2)>SOMME(1*(Liste!B$2:B$30=$G$4));"";INDEX(Liste!D$1: D$30;MIN(SI((Liste!$B$2:$B$30=$G$4)*(NB.SI(
J$6:J7;Liste!D$2: D$30)=0);LIGNE($2:$26))))). Seules les parties en rouge sont différentes.
LIGNES($1:2) renvoie 2
NB.SI(
J$6:J7;Liste!D$2: D$30) renvoie
Regarde la pièce jointe 1009478
Cette fois, on a un 1 (qui correspond au contenu de J7 qui existe une fois dans la plage D2: D30) noyé au milieu des 0. Dans son cas, NB.SI (...) =0 va renvoyer une série de Vrai et un FAUX correspondant au nom déja cité dans J7, donc le nom contenu dans J7 n'est plus accepté. Cela ne sera plus lui qui sera sur la ligne MIN choisie finalement.
Je te laisse "jouer" avec la fenêtre "Evaluation de formule" pour essayer de comprendre la suite. Si tu as du mal, essaye de te construire un exemple avec une plage plus petite que D2: D30 (La fenêtre "Evaluation de formule" est malheureusement souvent trop petite pour qu'on voit tous les résultats intermédiaires facilement. Il faut utiliser l’ascenseur à droite, et cela n'est pas très pratique, sauf si on a une mémoire gargantuesque).
Pour K7, c'est presque la même méthode, sauf que les noms éliminés ne se trouvent pas au-dessus, dans la colonne K, mais dans la plage D7: D15, la plage des noms déjà utilisés. PETITE.VALEUR permet de ne citer que le premier nom, puis, en dessous, le deuxième, et encore en dessous, le troisième et ainsi de suite.
@ plus