Function QuelAge(d1 As Date, Optional d2, Optional Précision) As String
Dim a&, m&, s&, j&
'précision: détermine le niveau de détail de l'age: j, s, m, a
If IsMissing(Précision) Then Précision = "j"
If IsMissing(d2) Then d2 = Now()
If d1 > d2 Then QuelAge = "La 2ème date doit nécessairement être plus grande que la 1ère !"
If (d1 > 60) * (d1 <= d2) Then
Do While DateSerial(Year(d1) + a + 1, Month(d1), Day(d1)) <= d2: a = a + 1: Loop
If Précision = "a" Then
QuelAge = a & " an" & IIf(a > 1, "s", "")
Exit Function
End If
Do While DateSerial(Year(d1) + a, Month(d1) + m + 1, Day(d1)) <= d2: m = m + 1: Loop
If Précision = "m" Then
QuelAge = IIf(a, a & " an" & IIf(a > 1, "s", "") & " ", "") & IIf(m, m & " mois ", "")
Exit Function
End If
Do While DateSerial(Year(d1) + a, Month(d1) + m, Day(d1) + (s + 1) * 7) <= d2: s = s + 1: Loop
If Précision = "s" Then
QuelAge = IIf(a, a & " an" & IIf(a > 1, "s", "") & " ", "") & IIf(m, m & " mois ", "") & IIf(s, s & " semaine" & IIf(s > 1, "s", "") & " ", "")
Exit Function
End If
Do While DateSerial(Year(d1) + a, Month(d1) + m, Day(d1) + s * 7 + j + 1) <= d2: j = j + 1: Loop
QuelAge = IIf(a, a & " an" & IIf(a > 1, "s", "") & " ", "") & IIf(m, m & " mois ", "") & IIf(s, s & " semaine" & IIf(s > 1, "s", "") & " ", "") & IIf(j Or (a + m + j = 0), j & " jour" & IIf(j > 1, "s", ""), "")
End If
End Function