XL 2019 Age sur deux siècles

Caninge

XLDnaute Accro
Bonjour à tous,

j'ai réussi à calculer le nombre d'années entre deux dates, mais seulement s'ils sont sur un même siècle.
Mais deux dates sur deux siècles je n'arrive pas.
Pouvez-vous m'aider s'il vous plait.
CANINGE
 

Pièces jointes

  • Age sur deux siècles.xlsx
    9 KB · Affichages: 28

patricktoulon

XLDnaute Barbatruc
bonjour tout les deux
en voila un dileme
quelle différence en année d'une date du genre par exemple 01/05/1874et le 01/08/1974

encore une astuce à la patrick

ben on décale la plus ancienne date en 1904
même prorata sur la date2
et enfin on la passe a ma fonction DateDiffAMJ3
VB:
Sub test()
Date1 = CDate("01/05/1874")
date2 = CDate("02/08/1974")

'et bien on décale jusqu'en 1904
yeardécalée = Abs((Year(Date1) - 1900)) + 4
Date1 = DateSerial(Year(Date1) + yeardécalée, Month(Date1), Day(Date1))
date2 = DateSerial(Year(date2) + yeardécalée, Month(date2), Day(date2))

'les dates sont décalées la date 1 est maintenant en 1904
' et à la date2 on a ajouté la même différence
'MsgBox Year(date2) - Year(date1) & " ans"

'elles sont donc valides pour les  passer dans ma fonction utilisant datediff
MsgBox DateDiffAMJ3$(Date1, date2)
End Sub

Function DateDiffAMJ3$(dat1, dat2)
    Dim A$, M$, J$, Dtemp$, et$
    If dat1 > dat2 Then Dtemp = dat1: dat1 = dat2: dat2 = Dtemp
    A = Evaluate("=DATEDIF(" & CLng(dat1) & "," & CLng(dat2) & ",""y"")")
    M = Evaluate("=DATEDIF(" & CLng(dat1) & "," & CLng(dat2) & ",""ym"")")
    J = Evaluate("=DATEDIF(" & CLng(dat1) & "," & CLng(dat2) & ",""md"")")
    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 ", " "), "")
    DateDiffAMJ3 = Application.Trim(A & " " & M & " " & et & J)
End Function

on en fait des pata caisse des fois pour si peu ;)
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
et allez on passe en version 4
"a rretaaa cattaaa lan clio" elle a tout d'une grande ;) 😅😂🤣

voila ma fonction traversera les siecles sans une ride 🤣

VB:
Sub test()
    date2 = CDate("01/01/1774")
    date1 = CDate("31/12/1974")

    MsgBox DateDiffAMJ4$(date1, date2)
End Sub

Function DateDiffAMJ4$(dat1, dat2)
    Dim A$, M$, J$, Dtemp$, et$, yeardécalée&
    If dat1 > dat2 Then Dtemp = dat2: dat2 = dat1: dat1 = Dtemp
    If Year(dat1) < 1904 Or Year(dat2) < 1904 Then
       'on decale la date la plus ancienne (Dat1)à l'année 1904
       yeardécalée = Abs((Year(dat1) - 1900)) + 4
        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"")")
    M = Evaluate("=DATEDIF(" & CLng(dat1) & "," & CLng(dat2) & ",""ym"")")
    J = Evaluate("=DATEDIF(" & CLng(dat1) & "," & CLng(dat2) & ",""md"")")
    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 ", " "), "")
    DateDiffAMJ4 = Application.Trim(A & " " & M & " " & et & J)
End Function
1625339121112.png



allez pour le fun 🤣
Code:
Sub test()
    date2 = CDate("01/01/0100")
    date1 = CDate("31/12/1974")

    MsgBox DateDiffAMJ4$(date1, date2)
End Sub

allez on pousse le délire avec des dates moins de 400 ans apres JC
Code:
Sub test()
    date2 = CDate("01/01/0100")
    date1 = CDate("31/12/0304")

    MsgBox DateDiffAMJ4$(date1, date2)
End Sub


a toulon le soleil cogne sec je vous le dis moi 🤣 🤣 🤣 🤣
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
@eriiic j'y ai pensé
seul février peut changer la donne
mais j'hésite avec ce raisonnement
car par exemple du 01/01/ xxxx au 10/03/yyyy que ce soit un mois de février à 28/29 jours
ce sera toujours xxxx-yyyy ans et 2 mois et 9 jours

le seul moment ou ca pourrait coincer c'est si la date1 est courant février apres le 1er du mois
au quel cas on ajoute 1 si l’année est bissextile un simple test if month( dateserial(year(date1),2,29))=2 then +1
tout les autre mois de février 28/29 sont des mois complet c'est tout
je pense que c'est bon c'est ça
 

eriiic

XLDnaute Barbatruc
Bonjour,
tu oublies que les siècles ne sont bissextiles que si divisibles par 400.
Et que ça pourrait être du 15/02 au 10/08. Là, la longueur de février compte.
Le besoin n'est que les années, mais si tu veux aller aux jours autant être le plus précis possible. Ca ne coûte pas plus cher d'ajouter 400 ans que 158 ;)
eric
 
Dernière édition:

Discussions similaires

Réponses
93
Affichages
2 K
  • Résolu(e)
Microsoft 365 =somme.si
Réponses
4
Affichages
78

Statistiques des forums

Discussions
312 165
Messages
2 085 883
Membres
103 015
dernier inscrit
Chris5707