La gestion des dates et des heures est un sujet très important (et intéressant!) que ce soit dans Excel ou dans VBA. Microsoft a mis à notre disposition de nombreuses fonctions. Ce qui manque parfois à l'utilisateur, c'est la compréhension du concept même des dates et des heures dans MS Office. Le tutoriel que je vous propose essaie de vous montrer comment les dates et heures sont gérés dans VBA. Vous trouverez à la fin de ce tuto la liste des fonctions VBA utiles pour travailler avec des dates et des heures (la liste contient également les exemples d'utilisation et des explications).
Dates et Heures dans MS Office (en particulier Excel et VBA)
Les dates et heures que nous pouvons voir dans les classeurs Excel ne sont pas stockés sous la même forme que celle qui s’affiche sur l’écran. En pratique, les dates et les heures sont stockés sous forme de nombres à virgule flottante – par exemple: 1254,02589.
La partie entière est une représentation numérique de la date. Il s’agit du nombre de jours qui se sont écoulés depuis le 31/12/1899. Le numéro 1 correspond donc au 1/1/1900 et le numéro 44.896 représente la date de 01/12/2022. Dans l’autre sens, si vous inscrivez la date 12/4/2023 dans Excel, elle sera stocké non comme une date mais comme le nombre 45.028.
La partie décimale représente la partie d’une journée – c’est-à-dire le temps. Si on augmente le nombre de 1, on l’augmente d’un jour, c’est-à-dire de 24 heures. 12 heures correspondent donc à 0,5. Une heure représente 1/24 de jour, c’est-à-dire 0,041666 d’un jour. Une minute représente 1/1440 du jour (0,000694 du jour) et une seconde est égale à 1/86400 du jour (=0,000011574 du jour).
Donc, une cellule qui contient l’heure 14:00 correspond en fait au nombre 0,58333.
Tout ceci peut sembler assez abstrait mais il existe en VBA (tout comme en Excel) de nombreuses fonctions pour nous faciliter la vie lors d’une manipulation des dates et des heures.
Date correcte en VBA: #25/12/2022#
Si vous omettez ce délimiteur, les “/” ou “-” seront considérés comme des signes mathématiques. Écrire x = 25/12/2022 signifie donc x = 0,001030333
Et si vous utilisez des guillemets (x = “25/12/2022 “), votre date sera considérée comme un texte et vous ne pourrez pas l’utiliser dans les fonctions…
Voici donc, comme promis, la liste des fonctions VBA pour gérer le temps et heures avec des exemples et des explications…
Dates et Heures en VBA – les fonctions les plus utiles
Fonction VBA | Description | Exemple |
---|---|---|
Now | Retourne la date et l'heure actuelle | x = Now résultat: x = 19/12/2022 12:14:47 |
Date | Retourne la date actuelle (= aujourd'hui) | x = Date résultat: x = 19/12/2022 |
Time | Retourne l'heure actuelle | x = Time résultat: x = 14:41:23 |
Timer | Retourne le nombre de secondes depuis minuit | x = Timer résultat: x = 53165,42 |
DateValue(Argument) | Retourne la partie "date" de l'Argument | x = TimeValue(#16/12/2022 14:34:25#) résultat: x = 16/12/2022 |
TimeValue(Argument) | Retourne la partie "heure" de l'(Argument) | x = TimeValue(#16/12/2022 14:34:25#) résultat: x = 14:34:25 |
DateSerial() | Crée une date à partir de 3 arguments: année (Year); mois (Month); jour (Day) ! - attention aux formats des arguments. Il doit s'agir des nombres entiers ( Integer ) | x = DateSerial(2023, 1, 23) résultat: x = 23/1/2023 |
DatePart(intervale, date, premier jour de semaine, première semaine de l'année) | Retourne une partie de la date. Pour les détails des arguments: DatePart | x = DatePart("yyyy", Date) y = DatePart("q", Date) z = DatePart("ww", #12/8/2022#) Résultats: x = 2022 (=l'année d'aujourd'hui) y = 4 (le trimestre d'aujourd'hui) z = 50 (semaine de l'année) |
Year(Argument) | Retourne l'année de l'Argument | x = Year(Date) résultat: x = 2022 (l'année d'aujourd'hui) |
Month(Argument) | Retourne le mois de l'Argument | x = Month(#15/8/2022#) résultat: x = 8 |
Day(Argument) | Retourne le jour de l'Argument | x = Day(#15/8/2022#) résultat: x = 15 |
MonthName(Argument) | Retourne le nom du mois de l'Argument - attention, le résultat dépend de la langue d'Excel | x = MonthName(Month(#15/2/2023#)) ou x = MonthName(2) résultat: x = "février" |
Weekday(date, premier jour de semaine) | Retourne le numéro du jour de la semaine. ! - par défaut, le 1 correspond au dimanche. Pour commencer la semaine lundi, le 2ème argument doit être vbMonday | x = Weekday(#11/11/2022#,vbMonday) résultat: 5 |
WeekdayName(Argument) | Retourne le nom du jour de semaine de l'Argument - attention, le résultat dépend de la langue d'Excel | x = WeekdayName(Weekday(#11/11/2022#,vbMonday)) résultat: x = "vendredi" |
DateDiff | Retourne le nombre d'intervals entre deux dates. - les intervals peuvent être: seconde, minute, heure, semaine, jour de la semaine, jour, jour de l'année, mois, trimestre, année. Plus sur le site de Microsoft | x = DateDiff("q", #15/2/2019#,#28/4/2023#) résultat: 17 (il y a 17 trimestres complets entre 15/2/2019 et 28/4/2023) |
DateAdd | Ajoute ou soustrait des intervals à une date - les intervals peuvent être: seconde, minute, heure, semaine, jour de la semaine, jour, jour de l'année, mois, trimestre, année. Plus sur le site de Microsoft | x = DateAdd("yyyy", 2, #22/5/2022#) y = DateAdd("d", 20, Date) résultats: x = 22/5/2024 (on a ajouté deux ans) y = 8/1/2023 (la date dans 20 jours à partir d'aujourd'hui - 19/12/2022) |
Conclusion – La gestion des dates en VBA est assez facile… Grâce aux fonctions VBA!
Avec ces fonctions ou leur combinaisons, il est possible d'effectuer la plupart des opérations liés à la manipulation des dates et des unités de temps. Dans les cas plus complexes (par exemple certains calculs financiers), la gestion de dates peut rester compliquée mais c'est un autre sujet…
Deux conseils à la fin…
- Lors de l'utilisation des fonctions VBA cités plus haut, il est important de faire attention aux paramètres régionaux et linguistiques de votre ordinateur/Excel (noms des mois, des jours de la semaine,…). N'oubliez pas que VBA fonctionne en anglais, mais certains paramètres viennent de la langue de votre système d'exploitation ou de votre installation d'Office.
- Un autre point d'attention est la bonne utilisation du "premier jour de la semaine". Aux États-Unis, contrairement à l'Europe, la semaine commence le dimanche! Et donc, par défaut, c'est le jour qu'Excel utilise. N'oubliez donc pas d'ajouter l'argument optionnel
firstdayofweek
(avec la valeurvbMonday
) dans les fonctions qui utilisent, de manière optionnelle, cet argument. Si vous l'omettez, vous risquez de vous retrouver avec des résultats incorrects sans même vous en rendre compte.
Pour aller plus loin en VBA et en Excel
Voici quelques autres articles sur Excel et VBA qui pourraient vous être utiles…
- Liste de toutes les fonctions VBA
- VBA: Trouver le nombre de jours dans un mois
- Calcul de la date de Pâques en VBA et en Excel
- Liste de toutes les fonctions Excel
- Calculer l'âge actuel en Excel et calculer ancienneté
- Fonction RECHERCHEX – la nouvelle fonction phare d'Excel
11 commentaires sur “Gestion des dates et de temps en VBA [tutoriel]”
Dans les fonctions DateAdd et DaeDiff, le paramètre d'intervalle (par ex "yyyy") dépend de la langue? Dans un Excel en français, "aaaa" va fonctionner?
Bonjour,
Non, DateDiff et DateAdd sont dess fonctions "purement VBA" où les paramètres disponibles sont fixés et sont en anglais. Vous trouverez la liste des paramètres d'intervalle sur le site de Microsoft (le lien se situe dans le tableau avec les fonctions sur cette page).
Attention, dans une feuille Excel, Annee(0) renvoie 1900 alors qu'en VBa, Year(0) renvoie 1899 …
Bonne remarque!
Voici l'explication:
Le jour 1 en Excel = 1/1/1900
Le jour 1 en VBA = 31/12/1899
Est-ce un problème? Pas vraiment. La différence est annulée le 61ème jour.
Le jour 61 en Excel = 1/3/1900
Le jour 61 en VBA = 1/3/1900
Pour tous les jours qui suivent 1/3/1900, les dates correspondent.
Comment Est-ce possible?
L'année 1900 n'a pas été une année bissextile. Ce qui est le cas dans VBA.
En Excel par contre, le "29/2/1900" existe bel et bien…
Donc en VBA, le jour 59 = 27/2/1900, le jour 60 = 28/2/1900 et le jour 61 = 1/3/1900
En Excel, le jour 59 = 28/2/1900, le jour 60 = 29/2/1900 et le jour 61 = 1/3/1900
Intéressant, non? 😉
Bonjour,
Lors de la saisie d'une date, je souhaiterais écourter la saisie (sous access 2016)
par ex saisir le jour ex: 04 et générer 04/05/2020
par ex: 0405 et générer 04/05/2020
J'ai essayé pas mal de codes vba différents mais sans succès
Peut-etre probleme de format date ou masque de saisie
Merci de bien vouloir me proposer une solution
Bonsoir Rémi,
vous pouvez essayer ces deux functions:
Attention:
– la première doit avoir comme argument un entier (
Integer
) – par exemple 4 (DateDuJour(4)
).– la seconde une chaîne de caractères (
String
) sous format "JJMM" – par exemple "0405"(DateDuJourMois("0405")
)j'espère que cela va vous aider.
Cordialement, Martin
Bonjour Martin,
Je tiens à vous remercier pour votre code . J'ai pu ainsi apporter une réponse particulièrement bien adaptée au problème posé
Tout fonctionne bien et je vous remercie de votre aide.
J'ai du juste enlever option explicit dans mon code(sinon message "DateDuJour = CVErr(xlErrValue) variable non définie)
Bonjour,
Merci pour ce retour. Je suis content que cela ait pu vous aider!
Cordialement, Martin
Bonjour,
Après des heures et des heures de recherche cet article vient de me sauver la vie.
Le seul que j'ai trouvé qui parle de la façon de stocker une date en valeur (1=24h).
Une solution simple trouvé grâce à cet article, merci à vous
Bonjour tout le monde,
aide moi svp je suis nouveau sur le VBA et je veux faire
exemple sur mon fichier
Cellule A1 : je mentionne une (date début)
Cellule A2 : je mentionne un nombre (Nbr Jours)
Cellule A3 : automatique me donne une date (Date reprise)
comment je crée la formule ?!
merci d'avance
C’est assez simple dans A3 tu écris la formule =A1+A2