Somme d'une colonne selon période
RésoluLe Pingou Messages postés 12350 Date d'inscription Statut Contributeur Dernière intervention -

J'ai un tableau avec une colonne de prix mensuel (ces prix changent régulièrement), une colonne où sont indiqués les dates de changement de prix et une autre colonne qui donne les montants journaliers selon les différentes dates et les prix mensuel.
Je voudrais avoir le montant total d'une période donnée (cellule J5).
Je mets le tableau en PJ
Merci
- Somme d'une colonne selon période
- Déplacer une colonne excel - Guide
- Formule somme excel colonne - Guide
- Trier une colonne excel - Guide
- Colonne word - Guide
- Somme si couleur - Guide
55 réponses
Le problème est de calculer le total sur une période donnée à partir d’un tableau où le prix mensuel change à des dates et où le résultat doit être affiché en J5. La solution principale propose une approche en trois segments et une formule matricielle utilisant SOMME.SI.ENS pour sommer les jours correspondant à chaque sous-période, la formule devant être validée en tant que matrice (Ctrl+Shift+Enter). Des corrections ont porté sur le contrôle des dates et l’adaptation des références, avec des ajustements sur les bornes (≤ ou <) afin que les bornes J2 et J3 couvrent exactement la période souhaitée, et des échanges discutent aussi d’une éventuelle macro si la robustesse est insuffisante. Différentes propositions et tests ont été réalisés pour fiabiliser le calcul et aligner les résultats, en soulignant l’importance de valider correctement les dates et les correspondances entre les colonnes de dates et les prix.
Dites-moi s'il y a encore des cas défectueux ;)
Le doc :
https://www.cjoint.com/?DGpqFKcAtTr
La formule matricielle :
=SI(J2<C6;"Date en J2 hors données";SI(J3>MAX(C6:D100);"Date en J3 hors données";SI(MAX(SI((C6:C100<J3)*(D6:D100=J3);C6:C100))=MAX(SI((C6:C100<=J2)*(D6:D100>J2);C6:C100));J4*(12/365)*INDEX(B6:B100;EQUIV(MIN(SI((C6:C100<=J2)*(D6:D100>=J2);D6:D100));C6:C100));SI(J3=MAX(C6:C100);(1+MIN(SI((C6:C100<=J2)*(D6:D100>=J2);D6:D100))-J2)*(12/365)*INDEX(B6:B100;EQUIV(MIN(SI((C6:C100<=J2)*(D6:D100>=J2);D6:D100));D6:D100))+SOMME.SI.ENS(F6:F100;C6:C100;">"&J2;C6:C100;"<"&J3;D6:D100;">"&J2;D6:D100;"<"&J3)+(12/365)*INDEX(B6:B100;EQUIV(MAX(SI((C6:C100<=J3)*(D6:D100>=J3);C6:C100));C6:C100));(1+MIN(SI((C6:C100<=J2)*(D6:D100>=J2);D6:D100))-J2)*(12/365)*INDEX(B6:B100;EQUIV(MIN(SI((C6:C100<=J2)*(D6:D100>=J2);D6:D100));D6:D100))+SOMME.SI.ENS(F6:F100;C6:C100;">"&J2;C6:C100;"<"&J3;D6:D100;">"&J2;D6:D100;"<"&J3)+(1+J3-MAX(SI((C6:C100<=J3)*(D6:D100>=J3);C6:C100)))*(12/365)*INDEX(B6:B100;EQUIV(MAX(SI((C6:C100<=J3)*(D6:D100>=J3);C6:C100));C6:C100))))))
Ma condition de départ n'était pas correcte.
J'ai modifié cette ligne :
If val >= datdebblo And datdebblo <= val.Offset(0, 1) ThenCela semble correct suite à quelques tests rapides...
Merci de bien contrôler... !
Votre fichier :
Ce serait quand même mieux si je mettais le lien...... https://www.cjoint.com/?3Gpu0H3xeY3
Salutations.
Le Pingou
Et encore merci pour ce travail et votre patience.
Je détecte une anomalie sur le montant, à priori quand la date de départ n'est pas dans la colonne C.
Ex du 29/04/00 au 30/04/00, donne 0,1486 au lieu de 0,1413
De même du 29/10/00 au 30/10/00, 0,1677 au lieu de 0,1486
Par contre (date déb compris dans colonne C) du 01/05/00 au 02/05/00 = 0,1486 (OK)
Merci
Merci pour l'information.
Cette petite anomalie est normale car j'ai admis que vous introduisez une date adéquate.
Je vais ajouter un contrôle dans la procédure et ce sera OK, dans la journée.
Avez-vous découvert des autres erreurs dans les résultats.... ?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionCdt
"On y arrivera bien un jour ! Qui sait...
Dites-moi s'il y a encore des cas défectueux ;)
Le doc :
https://www.cjoint.com/?DGpqFKcAtTr
La formule matricielle :
=SI(J2<C6;"Date en J2 hors données";SI(J3>MAX(C6:D100);"Date en J3 hors données";SI(MAX(SI((C6:C100<J3)*(D6:D100=J3);C6:C100))=MAX(SI((C6:C100<=J2)*(D6:D100>J2);C6:C100));J4*(12/365)*INDEX(B6:B100;EQUIV(MIN(SI((C6:C100<=J2)*(D6:D100>=J2);D6:D100));C6:C100));SI(J3=MAX(C6:C100);(1+MIN(SI((C6:C100<=J2)*(D6:D100>=J2);D6:D100))-J2)*(12/365)*INDEX(B6:B100;EQUIV(MIN(SI((C6:C100<=J2)*(D6:D100>=J2);D6:D100));D6:D100))+SOMME.SI.ENS(F6:F100;C6:C100;">"&J2;C6:C100;"<"&J3;D6:D100;">"&J2;D6:D100;"<"&J3)+(12/365)*INDEX(B6:B100;EQUIV(MAX(SI((C6:C100<=J3)*(D6:D100>=J3);C6:C100));C6:C100));(1+MIN(SI((C6:C100<=J2)*(D6:D100>=J2);D6:D100))-J2)*(12/365)*INDEX(B6:B100;EQUIV(MIN(SI((C6:C100<=J2)*(D6:D100>=J2);D6:D100));D6:D100))+SOMME.SI.ENS(F6:F100;C6:C100;">"&J2;C6:C100;"<"&J3;D6:D100;">"&J2;D6:D100;"<"&J3)+(1+J3-MAX(SI((C6:C100<=J3)*(D6:D100>=J3);C6:C100)))*(12/365)*INDEX(B6:B100;EQUIV(MAX(SI((C6:C100<=J3)*(D6:D100>=J3);C6:C100));C6:C100))))))
il y a encore un petit bug.
A priori c'est quand les périodes ne sont pas comprises en C et D
Ex : 01/05/99 au 29/04/00 = 51,67 au lieu de 25,80 (la période dans les données sont C6 : 01/05/99 et D6 : 30/04/00
Merci
Le doc corrigé :
ttp://cjoint.com/?DGqnYjMh1qd
La formule matricielle :
=SI(J2<C6;"Date en J2 hors données";SI(J3>MAX(C6:D100);"Date en J3 hors données";SI(MAX(SI((C6:C100<J3)*(D6:D100>=J3);C6:C100))=MAX(SI((C6:C100<=J2)*(D6:D100>J2);C6:C100));J4*(12/365)*INDEX(B6:B100;EQUIV(MIN(SI((C6:C100<=J2)*(D6:D100>=J2);D6:D100));C6:C100));SI(J3=MAX(C6:C100);(1+MIN(SI((C6:C100<=J2)*(D6:D100>=J2);D6:D100))-J2)*(12/365)*INDEX(B6:B100;EQUIV(MIN(SI((C6:C100<=J2)*(D6:D100>=J2);D6:D100));D6:D100))+SOMME.SI.ENS(F6:F100;C6:C100;">"&J2;C6:C100;"<"&J3;D6:D100;">"&J2;D6:D100;"<"&J3)+(12/365)*INDEX(B6:B100;EQUIV(MAX(SI((C6:C100<=J3)*(D6:D100>=J3);C6:C100));C6:C100));(1+MIN(SI((C6:C100<=J2)*(D6:D100>=J2);D6:D100))-J2)*(12/365)*INDEX(B6:B100;EQUIV(MIN(SI((C6:C100<=J2)*(D6:D100>=J2);D6:D100));D6:D100))+SOMME.SI.ENS(F6:F100;C6:C100;">"&J2;C6:C100;"<"&J3;D6:D100;">"&J2;D6:D100;"<"&J3)+(1+J3-MAX(SI((C6:C100<=J3)*(D6:D100>=J3);C6:C100)))*(12/365)*INDEX(B6:B100;EQUIV(MAX(SI((C6:C100<=J3)*(D6:D100>=J3);C6:C100));C6:C100))))))
C'est OK, je ne vois pas d'autres erreurs, ormis que le montant calculé sur 1 jour est erroné (01/05/99 au 01/05/99=25,94), mais cete période ne sera en principe pas à calculer.
Par contre votre formule, c'est un vrai casse tête, je ne crois pas que je pourrai m'y repérer :)
Je ne passe pas la demande en résolue tout de suite, j'attends aussi la correction de Le Pingou.
Merci
A suivre
Allez pour ne pas abandonner avant la fin :
Le doc corrigé :
https://www.cjoint.com/?DGqpCRn8GpJ
La formule matricielle :
=SI(J2<C6;"Date en J2 hors données";SI(J3>MAX(C6:D100);"Date en J3 hors données";SI(OU(MAX(SI((C6:C100<J3)*(D6:D100>=J3);C6:C100))=MAX(SI((C6:C100<=J2)*(D6:D100>J2);C6:C100));J2=J3);J4*(12/365)*INDEX(B6:B100;EQUIV(MIN(SI((C6:C100<=J2)*(D6:D100>=J2);D6:D100));C6:C100));SI(J3=MAX(C6:C100);(1+MIN(SI((C6:C100<=J2)*(D6:D100>=J2);D6:D100))-J2)*(12/365)*INDEX(B6:B100;EQUIV(MIN(SI((C6:C100<=J2)*(D6:D100>=J2);D6:D100));D6:D100))+SOMME.SI.ENS(F6:F100;C6:C100;">"&J2;C6:C100;"<"&J3;D6:D100;">"&J2;D6:D100;"<"&J3)+(12/365)*INDEX(B6:B100;EQUIV(MAX(SI((C6:C100<=J3)*(D6:D100>=J3);C6:C100));C6:C100));(1+MIN(SI((C6:C100<=J2)*(D6:D100>=J2);D6:D100))-J2)*(12/365)*INDEX(B6:B100;EQUIV(MIN(SI((C6:C100<=J2)*(D6:D100>=J2);D6:D100));D6:D100))+SOMME.SI.ENS(F6:F100;C6:C100;">"&J2;C6:C100;"<"&J3;D6:D100;">"&J2;D6:D100;"<"&J3)+(1+J3-MAX(SI((C6:C100<=J3)*(D6:D100>=J3);C6:C100)))*(12/365)*INDEX(B6:B100;EQUIV(MAX(SI((C6:C100<=J3)*(D6:D100>=J3);C6:C100));C6:C100))))))
Bonne continuation,
Ce sont quelques boîtes d'aspirine qu'il me faudrait :) mais je ne crois pas que je tenterai de comprendre.
Merci pour ce travail et votre patience.
pajude
En détail, hormis les deux premiers SI(...), il y a 3 cas spécifiques :
- SI(OU(MAX(SI((C6:C100<J3)*(D6:D100>=J3);C6:C100))=MAX(SI((C6:C100<=J2)*(D6:D100>J2);C6:C100));J2=J3); [résultat si vrai] ; [résultat si faux] )
- SI(J3=MAX(C6:C100); ....)
- et le dernier cas qui arrive si les deux premiers ne se produisent pas !
Pour le contenu des résultats selon les cas, j'ai simplement utilisé les fonctions MIN(SI(..., MAX(SI(.., INDEX(...;EQUIV(...)) et SOMME.SI.ENS
Dernier conseil pour s'y retrouver : tracer un axe du temps et en indiquant les positions relatives de J2, J3, la période borne inférieure, la période borne supérieure, les périodes comprises entre J2 et J3.
Tous les cas particuliers se visualisent bien sur cette axe et les calculs en découlent directement en procédant par étape comme je l'avais annoncé au tout début :
Les jours de la borne inférieure après J2 (période qui commence AVANT J2 et finit APRES)
+les périodes comprises entre J2 et J3 strictement
+ les jours de la borne supérieure avant J3 (commence AVANT J3 et finit APRES)
En espérant que tout cela ne serve jamais ;)
Et merci pour le service rendu sur ce forum.
pajude
Oui c'est super génial et surtout si vous l'appliquez à votre demande d'avoir ce calcul sur une autre feuille... !
Maintenant je réalise des tests selon les erreurs cités dans les divers postes et je mais le tout en comparaison avec la formule marathon... et je le répète ; qui ne fonctionne pas depuis une autre feuille !
Il suffit de changer les références des cellules avec un petit coup de rechercher/remplacer et voilà le résultat :
https://www.cjoint.com/?DGqxUu18r9d
J'ai mis ça en feuille 2 mais ça reste utilisable de n'importe où, enfin je pense ;)
Bonne soirée,
Le fichier avec contrôle si date en dehors des dates du tableau prix : https://www.cjoint.com/?3GqxNqBiAhk
Note : la proposition de Theo.R est un très bon exercice .... Courage... !
Vous avez fait un excelent travail et surtout quelle patience.
Mes tests de ce matin :
Pour la version macro, je ne n'ai plus trouvé d'erreur
Pour la version formule, Theo, tu as bien corrigé l'erreur détectée par Le Pingou (du 14/08/08 au 15/08/08 qui donnait 0,21435 zu lieu de 0,22488 ), mais cela a crée une autre erreur du 14/05/08 au 15/05/08 = 0,20614 au lieu de 0,21436 (dans le tableau précédent sur cette ériode c'était bon)
Merci
Je vous remercie tous les deux pour ce travail et le temps que vous avez consacré à ce casse tête.
Merci également pour votre participation au forum de CCM.
J'ai à nouveau testé et cela fonctionne, ormis pour Theo, une erreur quand la période est sur 2 jour (ex 01/05/99 au 02/05/99 = #N/A), ça n'empêche pas d'utiliser le tableau.
Je marque donc la question comme résolue.
PS : est ce qu'il faut conserver toutes nos échanges, ou bien demander à CCM de les supprimer pour ne garder que la solution.
@ bientôt
pajude