Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Calcul d'un écart de date (Correctif de formule SVP)

74 réponses
Avatar
Guido
Bonjour =E0 vous tous,

un petit soucis de formule de d=E9compte de dates. Qui peut m'apporter une =
solution.

=3DSI(JOUR(A1)=3D1;30;FIN.MOIS(A1;0)-A1+1)+SI(FIN.MOIS(B1;0)=3DB1;30;JOUR(B=
1))+JOURS360(FIN.MOIS(A1;0);FIN.MOIS(B1;0))-30

Cette formule devrait me donner les r=E9sultats suivants en fonction d'une =
simple r=E8gle commerciale de 30 jours, mais qui devrait calculer le mois d=
e f=E9vrier selon son nombre exacte de jours (soit 28 jours, soit 29 jours)=
.

01.01.2010 27.01.2010 27 jours
01.02.2010 27.02.2010 27 jours
01.02.2010 28.02.2010 28 jours
01.02.2012 29.02.2012 29 jours
04.05.2010 31.05.2010 28 jours
01.06.2010 30.06.2010 30 jours
01.07.2010 31.08.2010 60 jours
01.09.2010 30.09.2010 30 jours
04.05.2010 02.08.2010 90 jours
15.05.2010 19.11.2010 186 jours


j'ai par exemple un soucis avec le 2=E8me exemple. Il ne compte que 25 jour=
s sur le mois de f=E9vrier. Sinon tout le reste semble correspondre.

Qui saurait m'aider, dans la mise au point de cette formules pseudo commerc=
iale ??

Guido

10 réponses

Avatar
isabelle
voilà pour ton usage perso, j'ai fais la dernière correction selon les dernières explications,

Function DateDifCommercial(a As Range, b As Range) As Integer
NbMois = DateDiff("m", [a], [b])
If Day([a]) = 1 Then
If Month([a]) <> 2 Then
ja = 30
Else
ja = Day(DateSerial(Year([a]), Month([a]) + 1, 1) - 1)
End If
Else
ja = Day(DateSerial(Year([a]), Month([a]) + 1, 1) - 1) - Day([a]) + 1
End If

If Day([b]) = 31 Then jb = 30 Else jb = Day([b])

If NbMois > 1 Then
For i = 1 To NbMois - 1
If Month(DateSerial(Year([a]), Month([a]) + i, 1)) = 2 Then
fm = Day(DateSerial(Year([a]), Month([a]) + i + 1, 1) - 1)
w = w + fm
Else
w = w + 30
End If
Next
w = w + ja + jb

ElseIf Month([a]) = Month([b]) Then
w = Day([b]) - Day([a]) + 1
Else
w = ja + jb
End If

DateDifCommercial = w
End Function

--
isabelle



Le 2012-04-19 13:17, Guido a écrit :


Je suis désolé Isabelle, les macros au boulot sont purement interdite et la procédure



pour en faire accepter une est super *%&")%&+@#$ grrrr . D'où mon intérêt pour les formules.

Merci tout de même. Je la prendrai pour mon usage personnel se qui me permettra (si j'arrive)

à entamer ma formation un peu plus poussée que ce que je connais en VBA.

Bonne soirée à vous tous
Avatar
MichD
Ça devrait aller pour les durée de moins d'un an.

Reste à traduire le nom des fonction en français.

=IF(MONTH(A1)=MONTH(B1);DATEDIF(A1;B1;"d")+1;
((ABS(MONTH(B1)-MONTH(A1))-1)*30)+MIN(DAY(B1);30)
+IF(MIN(DAY(EOMONTH(A1;0));30;30)-DAY(A1)<=0;
MIN(DAY(EOMONTH(A1;0));30;30);30-DAY(A1)+1))-
IF((((N(AND(MONTH(A1)<2;MONTH(B1)>2))+N(AND(MONTH(A1)>2;
MONTH(B1)<2))))>0)*1=1;30-DAY(DATE(YEAR(B1);3;0));0)


--
MichD
---------------------------------------------------------------
Avatar
Guido
Bonjour Denis

merci pour ta formule. Je l'ai traduite ainsi :
=SI(MOIS(A26)=MOIS(B26);DATEDIF(A26;B26;"d")+1;((ABS(MOIS(B26)-MOIS(A26 ))-1)*30)+MIN(JOUR(B26);30)+SI(MIN(JOUR(FIN.MOIS(A26;0));30;30)-JOUR(A26)< =0;MIN(JOUR(FIN.MOIS(A26;0));30;30);30-JOUR(A26)+1))-SI((((N(ET(MOIS(A26) <2;MOIS(B26)>2))+N(ET(MOIS(A26)>2;MOIS(B26)<2))))>0)*1=1;30-JOUR(DATE(ANN EE(B26);3;0));0)

Etant donné que le passage entre une année et l'année +1 n'est pas pr is en compte, j'ai vérifié la formule avec le tableau initial en testan t également d'autres dates.

(calcul avec un intervalle comprenant deux mois complets (1x30 jours et 1x 31 jours (calculé sur 30 jours) + jours isolés)
04.05.2010 - 02.08.2010 (28+60+2)= 90 au lieu de 89

(calcul dès la fin d'un mois débutant le dernier jours du mois (d'un mo is de 31 jours) sans intervalle de mois complet)
31.03.2010 - 05.04.2010 (1+5)= 6 au lieu de 35

(calcul avec un intervalle comprenant un mois complets (1x 30 jours + 1x 31 jours (calculé sur 30 jours) + jours isolés) et se terminant sur la fi n d'un mois complet de 30 jours)
07.07.2010 - 30.09.2010 (25+30+30)= 85 au lieu de 84

(calcul avec un intervalle comprenant deux mois complets ( 2x 31 jours (cal culés sur 30 jours) + jours isolés)
01.07.2010 - 31.08.2010 = 60 (résultat OK)

02.07.2010 - 31.08.2010 = 60 au lieu de 59


Guido

Le samedi 21 avril 2012 00:36:33 UTC+2, MichD a écrit :
Ça devrait aller pour les durée de moins d'un an.

Reste à traduire le nom des fonction en français.

=IF(MONTH(A1)=MONTH(B1);DATEDIF(A1;B1;"d")+1;
((ABS(MONTH(B1)-MONTH(A1))-1)*30)+MIN(DAY(B1);30)
+IF(MIN(DAY(EOMONTH(A1;0));30;30)-DAY(A1)<=0;
MIN(DAY(EOMONTH(A1;0));30;30);30-DAY(A1)+1))-
IF((((N(AND(MONTH(A1)<2;MONTH(B1)>2))+N(AND(MONTH(A1)>2;
MONTH(B1)<2))))>0)*1=1;30-DAY(DATE(YEAR(B1);3;0));0)


--
MichD
---------------------------------------------------------------
Avatar
Jacquouille
(calcul dès la fin d'un mois débutant le dernier jours du mois (d'un mois de
31 jours) sans intervalle de mois complet)
31.03.2010 - 05.04.2010 (1+5)= 6 au lieu de 35

??????????

Qui c'est kadi 35 ?

Jacquouille

" Le vin est au repas ce que le parfum est à la femme."
"Guido" a écrit dans le message de groupe de discussion :


Bonjour Denis

(calcul dès la fin d'un mois débutant le dernier jours du mois (d'un mois de
31 jours) sans intervalle de mois complet)
31.03.2010 - 05.04.2010 (1+5)= 6 au lieu de 35
Avatar
Guido
Bonsoir Jacquouille

La dernière formule de Denis me donne ce curieux résultat.

En voici d'autres, et se sont des tests en fonction de la 1ere borne qui d ébute en fin de mois (le 30 ou 31).

30.04.2010 - 05.05.2010 = 35 au lieu de 6
31.05.2010 - 05.06.2010 = 35 au lieu de 6
31.07.2010 - 08.08.2010 = 38 au lieu de 9

Qui c'est kadi 35 ?



et bien c'est la formule_6 de Denis qui me propose ces solutions....

A ce jour, la meilleure formule de Denis reste celle-ci dessous.
=SI(MOIS(A1)=MOIS(B1);DATEDIF(A1;B1;"d")+1;(ABS(MOIS(B1)-MOIS(A1)-1)*30 +(30-MIN(SI(JOUR(A1)>0;30;JOUR(A1)-1);30))+MIN(SI(JOUR(B1)>29;30;JOUR(B 1)+1);30)))

Mais n'a pas l'avantage de calculer une borne à l'autre sur deux ans, com me par exemple :

28.12.2011 au 05.02.2012 = 339 au lieu de 39

Bonne soirée à vous

Guido
Avatar
MichD
Regarde ce fichier exemple : http://cjoint.com/?BDwqQhBOWp7

La formule est matricielle : Maj + Ctrl + Enter

A3 Date de départ de période
B3 Date de fin de période

=IF(DATEDIF(A3;B3;"M")=0;MIN(DATEDIF(A3;B3;"d")+1;30);DATEDIF(A3;B3;"M")*30
-((ROUND(((SUM(IF(DAY(EOMONTH(ROW(INDIRECT(A3&":"&B3));0))(;1))/28)*2)
+((SUM(IF(DAY(EOMONTH(ROW(INDIRECT(A3&":"&B3));0)));1))/29)*1);0)))
+MIN(IF(DAY(A3)ÚY(EOMONTH(A3;0));1;30-DAY(A3)+1);30)+MIN(DAY(B3);30)-30)
+IF(MIN(30-DAY(A3)+1;30)+MIN(DAY(B3);30)-30<=0;30;0)

--
MichD
---------------------------------------------------------------
Avatar
Jacquouille
Bonjour
Si la période s'étale sur trois années, tu comptes l'année complète (celle
du milieu) pour 12 fois 30 jours, ou 11*30+28 ou 29 , 360,0361 365 ?

Jacquouille

" Le vin est au repas ce que le parfum est à la femme."
"Guido" a écrit dans le message de groupe de discussion :


Bonsoir Jacquouille

La dernière formule de Denis me donne ce curieux résultat.

En voici d'autres, et se sont des tests en fonction de la 1ere borne qui
débute en fin de mois (le 30 ou 31).

30.04.2010 - 05.05.2010 = 35 au lieu de 6
31.05.2010 - 05.06.2010 = 35 au lieu de 6
31.07.2010 - 08.08.2010 = 38 au lieu de 9

Qui c'est kadi 35 ?



et bien c'est la formule_6 de Denis qui me propose ces solutions....

A ce jour, la meilleure formule de Denis reste celle-ci dessous.
=SI(MOIS(A1)=MOIS(B1);DATEDIF(A1;B1;"d")+1;(ABS(MOIS(B1)-MOIS(A1)-1)*30+(30-MIN(SI(JOUR(A1)>0;30;JOUR(A1)-1);30))+MIN(SI(JOUR(B1)>29;30;JOUR(B1)+1);30)))

Mais n'a pas l'avantage de calculer une borne à l'autre sur deux ans, comme
par exemple :

28.12.2011 au 05.02.2012 = 339 au lieu de 39

Bonne soirée à vous

Guido
Avatar
Guido
Bonsoir Jacquouille

Oui, comme tu le présentes.

11x 30jours et 1x 28jours (respct. 29jours)

Bonsoir MichD,

J'ai pris un certain temps pour visualiser la formule dans le tableau et je constate que le calcul des jours à la main comporte quelques erreurs.

Voici le tableau en retour : http://cjoint.com/?3DwxkpQRPHW

Je me reviens à mon explicatif que j'ai fait le 19 avril suite à la que stion d'Isabelle et par laquelle, je me suis rendu compte de ma grosse bour de, à savoir... ne pas avoir bien expliqué le fonctionnement du calcul.

... Concernant les mois entamés
(Même si le mois est entamé sur une période du 02 au 31)
Ils sont comptés mensuellement avec leurs jours exacts de présences. Le 31ème jour est donc à comptabiliser du fait qu'il y a 1 jour de prés ence effectué.

Bonsoir Isabelle,

Cette formule ÚteDifCommercial(A1;B1) fonctionne à merveille. Sauf, p our les mois isolés de 31 jours (ex : 01.01.2011 au 31.01.2011). Son ré sultat devrait également donner 30 jours.

Elle calcule superbement le passage à l'année sur un nombre restreint d e moins de 30 jours comme par exemple (31.12.2010 - 05.01.2011 = 6)

Par contre, je nÂ’ai pas réussi à la reproduire une nouvelle feuille. Serais-ce quÂ’il me faut activer certains outils supplémentaires (comme outil dÂ’analyse ou autres Â… ?)

Bonne soirée à vous tous

Guido
Avatar
isabelle
salutatous,

j'ai testé cette usine à gaz et surprise ça fonctionne


=SI(ET((B7-A7<31);(ANNEE(A7)=ANNEE(B7)));(B7-A7+1);SI(ET(((TEXTE((ANNEE(B7)&TEXTE(MOIS(B7);"00"));0)*1)
-(TEXTE((ANNEE(A7)&TEXTE(MOIS(A7);"00"));0)*1))<>90;DATEDIF(A7;B7;"m")<=1);(SI(ET(OU(K7;L7);J7);28;SI(JOUR(FIN.MOIS(A7;0))
-JOUR(A7)+11;30;JOUR(FIN.MOIS(A7;0))-JOUR(A7)+1)))+(SI(JOUR(B7)>30;30;JOUR(B7)));(SI(ET(OU(K7;L7);J7);28;SI(JOUR(FIN.MOIS(A7;0))
-JOUR(A7)+11;30;JOUR(FIN.MOIS(A7;0))-JOUR(A7)+1)))+
((SOMMEPROD(1*(JOUR(LIGNE(INDIRECT(DATE(ANNEE($A7);MOIS($A7)+1;1)&":"&DATE(ANNEE(B7);MOIS(B7)-1;30))))0))*30)+
SOMMEPROD((MOIS(LIGNE(INDIRECT(DATE(ANNEE($A7);MOIS($A7)+1;1)&":"&DATE(ANNEE(B7);MOIS(B7);1)-1)))=2)*
(JOUR(LIGNE(INDIRECT(DATE(ANNEE($A7);MOIS($A7)+1;1)&":"&DATE(ANNEE(B7);MOIS(B7);1)-1))))))*29)+(SI(JOUR(B7)>30;30;JOUR(B7)))))


l'assemblage est dans le fichier sous ce lien : http://cjoint.com/?BDxatgXCPBR



--
isabelle
Avatar
MichD
| je constate que le calcul des jours à la main comporte quelques erreurs

***Ce ne sont pas des erreurs. La formule calcule ce que je lui ai demandé. Elle ne tient
pas compte du 31 puisque ta demande originale l'exigeait.

P.S. Il n'y aura pas d'autre version de la formule.


--
MichD
---------------------------------------------------------------