Re : liste déoroulante sur plage de valeurs liste dynamique, ordonnée sur 2 critères
Bonjour
Une petite explication pour t'aider à progresser :
=INDEX($E$1:$E$471;MIN(SI((NB.SI(BR$4:BR4;TAB_OPERATEURS[NOM+PRENOM])=0)*SI(LIGNES(BR$4:BR4)<=NB.SI(TAB_OPERATEURS[CANULE];"T");TAB_OPERATEURS[CANULE]="T";TAB_OPERATEURS[CANULE]="R");LIGNE(TAB_OPERATEURS[CANULE]))))
SI(NB.SI(BR$4:BR4;TAB_OPERATEURS[NOM+PRENOM])=0;LIGNE(TAB_OPERATEURS[CANULE]) permet de ne garder en mémoire que les n° de ligne des noms pas encore cités au dessus dans la colonne BR. Sur la ligne 5, cette formule compare le contenu de BR4 avec TAB_OPERATEURS[NOM+PRENOM]. Sur la ligne 6, cette formule compare le contenu de BR4 et de BR5 avec TAB_OPERATEURS[NOM+PRENOM]. Sur la ligne 7, c'est BR4, BR5 et BR6... Et ainsi de suite. Seuls les noms non encore cités donnent NB.SI(...;....) = 0.
MIN(SI(NB.SI(BR$4:BR4;TAB_OPERATEURS[NOM+PRENOM])=0;LIGNE(TAB_OPERATEURS[CANULE])) renvoie le 1er n° de ligne des noms pas encore cités au dessus dans la colonne BR.
INDEX($E$1:$E$471;MIN(SI(NB.SI(BR$4:BR4;TAB_OPERATEURS[NOM+PRENOM])=0;LIGNE(TAB_OPERATEURS[CANULE]))) renvoie le premier nom pas encore cités dans la colonne BR, pris dans la colonne E, correspondant à ce MIN.
Mais on ne veut pas tous les noms de la colonne E transférés dans la colonne BR, on veut d'abord les titulaires (marqués donc avec un T en colonne K), et une fois que tous les titulaires ont été cités, on veut les remplaçants (avec un R en colonne K).
Pour n'avoir que les titulaires, on peut faire avec
MIN(SI((NB.SI(BR$4:BR4;TAB_OPERATEURS[NOM+PRENOM])=0)*(TAB_OPERATEURS[CANULE]="T");LIGNE(TAB_OPERATEURS[CANULE])) mais on veut d'abord les titulaires, puis les remplaçants.
Pour voir si on a cité tous les titualires, on rajoute la condition SI(LIGNES(BR$4:BR4)<=NB.SI(TAB_OPERATEURS[CANULE];"T");réponse si VRAI; réponse si FAUX), plus précisément ici SI(LIGNES(BR$4:BR4)<=NB.SI(TAB_OPERATEURS[CANULE];"T");TAB_OPERATEURS[CANULE]="T"; TAB_OPERATEURS[CANULE]="R")
NB.SI(TAB_OPERATEURS[CANULE];"T") donne le nombre de T en colonne K, donc le nombre de titulaires. Donc, tant qu'on a pas cité tous les titulaires, on teste TAB_OPERATEURS[CANULE]="T" (pour trouver le titulaire suivant), qui donne VRAI pour les titulaires et FAUX pour les autres.
Après, on teste TAB_OPERATEURS[CANULE]="R" (pour trouver le 1er remplaçant, puis le 2nd...) qui donne VRAI pour les remplaçants, et FAUX pour les autres.
SI((NB.SI(BR$4:BR4;TAB_OPERATEURS[NOM+PRENOM])=0)*SI(LIGNES(BR$4:BR4)<=NB.SI(TAB_OPERATEURS[CANULE];"T");TAB_OPERATEURS[CANULE]="T";TAB_OPERATEURS[CANULE]="R");LIGNE(TAB_OPERATEURS[CANULE]) renvoie donc quelque chose du genre SI({VRAI.VRAI.FAUX......FAUX}*{VRAI.FAUX.......VRAI};LIGNE(TAB_OPERATEURS[CANULE]). Cela donne SI({1.0.0.......0};LIGNE(TAB_OPERATEURS[CANULE]), qui devient une liste de n° de ligne et de FAUX.
La formule donne donc les n° de lignes des noms non encore cités au dessus en colonne BR, titulaires au début. MIN permet de ne renvoyer que le premier n° de cette liste. INDEX(... permet de renvoyer le nom pris dans la colonne E correspondant à ce n° de ligne. Ensuite, on fait de même avec les remplaçants.
@ plus
P.S : Pour voir toutes les étapes intermédiaires, cliquer sur "Formules", puis sur "Evaluation de formule"