[RESOLU(cisco)] demande explication formule matricielle de CHRIS24

Roland_M

XLDnaute Barbatruc
Bien le bonjour à tous,

je me débrouille pas trop mal en VB mais je suis complètement nul en fonction !

j'ai récupéré une formule d'un internaute CHRIS24 (s'il passe par ici ce sera bien)
le but étant d'afficher en colonne les valeurs sans doublons d'une liste et une autre colonne le nbr de fois

j'ai mis un cadre avec ma demande dans ce petit fichier ce qui sera plus simple

merci d'avance à tous ceux qui pourraient m'apporter l'explication souhaitée !
 

Pièces jointes

  • ExplicationFormulMatricielChris24.xlsx
    17.2 KB · Affichages: 42

CISCO

XLDnaute Barbatruc
Bonjour

Pour le moment, je n'ai pas le temps, donc, j'essayerai de t'expliquer cela plus tard...

Est-ce que tu as essayé de comprendre avec Formules --> Évaluation de formule ? Si tu travailles avec des plages trop grandes, cela ne sera pas très compréhensible. Le mieux, c'est de faire un exemple bidon travaillant seulement sur une dizaine de lignes, avec des cas VRAI et des cas FAUX, bien sûr.

@ plus
 

Chris24

XLDnaute Impliqué
Bonjour Roland_M, CISCO

Cette formule est issue de ma jeunesse:(, au temps du forum microsft excel, c'est un ténor de cette époque qui l'avait écrite.
pour des explications je ne suis pas en mesure d'en donner, j'ai moi même quelques difficultés à appréhender la fonction Ligne()

Cordialement
 

Roland_M

XLDnaute Barbatruc
Bonjour,

bon, le moins que l'on puisse dire c'est que ça ne se bouscule pas au portillon !

j'ai effectué qq recherches et grâce à CISCO qui a éclairé ma lanterne en m'indiquant l'utilisation "Évaluation de formule" et sa remarque "Pour être plus précis, LIGNE(A1:A10) donne {1;2;3;4;5;6;7;8;9;10} si placée dans une formule matricielle"

j'ai réussi à comprendre la différence importante avec la comparaison en forme de matrice !

encore merci à toi CISCO !
 

CISCO

XLDnaute Barbatruc
Bonjour

Un peu tard, mais bon. Par ex, en ligne 10, on a
Code:
INDEX($A:$A;MIN(SI(INDIRECT(CellRangDon)<>"";
SI(NB.SI($H$1:H9;INDIRECT(CellRangDon))=0;LIGNE(INDIRECT(CellRangDon));
CellNbrLig+2))))

CellRangDon désigne l'adresse de la plage considérée, écrite au format texte.
INDIRECT permet l'utilisation de ce texte, donc INDIRECT(CellRangDon) est une plage.
NB.SI($H$1:H9;INDIRECT(CellRangDon)) renvoie 0 pour toutes les valeurs de cette plage pas encore citées dans le début de la colonne H, dans $H$1:H9, et une autre valeur dans les autres cas.
SI(NB.SI($H$1:H9;INDIRECT(CellRangDon))=0 renvoie VRAI pour les valeurs de cette plage pas encore citées dans le début de la colonne H, FAUX pour les autres.
LIGNE(INDIRECT(CellRangDon)) renvoie les n° de ligne correspondant à cette plage ( de 2 à 15 dans l'exemple en pièce jointe).
CellNbrLig+2 renvoie le n° de la première ligne, juste après cette plage (16 dans l'exemple en pièce jointe).

On a donc une formule de la forme SI(test;valeur si VRAI;valeur si FAUX). A chaque VRAI correspond un n° de ligne compris entre 2 et 15. Le MIN permet de ne choisir que le plus petit de cette liste, donc d'écrire la première valeur de la plage pas encore citée dans la colonne H. A chaque FAUX correspond le nombre 16.
Dans H9, on a donc quelque chose du genre MIN(16;16;....;16;16;14;15), ce qui donne 14. Et la formule renvoie le contenu de A14, c.-à-d. 800.
Un peu plus bas dans la colonne H, lorsque toutes les valeurs de la plage ont été citées une fois, on n'a plus que des FAUX, et la formule matricielle renvoie le contenu de A16, c.-à-d. rien.

On peut aussi faire avec
Code:
SI(MIN(NB.SI($H$1:H1;INDIRECT(CellRangDon)));
"";
INDEX($A:$A;MIN(SI(INDIRECT(CellRangDon)<>"";
SI(NB.SI($H$1:H1;INDIRECT(CellRangDon))=0;LIGNE(INDIRECT(CellRangDon)))))))

MIN(NB.SI($H$1:H1;INDIRECT(CellRangDon))) renvoie toujours un 0 tant que toutes les valeurs de la plage étudiée n'ont pas été citées une fois dans le début de la colonne H. Et comme 0 équivaut à FAUX pour EXCEL, la formule ci-dessus donne
Code:
INDEX($A:$A;MIN(SI(INDIRECT(CellRangDon)<>"";
SI(NB.SI($H$1:H1;INDIRECT(CellRangDon))=0;LIGNE(INDIRECT(CellRangDon))))))
, donc la valeur de la partie finale déja étudiée.
MIN(NB.SI($H$1:H1;INDIRECT(CellRangDon))) renvoie toujours un 1, dès que toutes les valeurs de la plage étudiée ont été citées une fois dans la colonne H. Et comme un 1 (ou tout autre nombre >=1) équivaut à VRAI, cela donne
Code:
SI(VRAI;"";...)
donc "".

Autrement dit, c'est une autre méthode donnant la même chose sans faire intervenir le contenu de la cellule A16.

@ plus
 
Dernière édition:

Statistiques des forums

Discussions
312 201
Messages
2 086 171
Membres
103 152
dernier inscrit
Karibu