Calcul entre deux dates (ancienne et récente)

alexandre33260

XLDnaute Occasionnel
Bonjour et bonne année à toutes et à tous.
Je vous joins mon fichier sur le calcul entre des dates. Mon souci est le calcul qui s'effectue dans la cellule C3-4 (fusionnées). Je suis obligé de donner la date la plus ancienne en B3 et la plus récente en B4, autrement la formule ne fonctionne pas.
Avez-vous une solution pour que je puisse mettre date 1 et Date 2 sans être obligé de respecter l'ancienneté (mettre la date la plus récente en B3 et la plus ancienne en B4)???

PS : La formule initiale respecte le format singulier et pluriel "1 an 2 ans / 1 jour 2 jours". Ce dernier doit être respecté. Autre règle, impossible d'utiliser des macros…
Merci pour votre aide.
Si ce n'est pas possible, merci de me le dire aussi…..
Cordialement Alexandre.
 

Pièces jointes

  • Dates.xls
    27.5 KB · Affichages: 58
  • Dates.xls
    27.5 KB · Affichages: 62
  • Dates.xls
    27.5 KB · Affichages: 56

JCGL

XLDnaute Barbatruc
Re : Calcul entre deux dates (ancienne et récente)

Bonjour à tous,

Peux-tu essayer :
Code:
=SI(OU(B3="";B4="");"";DATEDIF(MIN(B3:B4);MAX(B3:B4);"Y")&SI(DATEDIF(MIN(B3:B4);MAX(B3:B4);"Y")>1;" ans, ";" an, ")&DATEDIF(MIN(B3:B4);MAX(B3:B4);"YM")&" mois et "&DATEDIF(MIN(B3:B4);MAX(B3:B4);"MD")&SI(DATEDIF(MIN(B3:B4);MAX(B3:B4);"MD")>1;" jours.";" jour."))

En sachant que DATEDIF() ne retourne pas forcément un résultat exact...

A+ à tous
 

Modeste geedee

XLDnaute Barbatruc
Re : Calcul entre deux dates (ancienne et récente)

Bonsour®

=SI(OU(B3="";B4="");"";DATEDIF(MIN(B3;B4);MAX(B3;B4);"Y")&SI(DATEDIF(MIN(B3;B4);MAX(B3;B4);"Y")>1;" ans, ";" an, ")&DATEDIF(MIN(B3;B4);MAX(B3;B4);"YM")&" mois et "&DATEDIF(MIN(B3;B4);MAX(B3;B4);"MD")&SI(DATEDIF(MIN(B3;B4);MAX(B3;B4);"MD")>1;" jours.";" jour."))

:mad:
sauf que DATEDIF est buggé avec l'utilisation du paramètre "md"


Oupsss !!!
bonjour JC

petit +
en D3, D4 , D8 :
=SI(B3<>"";"c'était un "&(TEXTE(B3;"jjjj"));"")

:cool:
contournement :
=TEXTE(ABS(date1-date2)+1;"aaaa")-1900&" an"&SI(TEXTE(ABS(date1-date2)+1;"aaaa")-1900>1;"s ";" ")&TEXTE(ABS(date1-date2)+1;"m")-1
&" mois "&TEXTE(ABS(date1-date2)+1;" j")-1&" jour"&(SI(TEXTE(ABS(date1-date2)+1;" j")-1>1;"s";""))
 

Pièces jointes

  • calcul_entre_deux_dates.xls
    48.5 KB · Affichages: 45
Dernière édition:

Modeste geedee

XLDnaute Barbatruc
Re : Calcul entre deux dates (ancienne et récente)

bonsour®
Geedeee : Je l'ai bien précisé dans mon #2 :mad:

Edition : Et tu as "Oupsé" :eek:

il n'est jamais inutile de bien enfoncer les clous !!!
:eek:
d'autant que ce bug n'existe pas dans toutes les versions d'Excel
et est bien particulier à une période :
date récente en année bissextile ET date en janvier ET Jour inferieur à jour date ancienne
 

ROGER2327

XLDnaute Barbatruc
Re : Calcul entre deux dates (ancienne et récente)

Bonsoir à tous.


Moi, je n'aime pas DATEDIF...​
VB:
=SI(B3*B4;
    ANNEE(MAX(B3;B4))-ANNEE(MIN(B3;B4))-(100*(MOIS(MAX(B3;B4))-MOIS(MIN(B3;B4)))<(JOUR(MIN(B3;B4))-JOUR(MAX(B3;B4))))&" an"
&SI(ANNEE(MAX(B3;B4))-ANNEE(MIN(B3;B4))-(100*(MOIS(MAX(B3;B4))-MOIS(MIN(B3;B4)))<(JOUR(MIN(B3;B4))-JOUR(MAX(B3;B4))))>1;"s, ";", ")
   &MOIS(MAX(B3;B4))-MOIS(MIN(B3;B4))+12*(100*(MOIS(MAX(B3;B4))-MOIS(MIN(B3;B4)))<(JOUR(MIN(B3;B4))-JOUR(MAX(B3;B4)))-(JOUR(MAX(B3;B4))<JOUR(MIN(B3;B4)))*(1-DATE(ANNEE(MAX(B3;B4));MOIS(MAX(B3;B4))-1;1)+DATE(ANNEE(MAX(B3;B4));MOIS(MAX(B3;B4));1)))&" mois et "
   &JOUR(MAX(B3;B4))-JOUR(MIN(B3;B4))-(JOUR(MAX(B3;B4))<JOUR(MIN(B3;B4)))*(DATE(ANNEE(MAX(B3;B4));MOIS(MAX(B3;B4))-1;1)-DATE(ANNEE(MAX(B3;B4));MOIS(MAX(B3;B4));1))&" jour"
&SI(JOUR(MAX(B3;B4))-JOUR(MIN(B3;B4))-(JOUR(MAX(B3;B4))<JOUR(MIN(B3;B4)))*(DATE(ANNEE(MAX(B3;B4));MOIS(MAX(B3;B4))-1;1)-DATE(ANNEE(MAX(B3;B4));MOIS(MAX(B3;B4));1))>0;"s.";".");
"")


Bonne soirée.


ℝOGER2327
#7107


Samedi 14 Décervelage 141 (Saints 4 Sans-Cou, enchanteurs - fête Suprême Quarte)
22 Nivôse An CCXXII, 7,2633h - sel
2014-W02-6T17:25:55Z
 

alexandre33260

XLDnaute Occasionnel
Re : Calcul entre deux dates (ancienne et récente)

Effectivement, c'est radical et ultra rapide.... COMME D'HAB!!!
Encore merci à tous.
Je joint le fichier final si besoin......
 

Pièces jointes

  • Dates.xls
    29.5 KB · Affichages: 44
  • Dates.xls
    29.5 KB · Affichages: 44
  • Dates.xls
    29.5 KB · Affichages: 40

JCGL

XLDnaute Barbatruc
Re : Calcul entre deux dates (ancienne et récente)

Bonjour à tous,

Je te conseille la formule de Geedee en #3 (légèrement modifiée pour correspondre à ta syntaxe) :

Code:
=TEXTE(ABS($B$3-$B$4)+1;"aaaa")-1900&" an"&SI(TEXTE(ABS($B$3-$B$4)+1;"aaaa")-1900>1;"s, ";" ")&TEXTE(ABS($B$3-$B$4)+1;"m")-1&" mois et "&TEXTE(ABS($B$3-$B$4)+1;" j")-2&" jour"&(SI(TEXTE(ABS($B$3-$B$4)+1;" j")-2>1;"s.";""))

A+ à tous
 

Modeste geedee

XLDnaute Barbatruc
Re : Calcul entre deux dates (ancienne et récente)

Bonsour®
Bonsoir à tous.
Moi, je n'aime pas DATEDIF...​
VB:
=SI(B3*B4;
    ANNEE(MAX(B3;B4))-ANNEE(MIN(B3;B4))-(100*(MOIS(MAX(B3;B4))-MOIS(MIN(B3;B4)))<(JOUR(MIN(B3;B4))-JOUR(MAX(B3;B4))))&" an"
&SI(ANNEE(MAX(B3;B4))-ANNEE(MIN(B3;B4))-(100*(MOIS(MAX(B3;B4))-MOIS(MIN(B3;B4)))<(JOUR(MIN(B3;B4))-JOUR(MAX(B3;B4))))>1;"s, ";", ")
   &MOIS(MAX(B3;B4))-MOIS(MIN(B3;B4))+12*(100*(MOIS(MAX(B3;B4))-MOIS(MIN(B3;B4)))<(JOUR(MIN(B3;B4))-JOUR(MAX(B3;B4)))-(JOUR(MAX(B3;B4))<JOUR(MIN(B3;B4)))*(1-DATE(ANNEE(MAX(B3;B4));MOIS(MAX(B3;B4))-1;1)+DATE(ANNEE(MAX(B3;B4));MOIS(MAX(B3;B4));1)))&" mois et "
   &JOUR(MAX(B3;B4))-JOUR(MIN(B3;B4))-(JOUR(MAX(B3;B4))<JOUR(MIN(B3;B4)))*(DATE(ANNEE(MAX(B3;B4));MOIS(MAX(B3;B4))-1;1)-DATE(ANNEE(MAX(B3;B4));MOIS(MAX(B3;B4));1))&" jour"
&SI(JOUR(MAX(B3;B4))-JOUR(MIN(B3;B4))-(JOUR(MAX(B3;B4))<JOUR(MIN(B3;B4)))*(DATE(ANNEE(MAX(B3;B4));MOIS(MAX(B3;B4))-1;1)-DATE(ANNEE(MAX(B3;B4));MOIS(MAX(B3;B4));1))>0;"s.";".");
"")


