Taille de police :

×

Lecture de la page :

Lire Test2
|

Ma version de la fonction DATEDIF

0
(0)

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"

Comparaison des résultats des 2 fonctions DATEDIF avec l'unité d

Unité "m"

Comparaison des résultats des 2 fonctions DATEDIF avec l'unité m

Unité "y"

Comparaison des résultats des 2 fonctions DATEDIF avec l'unité y

Unités "md", "ym", "y"

Je vous laisse admirer le -1 et -2 de la fonction officielle 😁.

Comparaison et analyse des résultats des 2 fonctions DATEDIF avec les unités md, ym, y
  • 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.

Article intéressant ?

Cliquez sur une étoile pour noter cet article !

Note moyenne 0 / 5. Nombre de votes : 0

Aucun vote pour l'instant ! Soyez le premier à noter ce post.

Nous sommes désolés que cet article ne vous ait pas été utile !

Améliorons cet article !

Dites nous comment nous pouvons améliorer cet article ?

Publications similaires

Un commentaire

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *