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

M12

XLDnaute Accro
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
 

patricktoulon

XLDnaute Barbatruc
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
 

Victor21

XLDnaute Barbatruc
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...
 

patricktoulon

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

Caninge

XLDnaute Accro
Bonjour à tous,

Je pensais qu'avec une formule l'affaire était réglée.
J'ai pris la solution de Yeahou.
Mais bon j'ai apparemment bien fait selon l'explication mais bon ça ne marche pas.
J'envoie mon fichier
 

Pièces jointes

  • Age sur deux siècles_V2.xlsm
    17.2 KB · Affichages: 3

patricktoulon

XLDnaute Barbatruc
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

  • Age sur deux siècles_V patricktoulon.xlsm
    20.6 KB · Affichages: 4
Dernière édition:

patricktoulon

XLDnaute Barbatruc
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
 

Caninge

XLDnaute Accro
re Patricktoulon,

je suis désolé je ne comprends pas ce que vous m'écrivez. C'est une langue étrangère pour moi lol.
La seule chose que j'ai pu faire c'est de faire un copier coller du code.
 

Pièces jointes

  • Age sur deux siècles_V3.xlsm
    15.4 KB · Affichages: 3

patricktoulon

XLDnaute Barbatruc
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 ?
 

Caninge

XLDnaute Accro
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

  • Age sur deux siècles_V4.xlsm
    15.5 KB · Affichages: 5

Discussions similaires

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

Statistiques des forums

Discussions
312 338
Messages
2 087 393
Membres
103 537
dernier inscrit
alisafred974