Date et heure DATEDIFF_AMJ4

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

patricktoulon

XLDnaute Barbatruc
Bonjour a tous
j'avais fait une fonction "DATEDIFFAMJ" il y a quelque temps pour obtenir la différence entres deux date ans mois et jour
et un demandeur a faite une demande concernant la différence entre deux dates
sauf que lui avait besoins de faire la différence de dates 1 et 2 (entre deux siècles)
et pour couronner le tout avec des dates en dessous l'année 1900
j'ai donc repris ma fonction de base et utilisé une astuce simple
si pour la date la plus ancienne c'est une année divisible par 4 ou 400 je la décale en 2020( fevrier 28/29) sinon je la décale en 1904

10/10/2025
mise ajour de la fonction est est doté du multi ReturnMode
toujours la date2 en optional aussi histoire d'avoir l'anniversaire


en dessous 1800 non garantie

la fonction:

exemple d'utilisation en formule :

VB:
Function DATEDIFF_AMJ4$(ByVal dat1 As Date, Optional ByVal dat2 As Date = 0, Optional ReturnMode As String = 0)
    '**************************************
    ' fonction DateDiffAMJ V°4
    ' auteur:patricktoulon sur Exceldownloads
    ' date de mise en jour V°4:04/07/2021
    ' mise a jour supplementaire
    ' ajout de l'argument boolean "JustYear" pour ne récuprérer que les années
    ' mise à jour 09/102025
    ' suppression de l'argument boolean "Justyear" et remplaement par un variant
    ' pouvant ùodifier le return
    ' an ou mois ou jour ou les trois  en textuelou les trois en array
    'ajout du passage au calendrier gregorien pour la date 1 en dessous le 24 fevrier 1582
    '*************************************
    Dim A$, M$, J$, Ax&, Mx&, Jx, Dtemp$, et$, yeardécalée&, y
    If dat2 = 0 Then dat2 = Date
    If dat1 > dat2 Then Dtemp = dat2: dat2 = dat1: dat1 = Dtemp
    If dat1 < #12/20/1582# And dat2 > #12/20/1582# Then dat1 = dat1 + 10 '(julien/grégorien) perte de 10 jours suggéré par @Modete geedee  
    If Year(dat1) < 1904 Then If Year(dat1) Mod 4 <> 0 Or Year(dat1) Mod 400 <> 0 Then y = 2020 Else y = 1905
    If Year(dat1) < y Then
        'on decale la date la plus ancienne (Dat1)à l'année 1904
        yeardécalée = Abs((Year(dat1) - y))
        dat1 = DateSerial(Year(dat1) + yeardécalée, Month(dat1), Day(dat1))
        dat2 = DateSerial(Year(dat2) + yeardécalée, Month(dat2), Day(dat2))
    End If
    A = Evaluate("=DATEDIF(" & CLng(dat1) & "," & CLng(dat2) & ",""y"")"): Ax = A
    M = Evaluate("=DATEDIF(" & CLng(dat1) & "," & CLng(dat2) & ",""ym"")"): Mx = M
    J = Evaluate("=DATEDIF(" & CLng(dat1) & "," & CLng(dat2) & ",""md"")"): Jx = J
 
    A = IIf(A = 0, "", IIf(A = 1, A & " an ", A & " ans "))
    M = IIf(M = 0, "", IIf(M = 1, M & " mois", M & " mois"))
    J = IIf(J = 0, "", IIf(J = 1, "1 jour", J & " jours"))
    et = IIf(Val(A) > 0 Or Val(M) > 0, IIf(Val(J) > 0, " et ", " "), "")
       Select Case LCase(CStr(ReturnMode))
        Case "a", "1": DATEDIFF_AMJ4 = Ax
        Case "m", "2": DATEDIFF_AMJ4 = Mx
        Case "j", "3": DATEDIFF_AMJ4 = Jx
        Case "amj", "4", "0": DATEDIFF_AMJ4 = Application.Trim(A & M & " " & et & J)
        Case "T", 5: DATEDIFF_AMJ4 = Array(Ax, Mx, Jx)
    End Select
 End Function


Code:
=datediffAMJ4(date1;date2)      différence textuelle
=datediffAMJ4(date1)            anniversaire textuelle  par date2 par defaut
=datediffAMJ4(date1;date2;1)    année   argument (1 ou "a" ou "A")
=datediffAMJ4(date1;date2;2)    les mois   argument (2 ou "m" ou "M")
=datediffAMJ4(date1;date2,3)    les jours   argument (3 ou "j" ou "J")
=datediffAMJ4(date1;date2,4)    différence textuelle  argument (0 ou 4 ou "amj" ou "AMJ" )
=datediffAMJ4(date1;date2,5)    un array des trois datas de date argument (5 ou "t" ou "T") pratique pour le vba
petite démo
1760047154458.png


l'utilisation en VBA se fait de la même manière

et sauf erreur de ma part elle est compatible All version Excel
 

Pièces jointes

  • 1760221456989.png
    1760221456989.png
    6.1 KB · Affichages: 1
Dernière édition:
Bonjour @VIARD
merci pour ces tests
et oui je ne traitre que les date valide yyyy/mm/dd ou dd/mm/yyyy
ce qui est déjà pas mal

ps:un peu humour
celui qui est né en 1789 y viendra pas me casser les noisettes si je me suis trompé hein
 
Bonjour a tous
j'avais fait une fonction "DATEDIFFAMJ" il y a quelque temps pour obtenir la différence entres deux date ans mois et jour
et un demandeur a faite une demande concernant la différence entre deux dates
sauf que lui avait besoins de faire la différence de dates 1 et 2 (entre deux siècles)
et pour couronner le tout avec des dates en dessous l'année 1900
j'ai donc repris ma fonction de base et utilisé une astuce simple
si pour la date la plus ancienne c'est une année divisible par 4 ou 400 je la décale en 2020( fevrier 28/29) sinon je la décale en 1904

10/10/2025
mise ajour de la fonction est est doté du multi ReturnMode
toujours la date2 en optional aussi histoire d'avoir l'anniversaire


en dessous 1800 non garantie

la fonction:

exemple d'utilisation en formule :

VB:
Function DATEDIFF_AMJ4$(ByVal dat1 As Date, Optional ByVal dat2 As Date = 0, Optional ReturnMode As String = 0)
    '**************************************
    ' fonction DateDiffAMJ V°4
    ' auteur:patricktoulon sur Exceldownloads
    ' date de mise en jour V°4:04/07/2021
    ' mise a jour supplementaire
    ' ajout de l'argument boolean "JustYear" pour ne récuprérer que les années
    ' mise à jour 09/102025
    ' suppression de l'argument boolean "Justyear" et remplaement par un variant
    ' pouvant ùodifier le return
    ' an ou mois ou jour ou les trois  en textuelou les trois en array
    '*************************************
    Dim A$, M$, J$, Ax&, Mx&, Jx, Dtemp$, et$, yeardécalée&, y
    If dat2 = 0 Then dat2 = Date
    If dat1 > dat2 Then Dtemp = dat2: dat2 = dat1: dat1 = Dtemp
    If Year(dat1) < 1904 Then If Year(dat1) Mod 4 <> 0 Or Year(dat1) Mod 400 <> 0 Then y = 2020 Else y = 1905
    If Year(dat1) < y Then
        'on decale la date la plus ancienne (Dat1)à l'année 1904
        yeardécalée = Abs((Year(dat1) - y))
        dat1 = DateSerial(Year(dat1) + yeardécalée, Month(dat1), Day(dat1))
        dat2 = DateSerial(Year(dat2) + yeardécalée, Month(dat2), Day(dat2))
    End If
    A = Evaluate("=DATEDIF(" & CLng(dat1) & "," & CLng(dat2) & ",""y"")"): Ax = A
    M = Evaluate("=DATEDIF(" & CLng(dat1) & "," & CLng(dat2) & ",""ym"")"): Mx = M
    J = Evaluate("=DATEDIF(" & CLng(dat1) & "," & CLng(dat2) & ",""md"")"): Jx = J
 
    A = IIf(A = 0, "", IIf(A = 1, A & " an ", A & " ans "))
    M = IIf(M = 0, "", IIf(M = 1, M & " mois", M & " mois"))
    J = IIf(J = 0, "", IIf(J = 1, "1 jour", J & " jours"))
    et = IIf(Val(A) > 0 Or Val(M) > 0, IIf(Val(J) > 0, " et ", " "), "")
       Select Case LCase(CStr(ReturnMode))
        Case "a", "1": DATEDIFF_AMJ4 = Ax
        Case "m", "2": DATEDIFF_AMJ4 = Mx
        Case "j", "3": DATEDIFF_AMJ4 = Jx
        Case "amj", "4", "0": DATEDIFF_AMJ4 = Application.Trim(A & M & " " & et & J)
        Case "T", 5: DATEDIFF_AMJ4 = Array(Ax, Mx, Jx)
    End Select
 End Function