Bonne soirée.
avec toute mes excuses Roger...
Joyeuse insomnie ...:eek:
Capture.JPG:D
 

Pièces jointes

  • Capture.JPG
    Capture.JPG
    26.7 KB · Affichages: 77
  • Capture.JPG
    Capture.JPG
    26.7 KB · Affichages: 78

ROGER2327

XLDnaute Barbatruc
Re : Calcul entre deux dates (ancienne et récente)

Bonjour à tous.

Re...
Bonsour®
avec toute mes excuses Roger...
Joyeuse insomnie ...:eek:
Regarde la pièce jointe 294798:D
Je me suis trompé de formule...
En fait, la formule proposée est une transcription de code VBA (que j'ai vu parfois attribué à J.M.Peters).
Je voulais proposer l'équivalent d'un code personnel :​
VB:
Function DifDate$(début As Date, fin As Date)
Dim D As Date, f As Date, M&, j&
  If début < fin Then D = début: f = fin + 1 Else D = fin: f = début + 1
  Do While DecMois(D, M + 1) < f: M = M + 1: Loop
  D = DateSerial(Year(DecMois(D, M)), Month(DecMois(D, M)), Day(DecMois(D, M)))
  j = f - D - 1
  DifDate = M \ 12 & " an" & IIf(M \ 12 > 1, "s, ", ", ") & M Mod 12 & " mois et " & j & " jour" & IIf(j > 1, "s.", ".")
End Function

Function DecMois(D As Date, dec&) As Date
Dim x, y
  x = DateSerial(Year(D), Month(D) + dec, 1)
  y = Day(DateSerial(Year(x), Month(x) + 1, 0))
  DecMois = DateSerial(Year(D), Month(D) + dec, (y + Day(D) - Abs(y - Day(D))) / 2)
End Function
sous forme d'une lourde formule Excel. Ce qui donne :​
VB:
=                                  TEXTE(ENT(SOMME(--(MOIS.DECALER(MIN(C$2;$B3);LIGNE(DECALER($A$1;;;12*(ABS(ANNEE($B3)-ANNEE(C$2))+1);)))<=MAX(C$2;$B3)))/12);
"[>1]0"" ans, "";0"" an, """)&
                                         MOD(SOMME(--(MOIS.DECALER(MIN(C$2;$B3);LIGNE(DECALER($A$1;;;12*(ABS(ANNEE($B3)-ANNEE(C$2))+1);)))<=MAX(C$2;$B3)));12)&" mois et "&
TEXTE(MAX(C$2;$B3)-MOIS.DECALER(MIN(C$2;$B3);SOMME(--(MOIS.DECALER(MIN(C$2;$B3);LIGNE(DECALER($A$1;;;12*(ABS(ANNEE($B3)-ANNEE(C$2))+1);)))<=MAX(C$2;$B3))));
"[>1]0"" jours."";0"" jour.""")
À valider par Ctrl Maj Entrée.


On trouvera la mise en œuvre du dit code et de sa transcription en formule Excel dans l'onglet Feuille03 du classeur joint.

Cela dit, je crois que le problème posé est difficile à résoudre à la satisfaction de tous. On trouvera dans l'onglet Memo quelques éléments d'explication de mon opinion.

Pour finir, j'ai repris, en la simplifiant, la formule de Modeste geedee revue par JCGL dans le message #12. Voir l'onglet Feuille02.​


Bonne journée.
 

Pièces jointes

  • Ecart entre deux dates.xlsm
    128.6 KB · Affichages: 26
Dernière édition:

ROGER2327

XLDnaute Barbatruc
Re : Calcul entre deux dates (ancienne et récente)

Bonjour à tous.


La fonction DifDate proposée ci-dessus est très-lente. On peut accélérer :​
VB:
Function DifDate$(début As Date, fin As Date) 
Dim D As Date, F As Date, T&, Jo%
'  Application.Volatile 'Facultatif
  If début < fin Then D = début: F = fin Else D = fin: F = début
  F = Int(F) - (Round(F - Int(F) - D + Int(D), 6) >= 0)
  T = 12 * (Year(F) - Year(D)) + Month(F) - Month(D)
  T = T + (DecMois(D, T) >= F)
  Jo = F - DecMois(D, T) - 1
  DifDate = T \ 12 & " an" & IIf(T \ 12 > 1, "s, ", ", ") & T Mod 12 & " mois et " & Jo & " jour" & IIf(Jo > 1, "s.", ".")
End Function


ℝOGER2327
#7137


Dimanche 8 Gueules 141 (Fête de la Chandelle Verte - fête Suprême Tierce)
14 Pluviôse An CCXXII, 5,8389h - avelinier
2014-W05-7T14:00:48Z
 

Discussions similaires

Réponses
9
Affichages
549

Statistiques des forums

Discussions
312 211
Messages
2 086 299
Membres
103 172
dernier inscrit
Aurelyan