Soustraction 2 dates

Bonjour,

Je souhaite faire la différence entre 2 dates et exprimer la différence au format suivant : "dd:hh:mm". A priori le résultat correct.

L'exploitation de cette date par la suite a fait ressortir que pour une différence de, par exemple, 00:03:12 (soit 0 jours, 3 heures, 12 minutes), le nombre de jour comptabilisé est en fait de 30 !

Et c'est sytématique pour toutes les dates. Même si 2 dates sont effectivement séparées que de quelques heures, le nombre de jours dans la différence est toujours de 30.

Même avec un code plus simple et efficace a priori, j'ai toujours 30 jours de comptabilisé :

 Date_difference_total = Format(b - a, "dd:hh:mm")

"b" et "a" étant 2 dates.

Les heures et minutes sont correctes mais il y a toujours un "offset" de 30 jours minimum.

Merci pour votre aide.

Bonjour,

C'est bizarre ton affaire, si tu mets bien ton format jj/mm/aaaa et hh:mm:ss

J'ai fait le teste sur un fichier en inscrivant le nombre de jours d'écarts entre les 2 dates, vérifie que si tu convertís ton format en standard tu ai bien le même nombre entier pour la même date.

Je te joins mon exemple pour que tu puisses voir.

31classeur1.zip (3.73 Ko)

Bonjour à tous

"d" est fait pour afficher le quantième du mois d'une date pas un nombre de jours.

Il ne peut dépasser 31

32 jours donnera 1, 70 jours donnera 10... car cela soustrait les mois entiers

Les dates sont issues à la base de colonnes dont le format est custom. Cela peut avoir un impact ? Car dans tous les cas ce sont bien 2 dates, et le format est en l'occurrence le même.

En fait j'ai pu identifier aue le problème vient du format "dd:hh:mm". Je ne sais pas du tout pourquoi mais 30 jours sont comptabilisés en écrivent le format.

Si je ne précise pas de format, le calcul est juste (par exemple juste 2 heures et 17 minutes).

J'ai l'impression que tant que 24h de différence ne sont pas cumulés, forcer le format "dd:hh:mm" comptabilise 30 jours. par contre avec plus de 24h de différence, le résultat reste correct.

Bonjour 78chris,

Merci pour la réponse.

1) Je ne suis pas tout à fait sûr de bien comprendre la fonction "d" (?)

2) Que dois-je donc écrire pour comptabiliser le nombre de jours ?

Merci bien.

RE

Une date est composée du jour (quantième du mois de 1 à 31), du mois (de 1 à 12), de l'année (de 1900 à ...)

les lettres des formats d, m et y représentent donc ces composants dans les limites indiquées.

Une date est gérée comme un nombre : soit on l'affiche en numérique, soit on l'affiche en date mais on ne peut mélanger.

En plus le format que tu souhaites crée une ambiguïté dangereuse car 10:15:10 se lit normalement 10 heures, 15 mn et 10 secondes pas 10 jours, 15 heures et 10 mn...

Si tu veut mélanger les deux formats de données (numérique pour les jours et heure pour le temps) dans une même cellule, tu ne pourras le faire qu'en texte (dans une cellule au format texte) ce qui permet d'afficher mais pas d'exploiter a postériori...

x = Int(b - a)
y = b - a - x
Date_difference_total =Format(x, "##0") & ":" & Format(y, "hh:mm")

Ok je comprends mieux la problématique merci.

Supposons alors que j'ai une différence totale en Secondes entre 2 dates.

Si je souhaite afficher ça en format date standard, est-il possible de faire cela (convertir un nombre qui représente un nombre de secondes en temps ) ? Ou alors, comme je l'ai déjà fait ci-dessous, dois-je diviser successivement le nombre de secondes en plusieurs variables puis les afficher en chaîne de caractère ?

En fait ce que j'ai fait :

1) Différence entre 2 dates calculée en secondes, puis division "Mod" successives pour afficher ça au format voulu.

L'affichage final est donc :

