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 à tous,
Une fonction à tester
VB:
Function AgeG(DateDebut, DateFin)
Dim dD As Double, dF As Double
If DateDebut.Text Like "*#/##/##*" Then
        dD = DateValue(DateDebut.Text)
        If DateFin.Text Like "*#/##/##*" Then
                dF = DateValue(DateFin.Text)
                AgeG = Int((dF - dD) / 365.25)
        Else
                AgeG = " ? format jj/mm/aaaa"
        End If
Else
        AgeG = " ? format jj/mm/aaaa"
End If
End Function
 
les fonctions basique internes fonctionnent
VB:
Sub tests()
'dernier jour de fevrier
    bisextile = Day(DateSerial(1574, 3, 0)) = 29
    MsgBox "fevrier 1574 " & bisextile
    bisextile = Day(DateSerial(1600, 3, 0)) = 29
    MsgBox "fevrier 1600 " & bisextile

End Sub

re
en 2020 février contient 29 jours
date1=01/01/2020
date2=10/03/2020
donc = 2 mois et 9 jours

en 2021 février contient 28 jours
date1=01/01/2021
date2=10/03/2021
donc = 2 mois et 9 jours

maintenant si la date1 est courant février 2020 après le 1er du mois
date1=10/02/2020 ----------------------donc reste 19 jours
date2=10/03/2020 ---------------------- donc 10 jour
donc = 29 jours

maintenant si la date1 est courant février 2021
date1=10/02/2021 ----------------------donc reste 18 jours
date2=10/03/2021 ---------------------- donc 10 jour
donc = 28 jours

en fait dans cet exercice , seul compte le fait que la date1 soit courant février + que le premier du mois ou pas le reste on s'en tape
VB:
Sub test()
    date1 = CDate("01/01/2020")
    date2 = CDate("10/03/2020")
    MsgBox DateDiffAMJ4$(date1, date2)

    date1 = CDate("01/01/2021")
    date2 = CDate("10/03/2021")
    MsgBox DateDiffAMJ4$(date1, date2)

    date1 = CDate("10/02/2020")
    date2 = CDate("09/03/2020")
    MsgBox DateDiffAMJ4$(date1, date2)

    date1 = CDate("10/02/2021")
    date2 = CDate("09/03/2021")
    MsgBox DateDiffAMJ4$(date1, date2)

    date1 = CDate("10/02/2020")
    date2 = CDate("10/03/2020")
    MsgBox DateDiffAMJ4$(date1, date2)

    date1 = CDate("10/02/2021")
    date2 = CDate("10/03/2021")
    MsgBox DateDiffAMJ4$(date1, date2)

    date1 = CDate("10/02/2021")
    date2 = CDate("17/03/2021")
    MsgBox DateDiffAMJ4$(date1, date2)

    
    date1 = CDate("10/02/1574")
    date2 = CDate("17/03/1574")
    MsgBox DateDiffAMJ4$(date1, date2)

    
    date1 = CDate("10/02/1574")
    date2 = CDate("17/03/1633")
    MsgBox DateDiffAMJ4$(date1, date2)



End Sub


Function DateDiffAMJ4$(ByVal dat1 As Date, ByVal dat2 As Date)
    Dim A$, M$, J$, Dtemp$, et$, yeardécalée&, Y
    If dat1 > dat2 Then Dtemp = dat2: dat2 = dat1: dat1 = Dtemp
    If Year(date1) < 1904 Then If Year(date1) Mod 4 <> 0 Or Year(date1) Mod 400 <> 0 Then Y = 2020 Else Y = 1904
    If Year(dat1) < Y Or Year(dat2) < 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"")")
    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
 
Bonjour à tous.

Que donne la durée entre le 9 et le 20 décembre 1582 (en France)
Imposé par Grégoire XIII dans les États pontificaux, le calendrier grégorien fut aussi immédiatement adopté par l'Espagne, l'Italie, la Pologne et le Portugal.
En France, Henri III l'adopta le 9 décembre 1582, dont le lendemain fut le 20 décembre 1582
mais les différents parlements ont approuvé ce changement plus ou moins tardivement.
De plus, les provinces suivantes n'étaient pas françaises à l'époque :
Alsace : le 5 février 1682 est suivi par le 16 février 1682.
Lorraine : le 16 février 1760 est suivi par le 28 février 1760...
 
bonjour Robert
ce lien a été déjà présente dans le fil et pour moi c'est de la daube
1625386448502.png


la mienne
1625386700303.png


y a rien a garder de cette fonction absolument rien 😉
 
Dernière édition:
re
ma fonction DateDiffAMJ en version 4
VB:
'**************************************
'fonction DateDiffAMJ V°4
'auteur:patricktoulon sur Exceldownloads
'date de mise en jour V°4:04/07/2021
'licence :libre si commentaire
'*************************************

Function DateDiffAMJ4$(ByVal dat1 As Date, ByVal dat2 As Date)
    Dim A$, M$, J$, Dtemp$, et$, yeardécalée&, y
    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 = 1904
    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"")")
    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

@Caninge la mienne fonctionne
 

Pièces jointes

Dernière édition:
le principe est simple
si la date1 > que la date2 alors date1 devient la 2 et la 2 devient la 1
si l'année <1904 ET !!!! si l'année de date1 mod 4 ou mod 400 = 0 alors je la décale en 2020 sinon en 1904
et je décale la 2 du même prorata
le reste c'est ma fonction de base DateDiffAMJ
et voili voilou

comme l'a indiquer @Victor21
selon les lubies du pape et henryIII et je sais plus quel pingouins ne pas descendre en dessous de 1800
 
tout d'abords il faudrait que tu explique quelle dates doivent etre calculées
là comme ca ton fichier ne veut rien dire
pas étonnant que tu comprenne pas
faut faire plus d'effort dans la presentation d'un probleme
donc question :
quelle dates doivent etre calculée ?
 
Oui ok,
Je ne fais peut-être pas les choses correctement, oui c'est vrai.
mais je respecte les personnes.
Je suis peut-être maladroit. Je suis désolé

J'ai refait mon tableau.
Dans la colonne D : Les dates de naissance.
Dans la colonne E : Les dates de décès.
Dans la colonne F : L'âge des personnes décédées
Je vais avoir à peu près 10000 lignes.
Ce sont les coureurs cyclistes qui ont fait le Tour de France depuis 1903.
Il y a les les inscrits et les partants.
Merci
 

Pièces jointes

Notre forum d’entraide est 100 % gratuit et le restera.
Aucune formation payante, aucun fichier à acheter, rien à vendre. Mais comme tout site, nous devons couvrir nos frais pour continuer à vous accompagner.
Soutenez-nous en souscrivant à un compte membre : c’est rapide, vous choisissez simplement votre niveau de soutien et le tour est joué.

Je soutiens la communauté et j’accède à mon compte membre

Discussions similaires

Réponses
10
Affichages
491
Réponses
3
Affichages
350
Retour