Somme d'une colonne selon période

Résolu/Fermé
pajude Messages postés 77 Date d'inscription mardi 26 octobre 2010 Statut Membre Dernière intervention 9 mars 2024 - Modifié par pajude le 11/07/2014 à 16:00
Le Pingou Messages postés 12045 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 25 avril 2024 - 18 juil. 2014 à 09:49
Bonjour,

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
A voir également:

55 réponses

Theo.R Messages postés 575 Date d'inscription vendredi 11 juillet 2014 Statut Membre Dernière intervention 30 mars 2016 31
15 juil. 2014 à 16:33
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))))))
0
Le Pingou Messages postés 12045 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 25 avril 2024 1 426
15 juil. 2014 à 17:00
Bonjour pafude,
Ma condition de départ n'était pas correcte.
J'ai modifié cette ligne :
If val >= datdebblo And datdebblo <= val.Offset(0, 1) Then
Cela semble correct suite à quelques tests rapides...
Merci de bien contrôler... !
Votre fichier :
0
Le Pingou Messages postés 12045 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 25 avril 2024 1 426
15 juil. 2014 à 20:52
Bonjour,
Ce serait quand même mieux si je mettais le lien...... https://www.cjoint.com/?3Gpu0H3xeY3
Salutations.
Le Pingou
0
pajude Messages postés 77 Date d'inscription mardi 26 octobre 2010 Statut Membre Dernière intervention 9 mars 2024
16 juil. 2014 à 08:26
Bonjour 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
0
Le Pingou Messages postés 12045 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 25 avril 2024 1 426
16 juil. 2014 à 10:07
Bonjour,
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.... ?

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
pajude Messages postés 77 Date d'inscription mardi 26 octobre 2010 Statut Membre Dernière intervention 9 mars 2024
16 juil. 2014 à 10:31
J'ai fait le tour, pour le moment je n'ai pas trouvé d'autres erreurs que si la date de début ne correspond exacetemnt à une date de la colonne C.
Cdt
0
Theo.R Messages postés 575 Date d'inscription vendredi 11 juillet 2014 Statut Membre Dernière intervention 30 mars 2016 31
16 juil. 2014 à 10:49
Vous avez laissé tomber la version formule sans macro ? (Que je sache si je continue de suivre ce sujet..)

Merci d'avance

--
0
pajude Messages postés 77 Date d'inscription mardi 26 octobre 2010 Statut Membre Dernière intervention 9 mars 2024 > Theo.R Messages postés 575 Date d'inscription vendredi 11 juillet 2014 Statut Membre Dernière intervention 30 mars 2016
16 juil. 2014 à 10:59
Bonjour
Non pas du tout. J'aimerais avoir aussi votre version formule. J'attends vos corrections.
Merci
0
Theo.R Messages postés 575 Date d'inscription vendredi 11 juillet 2014 Statut Membre Dernière intervention 30 mars 2016 31
16 juil. 2014 à 11:14
Je les avais déjà postées :

"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))))))
0
pajude Messages postés 77 Date d'inscription mardi 26 octobre 2010 Statut Membre Dernière intervention 9 mars 2024
16 juil. 2014 à 13:43
En réponse,
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
0
Theo.R Messages postés 575 Date d'inscription vendredi 11 juillet 2014 Statut Membre Dernière intervention 30 mars 2016 31
16 juil. 2014 à 13:51
En effet c'est le même pb qu'avant mais sur l'autre borne, il manquait un "inférieur ou égal" au lieu d'un égal strict.

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))))))
0
pajude Messages postés 77 Date d'inscription mardi 26 octobre 2010 Statut Membre Dernière intervention 9 mars 2024
16 juil. 2014 à 15:05
Re,
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
0
Theo.R Messages postés 575 Date d'inscription vendredi 11 juillet 2014 Statut Membre Dernière intervention 30 mars 2016 31
16 juil. 2014 à 15:30
Oui il faut la prendre avec des pincettes pour la comprendre et donc pouvoir la modifer :/

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,
0
pajude Messages postés 77 Date d'inscription mardi 26 octobre 2010 Statut Membre Dernière intervention 9 mars 2024
16 juil. 2014 à 15:37
SUPER,
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
0
Theo.R Messages postés 575 Date d'inscription vendredi 11 juillet 2014 Statut Membre Dernière intervention 30 mars 2016 31
16 juil. 2014 à 15:50
Si l'envie vous prend (ou le besoin surtout!), il faut décortiquer la formule avec les SI(...), ils servent à délimiter des cas spécifiques !

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 ;)
0
pajude Messages postés 77 Date d'inscription mardi 26 octobre 2010 Statut Membre Dernière intervention 9 mars 2024
16 juil. 2014 à 16:11
Merci encore, c'est génial je vais prpablement m'y pencher !
Et merci pour le service rendu sur ce forum.
pajude
0
Le Pingou Messages postés 12045 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 25 avril 2024 1 426
16 juil. 2014 à 22:16
Bonjour,
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 !
0
Theo.R Messages postés 575 Date d'inscription vendredi 11 juillet 2014 Statut Membre Dernière intervention 30 mars 2016 31
16 juil. 2014 à 23:48
Comment ça "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,
0
Le Pingou Messages postés 12045 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 25 avril 2024 1 426
16 juil. 2014 à 23:55
Bonjour Theo.R,
Bien sûr que cela fonctionne depuis un autre feuille mais pour cela il faut adapter la formule et c'est ce que j'ai précisé sur le fichier pour pajude à savoir : Utilisation sur autre feuille : NON il est nécessaire d'adapter la formule.
Salutations.
Le Pingou
0
Le Pingou Messages postés 12045 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 25 avril 2024 1 426
16 juil. 2014 à 23:39
Bonjour pajude,
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... !

0
pajude Messages postés 77 Date d'inscription mardi 26 octobre 2010 Statut Membre Dernière intervention 9 mars 2024
17 juil. 2014 à 08:11
Bonjour Le Pingou et Theo,
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
0
pajude Messages postés 77 Date d'inscription mardi 26 octobre 2010 Statut Membre Dernière intervention 9 mars 2024
17 juil. 2014 à 08:21
Le Pingou, j'ai été un peu vite, en feuil2, il n'y a rien dans le montant
0
pajude Messages postés 77 Date d'inscription mardi 26 octobre 2010 Statut Membre Dernière intervention 9 mars 2024
18 juil. 2014 à 08:03
Bonjour Le Pingou et Theo,
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
0
Le Pingou Messages postés 12045 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 25 avril 2024 1 426
18 juil. 2014 à 09:49
Bonjour,
Merci, content pour vous que cette fois c'est OK.
Il vous suffit de marquer le poste comme résolu et c'est tout.

0