Date_difference_total = F_days & ":" & F_hours & ":" & F_minutes

Cela correspond à ce que je veux et cela fonctionne.

2) Vérifier si cette différence, que je reconverti en secondes, est < ou > à un certain nombre de secondes "seuil" que je décide. Et c'est là que 30 jours surviennent via Day(a)..."a" étant la valeur suivante : Date_difference_total = F_days & ":" & F_hours & ":" & F_minutes

        a_days = Day(a)
        a_hours = Hour(a)
        a_minutes = Minute(a)
        a_seconds = Second(a)
        a_converted = (a_days * 86400) + (a_hours * 3600) + (a_minutes * 60) + (a_seconds)

        Date_to_seconds = a_converted

C'est ici que je me Rends compte que 30 jours sont comptabilisés. Comment cela s'explique alors que les heures minutes sont correctement extraites ?

RE

Je t'ai donné un code qui prend les jours d'une part et le temps d'autre part donc inutile de passer en secondes...

Donc soit tu affiche les jours dans une cellule au format nombre et le temps dans une autre au format heure, soit tu affiches tout en texte dans une même cellule, en adaptant le code que j'ai donné pour ne pas mettre 0: si pas de jour

Date_difference_total  = IIf(x <> 0, Format(x, "##0") & ":", "") & Format(y, "hh:mm")

En decoupant avec Day(a) tu ne prends que le quantième : cela ne permet pas de soustraire des dates sur des mois différents...

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.

Merci à vous pour ces précisions.

Je comprends mieux les raisons de ces affichages.

Je convertis en secondes car, à la soustration, je souhaite retrancher un certain temps (plannings, autres plages horaires correctives...), mais je suis passé à la soustraction simple et je m'en sors bien merci.

Au passage, est-ce possible de "figer" le format ? Quand je clique sur la cellule au format "dd:hh:mm", apparait ensuite 0/1/1900. Est-ce possible d'empêcher cet affichage ?

Merci encore.

Attention ! En utilisant Format en VBA, tu produis une valeur texte.

En l'affectant à une cellule Excel, cela peut rester du texte (le format de cellule sera donc inopérant), mais si ton texte est au format "dd:hh:mm", le texte ainsi formaté peut fort bien être converti par Excel en valeur horaire, dans laquelle tes jours seront interprétés comme des heures.

Cordialement.

Ok, je pense pas avoir compris la subtilité.

Si par VBA je formatte un résultat qui est une date au format suivant : "dd:hh:mm", c'est nickel.

Lorsque je Double clique sur la cellule par la suite, l'affichage est du format suivant : 0/1/1900 12:14:22 AM.

Là je ne peux plus rien faire sur le format (?)

Oui ! Tu as bien un format de cellule actif puisque Excel a convertie la chaîne en heures, seulement ton 12 est devenu 12 heures !

C'est ton premier ":" qu'il faut modifier ou y ajouter autre chose.

Essaie :

    Date_difference_total = Int(b - a) & ":" & Chr(160) & Format(b - a, "hh:mm")

Cela introduit une espace insécable après le premier ":" (NB- l'espace normal risque de ne pas empêcher la conversion par Excel). Et tu auras le texte dans la cellule.

Cordialement.

Pour le coup je n'utilise pas ce code là, mais simplement Range("xxxxxx").NumberFormat = "dd:hh:mm"

Est-ce que cela ci-dessous semble correct ?

search_data_cell.NumberFormat = "dd" & Chr(160) & ":hh:mm"

Le caractère 160 n'ira pas avec NumberFormat, mais si tu veux utiliser NumberFormat, il te faut un nombre date(-heure) dans la cellule, donc tu affectes la différence b-a brute sans utiliser la fonction Format et tu mets ton format de cellule.

Mais comme déjà dit, avec cette méthode, ta différence ne peut dépasser 31, à 32 cela t'affichera 1 (1er février !)

Cordialement.

Okey j'ai bien compris.

Merci pour tous !

Rechercher des sujets similaires à "soustraction dates"