age calcul entre 2 dates

phil ed

XLDnaute Nouveau
Bonsoir,

je cherche une formule pour calculer l'âge d'une personne
à une date déterminée

le fichier en annexe :
avec la formule ((-A2+B2)+1)/365
j'obtiens une réponse exacte sauf lorsque l'on se trouve quelques jours
avant la date anniversaire : dans le 2 ème cas de figure ,j'obtiens un
résultat de 28 ans alors que la personne n'a pas encore 28 ans
(je devrais obtenir 27,9)

influence des années bisextiles ?

quelqu'un peût il me procurer une formule exacte dans tous les cas de figure ?

merci
 

Pièces jointes

  • age for.xls
    26 KB · Affichages: 784

CB60

XLDnaute Barbatruc
Re : age calcul entre 2 dates

Re
13GIBE59, avec ta formule je n'ai pas le même résultat??
HTML:
=DATEDIF(D3;AUJOURDHUI();"y")&" années "&DATEDIF(D3;AUJOURDHUI();"ym")&" mois "&DATEDIF(D3;AUJOURDHUI();"md")&" jours "
Pour moi cela donne
50 années 0 mois 18 jours
et pour toi
50 années 1 mois 18 jours
 

ROGER2327

XLDnaute Barbatruc
Re : age calcul entre 2 dates

Bonjour à tous
Code:
=SI(AUJOURDHUI()<$A$1;"";ANNEE(AUJOURDHUI())-ANNEE($A$1)-((100*MOIS(AUJOURDHUI())+JOUR(AUJOURDHUI()))<(100*MOIS($A$1)+JOUR($A$1)))&" a "&MOIS(AUJOURDHUI())-MOIS($A$1)+12*((100*MOIS(AUJOURDHUI())+JOUR(AUJOURDHUI()))<(100*MOIS($A$1)+JOUR($A$1))-(JOUR(AUJOURDHUI())<JOUR($A$1))*(1-DATE(ANNEE(AUJOURDHUI());MOIS(AUJOURDHUI())-1;1)+DATE(ANNEE(AUJOURDHUI());MOIS(AUJOURDHUI());1)))&" m "&JOUR(AUJOURDHUI())-JOUR($A$1)-(JOUR(AUJOURDHUI())<JOUR($A$1))*(DATE(ANNEE(AUJOURDHUI());MOIS(AUJOURDHUI())-1;1)-DATE(ANNEE(AUJOURDHUI());MOIS(AUJOURDHUI());1))[COLOR="Red"]+1[/COLOR]&" j")
me semble correct. Je compte "aujourd'hui" dans ce calcul, c'est-à-dire que si on a
Code:
=AUJOURDHUI()
dans la cellule A1, la formule renvoie
0 a 0 m 1 j
Si on veut obtenir
0 a 0 m 0 j
prendre la formule
Code:
=SI(AUJOURDHUI()<$A$1;"";ANNEE(AUJOURDHUI())-ANNEE($A$1)-((100*MOIS(AUJOURDHUI())+JOUR(AUJOURDHUI()))<(100*MOIS($A$1)+JOUR($A$1)))&" a "&MOIS(AUJOURDHUI())-MOIS($A$1)+12*((100*MOIS(AUJOURDHUI())+JOUR(AUJOURDHUI()))<(100*MOIS($A$1)+JOUR($A$1))-(JOUR(AUJOURDHUI())<JOUR($A$1))*(1-DATE(ANNEE(AUJOURDHUI());MOIS(AUJOURDHUI())-1;1)+DATE(ANNEE(AUJOURDHUI());MOIS(AUJOURDHUI());1)))&" m "&JOUR(AUJOURDHUI())-JOUR($A$1)-(JOUR(AUJOURDHUI())<JOUR($A$1))*(DATE(ANNEE(AUJOURDHUI());MOIS(AUJOURDHUI())-1;1)-DATE(ANNEE(AUJOURDHUI());MOIS(AUJOURDHUI());1))&" j")
Si quelqu'un a trouvé quelque chose de plus court, merci à lui de le faire savoir.
Bonne nuit !
ROGER2327
 

ROGER2327

XLDnaute Barbatruc
Re : age calcul entre 2 dates

Re...
Code:
[B]Option Explicit

