Dans cette article (Des fonctions de calculs cachées d'Excel), j'ai mentionné des problèmes avec la fonction cachée DATEDIF.
Cette fonction permet de calculer un écart en jours, mois, années entre 2 dates.
Page d'aide officielle sur cette fonction : Fonction DATEDIF - Support Microsoft
Plusieurs difficultés se présentes pour réaliser ce type de calculs dû à la complexité du calendrier.
- La durée Jour : La plage de date du 21/10/25 au 21/10/25 (même dates), est-ce 0 ou 1 jour ?
- La durée Mois : 1 mois est-ce 30, 30,5 ou 31 jours ou lié à la date réelle du calendrier ? Et les mois de 28 ou 29 jours (février), on fait quoi ?
- La durée Année : 1 an c'est 365 jours, 365.25 jours ou lié à la date réelle du calendrier (366 jours les années bissextile) ?
Je vous propose une autre version de cette fonction qui me parait plus logique dans ses résultats mais bien évidement c'est un jugement arbitraire de ma part.
Ma fonction DateDif2
Contrairement à la fonction officielle, cette version suit la logique suivant :
- La plage de date du 21/10/25 au 21/10/25 (même dates) correspond à 1 jour (du 21/10/25 au 22/10/25 correspond à 2 jours).
- La plage de date du 01/10/25 au 31/10/25 correspond à 1 mois (du 01/10/25 au 1/11/25 correspond à 1 mois et 1 jour).
- La plage de date du 01/01/25 au 31/12/25 correspond à 1 an.
= LET(d;$B4;f;$C4;u;D$3;
g;f+1;
us;{"ym";"y";"m";"yd";"md";"d"};
i;SIERREUR(EQUIV(u;us;0);0);
SI(i=0;"Unité inconnue";
SI(i<5;DATEDIF(d;g;u);
SI(i=5;
LET(md;MOIS.DECALER(d;DATEDIF(d;g;"ym"));
nd;md+(JOUR(md)<>JOUR(d));
DATEDIF(nd;g;u));
g-d)))
)Vous n'avez qu'à préciser la valeur "d" (date de Début), ici $B4, la valeur "f" (Date de Fin), ici $C4 et la valeur "u" (unité), ici D$3 en 1ère ligne.
Si vous voulez l'utiliser comme une fonction intégrée, il vous suffit de faire une déclaration dans le gestionnaire de Nom avec la formule suivante.
= LAMBDA(début;fin;unité;
LET(d;début;f;fin;u;unité;
g;f+1;
us;{"ym";"y";"m";"yd";"md";"d"};
i;SIERREUR(EQUIV(u;us;0);0);
SI(i=0;"Unité inconnue";
SI(i<5;DATEDIF(d;g;u);
SI(i=5;
LET(md;MOIS.DECALER(d;DATEDIF(d;g;"ym"));
nd;md+(JOUR(md)<>JOUR(d));
DATEDIF(nd;g;u));
g-d)))
))Comparaison des résultats renvoyés par la fonction DATEDIF officielle et ma version
Unité "d"

Unité "m"

Unité "y"

Unités "md", "ym", "y"
Je vous laisse admirer le -1 et -2 de la fonction officielle 😁.

- Colonne Début/Fin, en gras les changements notables.
- En rouge les valeurs différentes entre les 2 fonctions et le 29 février de 2020.
Variante
Variante où la plage du 21/10/25 au 21/10/25 (même date) doit correspondre à 1 jour, de même pour les mois et années (du 01/10/2025 au 1/11/2025 c'est 1 mois...).
=LET(d;$B4;f;$C4;u;D$3;
us;{"ym";"y";"m";"yd";"md";"d"};
i;SIERREUR(EQUIV(u;us;0);0);
SI(i=0;"Unité inconnue";
SI(i<5;DATEDIF(d;f;u);
SI(i=5;
LET(md;MOIS.DECALER(d;DATEDIF(d;f;"ym"));
nd;md+(JOUR(md)<>JOUR(d));
DATEDIF(nd;f;u));
f-d)))
)On obtiendra les même résultats que la version officielle de la fonction sauf pour les cas "étranges" avec l'unité "md". Au lieu des exotiques 0, -1, -2 comme résultat, on obtiendra respectivement 1, 1, 0.
Merci pour votre attention bienveillante.

Un commentaire