XL 2019 Age sur deux siècles

  • Initiateur de la discussion Initiateur de la discussion Caninge
  • Date de début Date de début

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 !

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

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:
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:
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
 
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:
- 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

Discussions similaires

  • Résolu(e)
Microsoft 365 DateDif()
Réponses
5
Affichages
170
Réponses
9
Affichages
153
Réponses
40
Affichages
1 K
Retour