Function difdate(d As Date, Optional f As Date = 0) As String
[COLOR="Green"]' On doit avoir d<f.
' Si f est omis, f est la date du jour.[/COLOR]
Dim a As Integer, m As Integer, j As Integer
   Application.Volatile
   If f = 0 Then f = Date
   If f < d Then Exit Function
   Do While d < f
      d = DateSerial(Year(d) + 1, Month(d), Day(d))
      a = a + 1
   Loop
   If d > f Then d = DateSerial(Year(d) - 1, Month(d), Day(d)): a = a - 1
   Do While d < f
      d = DateSerial(Year(d), Month(d) + 1, Day(d))
      m = m + 1
   Loop
   If d > f Then d = DateSerial(Year(d), Month(d) - 1, Day(d)): m = m - 1
   Do While d < f
      d = DateSerial(Year(d), Month(d), Day(d) + 1)
      j = j + 1
   Loop
   j = j + 1 [COLOR="Green"]' ou 0 selon les goûts...[/COLOR]
   difdate = IIf(a, a & " an" & IIf(a > 1, "s", ""), "") & IIf(m, " " & m & " mois", "") & IIf(j, " " & j & " jour" & IIf(j > 1, "s", ""), "")
End Function[/B]
=difdate(DATEVAL("3/5/1948"))
renvoie
60 ans 11 mois 19 jours.​
ROGER2327
 

vbacrumble

XLDnaute Accro
Re : age calcul entre 2 dates

Bonjour à tous, Roger2327

EDITION: avec celle-ci , résultat 60 a 11 m 18 j
Code:
Function Age(Date1 As Date, Date2 As Date) As String 'cpearson
    Dim Y As Integer
    Dim M As Integer
    Dim D As Integer
    Dim Temp1 As Date
    Temp1 = DateSerial(Year(Date2), Month(Date1), Day(Date1))
    Y = Year(Date2) - Year(Date1) + (Temp1 > Date2)
    M = Month(Date2) - Month(Date1) - (12 * (Temp1 > Date2))
    D = Day(Date2) - Day(Date1)
    If D < 0 Then
        M = M - 1
        D = Day(DateSerial(Year(Date2), Month(Date2) + 1, 0)) + D + 1
    End If
    Age = Y & " a " & M & " m " & D & " j"
End Function

Une autre function VBA corrigeant le bug de DateDiff selon son auteur
Code:
Function ECARTDATE(Debut, Fin) As String [COLOR="Green"]' -> JP Mesters[/COLOR]
Dim Nba, Nbm, Nbj, Retenue As Integer
Nba = Year(Fin) - Year(Debut)
Nbm = Month(Fin) - Month(Debut)
Nbj = Day(Fin) - Day(Debut)
Retenue = Day(DateSerial(Year(Fin), Month(Fin), 0))
If Nbj < 0 Then
Nbm = Nbm - 1
Nbj = Nbj + Retenue
End If
If Nbm < 0 Then
Nba = Nba - 1
Nbm = Nbm + 12
End If
If Debut > Fin Then
ECARTDATE = "#CHRONOLOGIE!"
Else
ECARTDATE = Nba & "a " & Nbm & "m " & Nbj & "j"
End If
End Function
Roger2327
Par contre avec ton exemple elle renvoie : 60a 11m 18j ??
 
Dernière édition:

ROGER2327

XLDnaute Barbatruc
Re : age calcul entre 2 dates

Bonsoir
Roger2327
Par contre avec ton exemple elle renvoie : 60a 11m 18j ??
Réponse : Supprimez la ligne
Code:
   j = j + 1 ' ou 0 selon les goûts...
La fonction age n'est pas correcte :

=age(DATEVAL("03/05/1948");DATEVAL("30/04/2009")) renvoie 60 a 11 m 27 j

=age(DATEVAL("03/05/1948");DATEVAL("01/05/2009")) renvoie 60 a 11 m 30 j

Par contre, la fonction ECARTDATE me semble excellente et bien préférable à la mienne. Il convient seulement de compléter le typage des variables :
Code:
Dim Nba As Integer, Nbm As Integer, Nbj As Integer, Retenue As Integer
Merci, je retiendrai cette procédure.​
Bonne nuit !
ROGER2327
 

ROGER2327

XLDnaute Barbatruc
Re : age calcul entre 2 dates

RE....
Or cette modif n'est pas à faire dans Ecartdate
Exact ! La modification est à faire dans la procédure où se trouve la ligne litigieuse. C'est-à-dire dans la procédure que je proposai hier (21/4).
Le bon âge c'est 60a 11m 18j ou 60a 11m 19j ?
Tout dépend de comment on voit les choses : La date initiale est-elle considérée comme jour 0 ou comme jour 1 ? Si je nais aujourd'hui, dirai-je demain : "Zai un zour" ? Ou dirai-je demain : "Zai deux zours" ? (Mais ce qui est sûr, c'est que je ne dirai ni "J'ai un Jour", ni "J'ai deux jours", car je serai encore petit et je zézaierai.)​
ROGER2327
 
Dernière édition:

Discussions similaires

Réponses
16
Affichages
688

Statistiques des forums

Discussions
312 229
Messages
2 086 423
Membres
103 206
dernier inscrit
diambote