Autres critères doubles dans formule matricielle

infam29

XLDnaute Nouveau
Bonjour à tous,
Petit souci avec Excel 2003: j'ai besoin d'extraire avec une formule matricielle le nom des membres d'une association selon 2 critères cumulatifs: "cotisation non payée ET membre non décédé".
"Nb.si" n'acceptant qu'un seul critère, j'ai testé et re-testé "sommeprod" sans succès.
J'ai réussi par macro mais le système est d'une trop grande lenteur (et je préfère le matriciel).
En PJ un fac-similé de mon fichier dans lequel j'explique visuellement ce que je souhaite (sans la macro énoncée ci-dessus).
Une aide me serait précieuse.
Merci infiniment à ceux qui voudront bien se pencher sur mon problème. Attention quand même de ne pas tomber :)
 

Pièces jointes

  • test retard.xls
    105.5 KB · Affichages: 2

Dugenou

XLDnaute Barbatruc
Bonjour,
Plusieurs observations au sujet de ta formule :
=SI(LIGNES(Cotisations!$1:1)<=SOMMEPROD((Cotisations!$E$5:$E$24=0)*(Cotisations!$F$5:$F$24<>"DCD"));INDEX(Cotisations!C5:C24;PETITE.VALEUR(SI(SOMMEPROD(($E$5:$E$24=0)*($F$5:$F$24<>"DCD"));LIGNE(INDIRECT("1:"&LIGNES(Cotisations!$E$5:$E$24))));LIGNES(Cotisations!$1:1)));"")
1) dans tes conditions ; $E$5:$E$24=0 et $F$5:$F$24<>"DCD" : font appel aux cellules de la feuille retard (le nom de feuille n'est pas précisé : donc ça ne peut pas fonstionner
2) dans tes conditions toujours, le sommeprod est inutile ou du moins il est en double avec le SI : soit tu écris PETITE.VALEUR((SOMMEPROD(($E$5:$E$24=0)*($F$5:$F$24<>"DCD")*ligne(....);k)
soit PETITE.VALEUR(SI(($E$5:$E$24=0)*($F$5:$F$24<>"DCD");ligne(..));k)
Enfin, à titre personnel je ne suis pas à l'aise avec LIGNE(INDIRECT("1:"&LIGNES(....)

Voir fichier en pj avec ma formule : =SIERREUR(INDEX(Cotisations!$C$1:$C$24;PETITE.VALEUR(SI((Cotisations!$E$5:$E$24=0)*(Cotisations!$F$5:$F$24<>"DCD");LIGNE(Cotisations!$E$5:$E$24));NBVAL(Retard!$C$4:C4)));"") qui donne le résultat attendu.
Bien noter que la zone d'index commence à la ligne 1 : INDEX(Cotisations!$C$1:$C$24 puisque ce que le reste de la formule renvoie est un N° de ligne et pas un N° d'index.

Pour éviter les affichage d'erreur j'ai ajouté un sierreur. Si tu utilises vraiment la version 2003 tu peux remettre ton SI(LIGNES($1:1)<=SOMMEPROD((Cotisations!$E$5:$E$24=0);....

Cordialement
 

Pièces jointes

  • infam29.xls
    114 KB · Affichages: 4

infam29

XLDnaute Nouveau
Analyse rapide et j'y trouve mon bonheur. Merci encore à toi, Dugenou (mais pas mou ;)).
Cependant afin de ne pas mourir idiot, je souhaiterais une explication sur le début de la formule.
Je ne connais pas cette expression "xlfn.IFERROR ..." Que signifie ce "xlfn" ?
=_xlfn.IFERROR(INDEX(Cotisations!$C$1:$C$24;PETITE.VALEUR(SI((Cotisations!$E$5:$E$24=0)*(Cotisations!$F$5:$F$24<>"DCD");LIGNE(Cotisations!$E$5:$E$24));NBVAL(Retard!$C$4:C4)));"").
 

Dugenou

XLDnaute Barbatruc
Hello,
C'est le SIERREUR dont je te parlais qui est une fonction accessible avec les version ultérieures à 2003.
la syntaxe est sierreur(formule;valeur si erreur) : ça te donne soit le résultat de la formule soit la valeur si erreur quand ta formule renvoie une erreur.

Je ne sais pas précisément pourquoi c'est traduit en xlfn... peut être parce que tu as un complément qui rend cette fonction compatible avec ta version Excel

Cordialement
 

infam29

XLDnaute Nouveau
Bonjour précieux Dugenou,
Un grand merci de tes explications. Ce "_xlFn" indique bien une incompatibilité avec XL 2003.
J'ai remplacé le "SIERREUR" par ta suggestion =SI(LIGNES(Cotisations!$1:1)<=SOMMEPROD((Cotisations!$E$5:$E$24=0)*(Cotisations!$F$5:$F$24<>"DCD"));INDEX(.....) et tout fonctionne à merveille.
Donc problème résolu et mercis renouvelés
 

Statistiques des forums

Discussions
315 096
Messages
2 116 184
Membres
112 677
dernier inscrit
Justine11