Somme.si et + si affinités...

B

Ben-Ten

Guest
Salut le Forum,


J'ai une petite question, surement toute bête, mais je pêche un poil dessus...

J'aimerai réaliser une somme.si avec ma plage de recherche qui peut etre variable en fonction d'une date de début et une date de fin.... et donc forcément réaliser mon addition dans cette plage si la condition est réaliser...

mmmm pas très clair....

Plus simplement, j'aimerai qu'entre une date X et une date Y (variables) d'un tableau mensuel, on fasse la somme.si suivant la condition demandée...


=SOMME.SI(ABS!$C5:$AR5;BCP;'C-Répt°'!$C5:$AR5)

sauf qu'au lieu que ce soit ABS!$C5:$AR5, et bien on puisse faire varier les cellules en fonction des dates demandées... avec une sorte de formule

{SOMME('C-Répt°'!C5:AR5*('C-Répt°'!$C$3:$AR$3>=$E5)*('C-Répt°'!$C$3:$AR$3<=$F5))}

mais en mixant les 2 ....

J'espère avoir été clair..... et merci infiniment de m'éclairer l'esprit :)

Vive XLD.....


Ben-Ten
 
M

Monique

Guest
Bonsoir,

Ce n'est trop clair, ton truc.

Peut-être que la fonction SOMME(SI( ferait l'affaire
=SOMME(SI((plage_a=critère_a)*(plage_b=critère_b);plage_à_additionner;0))
Fonction matricielle à valider par ctrl + maj + entrée.

Ci-joint des exemples.
 

Pièces jointes

  • sommesi_date.xls
    16 KB · Affichages: 57
  • sommesi_date.xls
    16 KB · Affichages: 64
  • sommesi_date.xls
    16 KB · Affichages: 55
E

Eric

Guest
Salut,
Je suis nouveau, alors pardonnez mon audace...
Je pense que la formule matricielle suivante (valider avec CTRL+SHIFT+Entrée) peut répondre à ta question :

{=SOMME((date>=date_début)*(date<=date_fin)*plage)}

"date" étant la date attribuée à une somme de ton tableau.
"plage" étant la plage où figurent les données à cumuler.


Les deux comparaisons (>= et <=) permettent de multiplier par zéro les sommes ne remplissant pas les conditions.

j'espère que ça te conviendra.
@+

Eric
 
B

Ben-Ten

Guest
Bonjour,

Désolé de ne pas avoir répondu avant... je n'étais pas là hier... Merci à vous deux de vos réponses...

Monique, je ne peux télécharger ta pièce jointe, peux tu me l'envoyer à ben-10@wanadoo.fr ... je te remercie bien d'avance...

Eric, je viens de lire ta réponse, et je pense que ta solution fait la somme entre les 2 dates.... cependant, cela va plus loin que cela....

En effet,

Avec cette formule :

=SOMME.SI(ABS!$C5:$AR5;BCP;'C-Répt°'!$C5:$AR5)

je fais la somme dans 'C-Répt°'!$C5:$AR5 .... seulement SI dans ABS!$C5:$AR5 je trouve la condition BCP. On a donc une feuille de recherche de la condition qui est ABS et une feuille où il fait le calcul le cas échéant qui est C-Répt°...

De ABS!$C5:$AR5, on trouve des codifications (BCP, RCP, BAM, RAM ...) et en ABS!$C3:$AR3, 2 lignes au dessus donc, on trouve des dates.

Ce que je voudrai faire, c'est réduire la zone de recherche de la formule =SOMME.SI(ABS!$C5:$AR5;BCP;'C-Répt°'!$C5:$AR5) en fonction d'une date de début et d'une date de fin .... qui se cherchera dans ABS!$C3:$AR3, et en fonction de cela faire la somme.si ... si je trouve la condition (dans l'exemple en l'ocurrence BCP) dans la plage ligne 5 en fonction de la date de début et date de fin , somme qui se fera sur la meme plage (variable) dans la feuille C-Répt°.... Voilà .....

Je ne sais si j'ai été plus clair qu'auparavant....

J'essaierai de préparer en cas un fichier exemple ....

Merci à tous pour vos réponses... et merci encore à vous deux...

Ben-Ten
 
E

Eric

Guest
Re salut,

Je pense pourtant que la formule fonctionne...
Je te joints un fichier exemple et t'en envoie une copie par mail.

Tiens-moi au courant,

@+

Eric
 

Pièces jointes

  • somme_matricielle.xls
    14 KB · Affichages: 45
J

Jean-Marie

Guest
Bonjour tout le monde.

Moi personnellement, je fairais un calcul de plage dynamique à l'aide des fonction adresse() et indirect() ou avec decaler().

La pièce jointe, utilise les fontions indirect() et adresse()

Une fonction matricielle pourrait faire le même travail, mais elle serait plus longue en temps de calcul suivant la quantité des données de ta base.

@+Jean-Marie
 

Pièces jointes

  • SommeSiadressedynamique.xls
    20 KB · Affichages: 57
B

Ben-Ten

Guest
Merci ... merci encore de vos propositions....

Je suis en train de regarder tout çà .... et je vais l'appliquer ensuite à mon fichier...... Je vous tiens au courant dès que possible...

en attendant, si kelku'un a un commentaire sur l'une ou l'autre méthode, qu'il n'hésite pas... C'est très intéressant tout çà !!!

Merci Monique et Jean-Marie ....

@ plus.....

Ben-Ten
 
E

Eric

Guest
Bonsoir à tous,

Je suis désolé de vous embêter avec des détails
mais je débute alors...
Je ne parviens pas à ouvrir ni télécharger vos fichiers joints.
A cause de ça, j'ai un peu de mal à suivre...
Comment faire, à chaque fois que j'essaie, de chez moi ou au boulot, je retombe sur le forum.

Ben-Ten et Jean-Marie, si vous pouviez m'envoyer par mail vos fichiers,
je vous en serais reconnaissant.

Merci d'avance,
@ +

Eric

PS : je laisse le lien sur mon Maiul perso car mon ordi perso déconne en ce moment.
 
E

Eric

Guest
Bonsoir à tous,

Je suis désolé de vous embêter avec des détails
mais je débute alors...
Je ne parviens pas à ouvrir ni télécharger vos fichiers joints.
A cause de ça, j'ai un peu de mal à suivre...
Comment faire, à chaque fois que j'essaie, de chez moi ou au boulot, je retombe sur le forum.

Ben-Ten et Jean-Marie, si vous pouviez m'envoyer par mail vos fichiers,
je vous en serais reconnaissant.

Merci d'avance,
@ +

Eric

PS : je laisse le lien sur mon Maiul perso car mon ordi perso déconne en ce moment.
 
B

Ben-Ten

Guest
Bon voilà.... J'ai la solution dans les 2 cas... avec votre très grande participation dont je vous remercie infiniment....

dans la méthode de Jean-Marie, que je trouve vraiment bien car très recherchée, et puis parce que j'aime bien aussi jouer avec les Index, Equiv, Décaler, Recherche etc..., la formule qui fonctionne est la suivante :

=SI(E5=0;0;SI(G5=0;SOMME.SI(INDIRECT("ABS!"&ADRESSE(LIGNE($A5);EQUIV($E5;ABS!$3:$3;0))&":"&ADRESSE(LIGNE($A5);EQUIV($F5;ABS!$3:$3;0)));"BCP";INDIRECT("'C-Répt°'!"&ADRESSE(LIGNE($A5);EQUIV($E5;ABS!$3:$3;0))&":"&ADRESSE(LIGNE($A5);EQUIV($F5;ABS!$3:$3;0))))+SOMME.SI(INDIRECT("ABS!"&ADRESSE(LIGNE($A5);EQUIV($E5;ABS!$3:$3;0))&":"&ADRESSE(LIGNE($A5);EQUIV($F5;ABS!$3:$3;0)));"RCP";INDIRECT("Plan!"&ADRESSE(LIGNE($A5);EQUIV($E5;ABS!$3:$3;0))&":"&ADRESSE(LIGNE($A5);EQUIV($F5;ABS!$3:$3;0))));SOMME.SI(INDIRECT("ABS!"&ADRESSE(LIGNE($A5);EQUIV($E5;ABS!$3:$3;0))&":"&ADRESSE(LIGNE($A5);EQUIV($G5;ABS!$3:$3;0)));"BCP";INDIRECT("'C-Répt°'!"&ADRESSE(LIGNE($A5);EQUIV($E5;ABS!$3:$3;0))&":"&ADRESSE(LIGNE($A5);EQUIV($G5;ABS!$3:$3;0))))+SOMME.SI(INDIRECT("ABS!"&ADRESSE(LIGNE($A5);EQUIV($E5;ABS!$3:$3;0))&":"&ADRESSE(LIGNE($A5);EQUIV($G5;ABS!$3:$3;0)));"RCP";INDIRECT("Plan!"&ADRESSE(LIGNE($A5);EQUIV($E5;ABS!$3:$3;0))&":"&ADRESSE(LIGNE($A5);EQUIV($G5;ABS!$3:$3;0))))))


Ne prenez pas peur... çà fonctionne d'enfer... :)

Ensuite, je me suis penché sur la méthode de Monique avec les formules matricielles ( d'ailleurs dans ma question , je faisais référence à ces formules matricielles que j'ai découvert y'a peu de temps et dont je sens d'énormes possibilités dans mon boulot ...).
Ca donne çà :

={SI(G5=0;SOMME('C-Répt°'!C5:AR5*(ABS!$C$3:$AR$3>=E5)*(ABS!$C$3:$AR$3<=F5)*(ABS!C5:AR5="BCP"))+SOMME(Plan!C5:AR5*(ABS!$C$3:$AR$3>=E5)*(ABS!$C$3:$AR$3<=F5)*(ABS!C5:AR5="RCP"));SOMME('C-Répt°'!C5:AR5*(ABS!$C$3:$AR$3>=E5)*(ABS!$C$3:$AR$3<=G5)*(ABS!C5:AR5="BCP"))+SOMME(Plan!C5:AR5*(ABS!$C$3:$AR$3>=E5)*(ABS!$C$3:$AR$3<=G5)*(ABS!C5:AR5="RCP")))}


Voilà, donc je pense choisir la formule matricielle car ces formules sont faites pour les appliquer dans des cas comme cela, meme si je le répète la proposition de Jean-Marie est très ingénieuse.... (j'aurai appris à bien maitriser les adressages maintenant ... :) )

Par contre, une petite question pour toi Monique :

Dans ton fichier exemple, tu mets une formule qui calcule du 1/5 au 31/5 pour machin, untel ou truc qui est la suivante :

={SOMME(SI((date_02>=H13)*(noms_02=H15);nombres;0))-SOMME(SI((date_02>H14)*(noms_02=H15);nombres;0))}

Tu calcules ainsi la somme selon le critère machin, untel ou truc ET supérieur à la date du 01/05 ...ensuite tu soustraits la somme sur meme critère et pour la date supérieure au 31/05 ... Tu obtiens ainsi la somme uniquement entre le 01/05 et 31/05 ...

J'aimerai savoir pourquoi tu procèdes ainsi plutot que de faire comme ceci par exemple :

={SOMME(nombres*(date_02>=H13)*(date_02<=H14)*(noms_02=H15))}

J'aimerai savoir s'il y a une différence que j'aurai pas captée....
J'attends ta réponse....


En tout cas, je vous remercie infiniment tous, et çà fait plaisir de voir un forum aussi actif et intéressant.... Vive XLD....

Ben-Ten
 
M

Monique

Guest
Bonjour,

Merci, Ben-Ten.
Je ne pense jamais que SOMME(()*()*()) existe.
Les fonctions SOMME(SI, SOMME.SI, SOMMEPROD(SI fonctionnent tellement bien que c'est surtout elles que j'utilise.
Pourquoi faire simple quand on peut fair compliqué ?
 
E

Eric

Guest
Salut Benten et tous les autres,

Même si je débute, je suis un peu tenace et même si ma solution laisse tout le monde perplexe...je persévère
Alors je vousrenvoie la version 3 du fichier.
Même si les soultions des autres ont parfaitement répondu au problème de BenTen, pouvez-vous me dire ce que vous en pensez.
Merci d'avance

A+
Eric
 

Pièces jointes

  • somme_matricielle_3.xls
    18.5 KB · Affichages: 52

Discussions similaires

Statistiques des forums

Discussions
314 645
Messages
2 111 536
Membres
111 184
dernier inscrit
amiko