'=============================================================================================
' Fonction = AMJ(date1, Date2, periode)
' Date1 est une date au sens Excel et Date2 est aussi une date au sens Excel
' Periode indique le type de retour :
'     - si periode est le caractère a ou A ou y ou Y alors on retourne le nombre d'année complète entre
'           les deux dates
'     - si periode est le caractère m ou M alors on retourne le nombre de mois complets entre
'           les deux dates (sans les mois des années complètes)
'     - si periode est le caractère j ou J ou d ou D alors on retourne le nombre de jours entre les
'            deux dates (sans les jours des années et mois complets)
'     - dans les autres cas, on retourne en un seul bloc les nombre d'année, de mois et de jour
'     - si periode est omis alors on applique le dernier cas (retour d'un seul bloc a m j)
'=============================================================================================
Function AMJ(ByVal d1 As Date, ByVal d2 As Date, Optional ByVal xPeriode = "")
Dim di As Date, df As Date, d As Date, a&, m&, j&, i&, x$
   di = d1: df = d2                             ' recup des deux dates
   If di >= df Then di = d2: df = d1            ' di plus petite date, df plus grande date
   For i = 12 * (Year(df) - Year(di) + 1) To 0 Step -1   '  boucle sur un nombre de mois
      d = DateSerial(Year(di), Month(di) + i, Day(di))   ' d est la date di à laquelle on ajoute le nombre de mois i
      If d <= df Then m = i: Exit For     ' si d est inférieur à la date df alors le nombre de mois complet est i
   Next i
   a = m \ 12                             ' calcul du nombre d'année entière
   m = m - a * 12                         ' calcul du nombre de mois (sans les mois des années complètes)
   j = df - DateSerial(Year(di) + a, Month(di) + m, Day(di))   ' calcul du nombre de jours (sans les années et les mois)
   If d1 > d2 Then a = -a: m = -m: j = -j ' si d1 est postérieure à d2 alors a, m et j sont négatifs
   Select Case LCase(xPeriode)                     ' en fonction du retour souhaité
      Case "a", "y": AMJ = a                       ' retour des années complètes
      Case "m": AMJ = m                            ' retour des mois compléts
      Case "j", "d": AMJ = j                       ' retour des jours
      Case Else: AMJ = Join(Array(a, m, j), ",")   ' retour des années, mois et jours
   End Select
End Function