Bonjour, Salut à tous !
Tu ne pourras jamais obtenir 0 !!!! Pourquoi ?
Parce que lorsque tu fais une soustraction de dates, le résultat est assimilé à une valeur de type Date. Une telle valeur, appelée numéro de série est un nombre dans lequel la partie entière représente la date et la partie décimale l'heure. Avec la fonction Format, tu transformes cette valeur en données String en lui appliquant un format de date. Dans ce format, d représente le quantièrme du jour, or les jours allant 1 à 31 max., tu n'as aucune chance d'afficher un 0, ni un nombre supérieur à 31 pour ta représentation du nombre de jours.
Mais cela marche pourtant dans Excel : tu mets tes dates dans des cellules, tu fais la différence dans un 3e, tu mets ton format de cellule au format choisi, et tu afficheras 0 jour !!!
Pourquoi ceci dans Excel ?
Parce que le calendrier géré par Excel part du 1er janvier 1900, numéro de série 1, les dates antérieures ne sont pas reconnues par Excel, mais 0 n'est pas invalidé comme date (sinon les heures saisies sans date seraient invalides !). Et tu peux vérifier que si tu appliques un format de date au nombre 0 dans Excel, il s'affichera : 0 janvier 1900. Donc, cela explique que dans ce cas d'espèce, cette méthode pourra fonctionner sur Excel (bien que reposant sur une illusion).
Pourquoi alors pas dans VBA ?
Tout simplement parce que VBA reconnaît les dates avant le 1er janvier 1900, et 0 est bien un numéro de série représentant une date, de même que -1, -2, etc. jusqu'à -657434 qui représente la date du 1er janvier de l'an 100.
Donc, il est logique que ta différence étant 0, VBA affiche le quantième du jour correspondant à la date 0 !
Mais alors, 0 précédant 1, la veille du 1er janvier 1900 étant le 31 décembre 1899, VBA devrait afficher 31, or il affiche 30 !!!
Pourquoi 30 et non 31 ?
Très simple aussi, c'est que pour les dates qui précèdent le 1er mars 1900, le calendrier d'Excel est faux, du fait qu'Excel introduit un 29 février 1900, date qui n'existe pas ! (les années séculaires ne sont pas bissextiles sauf celles divisibles par 400).
Le calendrier VBA ne comporte pas l'erreur d'Excel, et les deux calendriers se rejoignent au 1er mars 1900 sur le numéro de série 61 (heureusement, sans quoi on ne pourrait plus travailler avec des dates que de façon plutôt compliquée).
Donc, en remontant on voit que pour VBA, le 1er janvier 1900 sera la date 2, 1 sera pour le 31 décembre 1899, et la date 0 correspond au 30 décembre 1899, d'où l'affichage de 30.
Mais comment t'en sortir pour ta différence ?
Date_difference_total = Int(b - a) & ":" & Format(b - a, "hh:mm")
Cordialement.