Code:
=datediffAMJ4(date1;date2)      différence textuelle
=datediffAMJ4(date1)            anniversaire textuelle  par date2 par defaut
=datediffAMJ4(date1;date2;1)    année   argument (1 ou "a" ou "A")
=datediffAMJ4(date1;date2;2)    les mois   argument (2 ou "m" ou "M")
=datediffAMJ4(date1;date2,3)    les jours   argument (3 ou "j" ou "J")
=datediffAMJ4(date1;date2,4)    différence textuelle  argument (0 ou 4 ou "amj" ou "AMJ" )
=datediffAMJ4(date1;date2,5)    un array des trois datas de date argument (5 ou "t" ou "T") pratique pour le vba
petite démo
Regarde la pièce jointe 1223397

l'utilisation en VBA se fait de la même manière

et sauf erreur de ma part elle est compatible All version Excel
Bonsour
Petit soucis pour les dates antérieures à octobre 1582 (date début du calendrier gregorien) disparition de 11 jours du calendrier Julien
C-a-d la différence en jours entre une date VBA antérieures à ce changement et une date VBA ultérieure est entachée de cette différence

Dateserial(1815 ,1, 24) - dateserial(1515, 1, 24) est erronée de 11 jours.

Nb: j'interviens comme la "mouche du coche",
Ayant apprécié tes derniers échanges à-propos des "calendars", je reprends doucement mes élucubrations Excel (presque 2 ans d'abstinence) en fouillant dans mes archives et mes expérimentations "calendaires" (grégorienne, juliennes, républicaines, hegirienne, astronomiques, astrologiques, linguistiques etc...)
Affaires à suivre...
 
Bonjour @Modeste geedee
bon retour parmi nous
oui je sais que de 1582 à 1784 tout le monde n'avait pas encore adopté le calendrier grégorien
et qu'il y a 11 jours qui disparaissent (qui devraient )
c'est bien pour ça que je dis au départ en dessous 1800 non garanti

de 1583 à 1587
  • Pays-Bas catholiques : 1583
  • Luxembourg : 1583
  • Bavière, Autriche, Tyrol : 1583–1584
  • Suisse catholique (cantons comme Lucerne, Fribourg) : 1584
  • Hongrie : 1587

au 17e siècle (pays protestants plus tardifs)
  • Prusse : 1610
  • Provinces protestantes des Pays-Bas : 1700–1701
  • Danemark, Norvège, Islande : 1700
  • État allemand protestant (Saxe, Brandebourg, etc.) : 1700
  • Suisse protestante (Zurich, Bâle, etc.) : 1701
Adoption britannique et colonies
  • Grande-Bretagne et Empire britannique (y compris les colonies américaines) : 1752
  • Passage du 2 septembre 1752 au 14 septembre 1752.
Cas particulier de la Suède
  • Tentative ratée en 1700–1712, puis retour au calendrier julien,
  • adoption définitive du calendrier grégorien en 1753.

Europe de l’Est et monde orthodoxe
  • Bulgarie : 1916
  • Russie : 1918 (décret bolchevique → 31 janvier 1918 suivi du 14 février 1918)
  • Serbie : 1919
  • Grèce : 1923
  • Autres régions du monde
  • Japon : 1873 (ère Meiji, passage direct du 31 décembre 1872 au 1er janvier 1873)
  • Égypte : 1875 (usage civil, mais calendrier copte reste religieux)
  • Chine : 1912 (officiellement, mais adoption généralisée seulement vers 1929)
  • Turquie : 1926
  • Roumanie : 1919
  • Albanie : 1912
  • Yougoslavie : 1919
  • Estonie, Lettonie, Lituanie : 1915–1918
allez Kado
ca mange pas de pain si on veut être precis
VB:
Function DATEDIFF_AMJ4$(ByVal dat1 As Date, Optional ByVal dat2 As Date = 0, Optional ReturnMode As String = 0)
    '**************************************
    ' fonction DateDiffAMJ V°4
    ' auteur:patricktoulon sur Exceldownloads
    ' date de mise en jour V°4:04/07/2021
    ' mise a jour supplementaire
    ' ajout de l'argument boolean "JustYear" pour ne récuprérer que les années
    ' mise à jour 09/102025
    ' suppression de l'argument boolean "Justyear" et remplaement par un variant
    ' pouvant ùodifier le return
    ' an ou mois ou jour ou les trois  en textuelou les trois en array
    'ajout du passage au calendrier gregorien pour la date 1 en dessous le 24 fevrier 1582
    '*************************************
    Dim A$, M$, J$, Ax&, Mx&, Jx, Dtemp$, et$, yeardécalée&, y
    If dat2 = 0 Then dat2 = Date
    If dat1 > dat2 Then Dtemp = dat2: dat2 = dat1: dat1 = Dtemp
    If dat1 < #12/20/1582# And dat2 > #12/20/1582# Then dat1 = dat1 + 10 '(julien/grégorien) perte de 10 jours suggéré par @Modete geedee
    If Year(dat1) < 1904 Then If Year(dat1) Mod 4 <> 0 Or Year(dat1) Mod 400 <> 0 Then y = 2020 Else y = 1905
    If Year(dat1) < y Then
        'on decale la date la plus ancienne (Dat1)à l'année 1904
        yeardécalée = Abs((Year(dat1) - y))
        dat1 = DateSerial(Year(dat1) + yeardécalée, Month(dat1), Day(dat1))
        dat2 = DateSerial(Year(dat2) + yeardécalée, Month(dat2), Day(dat2))
    End If
    A = Evaluate("=DATEDIF(" & CLng(dat1) & "," & CLng(dat2) & ",""y"")"): Ax = A
    M = Evaluate("=DATEDIF(" & CLng(dat1) & "," & CLng(dat2) & ",""ym"")"): Mx = M
    J = Evaluate("=DATEDIF(" & CLng(dat1) & "," & CLng(dat2) & ",""md"")"): Jx = J
 
    A = IIf(A = 0, "", IIf(A = 1, A & " an ", A & " ans "))
    M = IIf(M = 0, "", IIf(M = 1, M & " mois", M & " mois"))
    J = IIf(J = 0, "", IIf(J = 1, "1 jour", J & " jours"))
    et = IIf(Val(A) > 0 Or Val(M) > 0, IIf(Val(J) > 0, " et ", " "), "")
       Select Case LCase(CStr(ReturnMode))
        Case "a", "1": DATEDIFF_AMJ4 = Ax
        Case "m", "2": DATEDIFF_AMJ4 = Mx
        Case "mm", "6": DATEDIFF_AMJ4 = (Ax * 12) + Mx & " mois"
        Case "j", "3": DATEDIFF_AMJ4 = Jx
        Case "amj", "4", "0": DATEDIFF_AMJ4 = Application.Trim(A & M & " " & et & J)
        Case "T", 5: DATEDIFF_AMJ4 = Array(Ax, Mx, Jx)
    End Select
 End Function
 
Dernière édition:
Bonjour @Modeste geedee
bon retour parmi nous
oui je sais que de 1582 à 1784 tout le monde n'avait pas encore adopté le calendrier grégorien
et qu'il y a 11 jours qui disparaissent (qui devraient )
c'est bien pour ça que je dis au départ en dessous 1800 non garanti

de 1583 à 1587
  • Pays-Bas catholiques : 1583
  • Luxembourg : 1583
  • Bavière, Autriche, Tyrol : 1583–1584
  • Suisse catholique (cantons comme Lucerne, Fribourg) : 1584
  • Hongrie : 1587

au 17e siècle (pays protestants plus tardifs)
  • Prusse : 1610
  • Provinces protestantes des Pays-Bas : 1700–1701
  • Danemark, Norvège, Islande : 1700
  • État allemand protestant (Saxe, Brandebourg, etc.) : 1700
  • Suisse protestante (Zurich, Bâle, etc.) : 1701
Adoption britannique et colonies
  • Grande-Bretagne et Empire britannique (y compris les colonies américaines) : 1752
  • Passage du 2 septembre 1752 au 14 septembre 1752.
Cas particulier de la Suède
  • Tentative ratée en 1700–1712, puis retour au calendrier julien,
  • adoption définitive du calendrier grégorien en 1753.

Europe de l’Est et monde orthodoxe
  • Bulgarie : 1916
  • Russie : 1918 (décret bolchevique → 31 janvier 1918 suivi du 14 février 1918)
  • Serbie : 1919
  • Grèce : 1923
  • Autres régions du monde
  • Japon : 1873 (ère Meiji, passage direct du 31 décembre 1872 au 1er janvier 1873)
  • Égypte : 1875 (usage civil, mais calendrier copte reste religieux)
  • Chine : 1912 (officiellement, mais adoption généralisée seulement vers 1929)
  • Turquie : 1926
  • Roumanie : 1919
  • Albanie : 1912
  • Yougoslavie : 1919
  • Estonie, Lettonie, Lituanie : 1915–1918
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Retour