Les dates et les heures en VBA : Date, Now, DateSerial, DateAdd, Year, Hour, IsDate et CDate
Planning de formation, échéances, durées, horodatage : les dates sont partout dans les macros. VBA les range dans le type Date, qui est en réalité un nombre. La partie entière compte les jours depuis le 30/12/1899, la partie décimale représente l’heure en fraction de journée. Comprendre ce principe suffit à tout calculer : ajouter des jours, mesurer une durée, extraire l’année ou l’heure. Chaque simulateur applique les règles de VBA avec les paramètres régionaux français. Voir aussi les chaînes de caractères et les opérateurs.
Déclarer une variable Date
On déclare une date avec Dim d As Date. La variable peut recevoir une date, une heure ou les deux. Une valeur écrite directement dans le code se place entre dièses : #10/5/2026#. Attention, entre dièses VBA lit toujours le format américain mois/jour/année, quels que soient les paramètres de Windows. Une variable Date non initialisée vaut 0, c’est-à-dire le 30/12/1899 à 00:00:00.
d = Range("B2").Value : une cellule qui contient une vraie date Excel se range directement dans une variable Date, sans conversion.Les fonctions Date() et Now()
Date renvoie la date du jour, à minuit (partie décimale nulle). Now renvoie la date et l’heure, Time l’heure seule. Ces fonctions n’ont pas d’argument : l’éditeur VBA retire d’ailleurs les parenthèses. Elles lisent l’horloge du PC à chaque appel. Timer, qui compte les secondes depuis minuit, sert à mesurer la durée d’une macro.
Range("C2").Value = Now enregistre l’instant d’une saisie ; Date suffit pour une date de facture.t = Timer au début, puis Debug.Print Timer - t à la fin : le temps d’exécution en secondes.If d = Date Then fonctionne, mais If d = Now Then est presque toujours faux : Now contient l’heure à la seconde près.Les fonctions DateSerial() et TimeSerial()
DateSerial(année, mois, jour) construit une date à partir de trois nombres, sans aucune ambiguïté de format : c’est la méthode recommandée dans le code. Les valeurs hors limites sont reportées : le mois 13 donne janvier de l’année suivante, le jour 0 le dernier jour du mois précédent. TimeSerial(heure, minute, seconde) fait de même pour une heure.
DateSerial(Year(d), Month(d) + 1, 0) renvoie le dernier jour du mois de d, qu’il compte 28, 29, 30 ou 31 jours.DateSerial(Year(d), Month(d), 1) : pratique pour un filtre ou un tableau mensuel.Addition et soustraction de dates
Puisqu’une date est un nombre de jours, on calcule avec les opérateurs habituels. d + 30 donne la date 30 jours plus tard, d - 7 une semaine plus tôt. La différence de deux dates d2 - d1 est un nombre de jours, décimal si les heures diffèrent. Pour des heures, ajoutez une fraction de jour : 1 heure = 1/24, ou mieux TimeSerial(1, 0, 0).
Int(d2) - Int(d1) ignore les heures ; sinon 23 h d’écart à cheval sur deux jours donnent 0,96 jour.DateAdd() et DateDiff()
DateAdd(intervalle, nombre, date) ajoute (ou retire, avec un nombre négatif) des années, trimestres, mois, semaines, jours, heures, minutes ou secondes. L’intervalle est un texte : "yyyy", "q", "m", "ww", "d", "h", "n" (minutes), "s". Quand le jour n’existe pas dans le mois d’arrivée, DateAdd s’arrête au dernier jour du mois. DateDiff(intervalle, date1, date2) fait l’inverse : elle compte les intervalles entre deux dates.
"m" désigne les mois, "n" les minutes. C’est l’erreur la plus fréquente avec DateAdd et DateDiff.Extraire une partie d’une date : Year(), Month(), Day(), Weekday()
Year(d), Month(d) et Day(d) renvoient l’année, le mois (1 à 12) et le jour (1 à 31). Weekday(d) renvoie le jour de la semaine sous forme de nombre de 1 à 7. Par défaut, la semaine commence le dimanche : dimanche = 1, lundi = 2. Ajoutez vbMonday en second argument pour que lundi = 1. MonthName et WeekdayName donnent les noms en toutes lettres.
If Weekday(d, vbMonday) > 5 Then : vrai le samedi et le dimanche.Format(d, "dddd d mmmm yyyy") affiche « lundi 5 octobre 2026 » ; le résultat est un texte, pas une date.Extraire une partie d’une heure : Hour(), Minute() et Second()
Hour(t) renvoie l’heure (0 à 23), Minute(t) les minutes et Second(t) les secondes (0 à 59). Elles acceptent une heure seule ou une date complète : Hour(Now) donne l’heure actuelle. Pour convertir une heure en minutes depuis minuit, on combine : Hour(t) * 60 + Minute(t).
IsDate(), DateValue(), TimeValue() et CDate()
Une date saisie dans une InputBox ou importée d’un fichier texte est d’abord un texte. IsDate(texte) indique si VBA sait le convertir. CDate(texte) le convertit en date complète, DateValue n’en garde que la date et TimeValue que l’heure. La conversion suit les paramètres régionaux : en France, « 05/10/2026 » est le 5 octobre. Un texte non reconnu provoque l’erreur 13 : testez IsDate avant de convertir.
Do / s = InputBox("Date de début ?") / Loop Until IsDate(s), puis d = CDate(s).Cells(i, 1).Value = CDate(Cells(i, 1).Value) la transforme en vraie date.Exercice : planifier des sessions de formation
Classeur d’exercice (Énoncé et Corrigé)
- Enregistrez le classeur en .xlsm et collez le code de la feuille « Code VBA » dans un module standard.
- Feuille Sessions : exécutez
Convertir(IsDate, CDate) puisPlanifier(DateAdd, Weekday, DateSerial). - Exécutez
Durees(soustraction, Hour, Minute) etHorodater(Now). - Répondez aux questions de la feuille Contrôle.