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 :
petite démo
l'utilisation en VBA se fait de la même manière
et sauf erreur de ma part elle est compatible All version Excel
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
l'utilisation en VBA se fait de la même manière
et sauf erreur de ma part elle est compatible All version Excel
Dernière édition: