Manipuler les dates et les heures
Objectifs du chapitre
Lorsque vous devez rédiger des contrats, des factures, des relances, la gestion des dates est essentielle. La manipulation de dates est toujours un sujet important, tant dans les formules Excel que dans la programmation VBA.
Ce chapitre a pour objectif de vous rappeler les aspects à connaître concernant les dates dans vos feuilles Excel, les principales fonctions liées aux dates.
En fin de chapitre, vous pourrez effectuer quelques exercices pour valider vos nouveaux acquis.
Rappel sur la gestion générale des dates
Lorsque vous travaillez avec Windows, les dates qui sont reconnues vont du 1er janvier 100 au 31 décembre 9999. Le calendrier utilisé pour ces dates correspond au calendrier grégorien.
Sous Excel, les dates sont gérées du 1er janvier 1900 au 31 décembre 9999 et on parle pour ces valeurs de leur numéro de série. La valeur 1 correspond au 1er janvier 1900, la valeur 2 au 2 janvier 1900… la valeur 50000 au 21 novembre 2036, etc.
Lorsque vous utilisez les dates, retenez qu’Excel s’intéresse avant tout à ce numéro de série. Les problématiques liées aux formats (09/07/2021, 2021-07-09, 2021-09-07, etc.) peuvent être élucidées en revenant à ce numéro de série.
La valeur entière correspond à la date, et la partie décimale correspond aux heures.
Gestion des dates sous VBA Excel
Ne pas confondre valeur et format
Un point important, avant d’aller plus avant dans ce chapitre, est la distinction entre ce que vous voyez dans une cellule et la valeur correspondante (numéro de série). Beaucoup de personnes font l’erreur de se concentrer uniquement sur le format ou le texte affiché dans une cellule plutôt que de privilégier la « vraie » date disponible dans la cellule.
Il est certain que pour les personnes qui n’évoluent que dans leur entreprise, localement, sans avoir de fichier envoyé ni à envoyer à l’international, cette notion peut paraître inutile, mais lorsque vous recevez des fichiers avec une date 05/06/23, il est important pour vous d’être certain qu’il s’agisse du 5 juin 2023, du 6 mai 2023 ou encore du 23 juin 2005 ! Chaque utilisateur ayant ses propres paramètres régionaux, vous n’avez que peu de certitude en lisant simplement un format d’affichage. La valeur qui est réellement contenue dans la cellule sera affichée si vous cliquez sur le bouton Afficher les formules de l’onglet Formules. Et si vous obtenez 45082, alors vous saurez qu’il s’agit du 5 juin 2023 !
Privilégier une année sur quatre chiffres
Lorsque vous travaillez avec les dates, vous disposez en principe des trois valeurs...
Le type Date
Comme vous l’avez vu dans le chapitre Les variables, les constantes, le type de variable permettant de manipuler des dates et heure est le type Date. La déclaration d’une variable de ce type est la suivante.
Dim dt As Date
Exemple 1 : déclaration d’une variable de type Date
La syntaxe des dates en VBA se fait avec le caractère #, comme dans les exemples suivants :
Dim dtSeule As Date, dtHeureUniquement As Date, dtComplete As Date
dtSeule = #7/19/2023#
dtHeureUniquement = #9:30:00 AM#
dtComplete = #10/15/2022 7:30:00 PM#
Exemple 2 : assignations de valeurs de type Date
Les fonctions Date et Now
Parmi les premières fonctions VBA liées aux dates qu’il vous faut connaître, Date() et Now() sont les plus utilisées.
Fonction date du jour Date()
Lorsque vous avez besoin de travailler avec la date du jour, la fonction Date() de VBA vous donne cette valeur. Cette fonction ne prend aucun paramètre et peut être utilisée avec ou sans les parenthèses.
Dim dtDateDuJour As Date
dtDateDuJour = Date 'si aujourd'hui nous somme le 25 juillet 2023, alors
la variable dt prendra cette valeur #2023/07/25#.
Exemple 3 : utilisation de la fonction Date()
La date correspond à la date système. Elle peut être utilisée de plusieurs façons comme nous allons le voir dans les paragraphes suivants.
Fonction date et heure du système : Now()
Lorsque vous travaillez en utilisant par exemple plusieurs fois dans la même journée un traitement spécifique, il vous faut, en plus de la date du jour, l’heure exacte du système. La fonction Now() remplit cette tâche. Elle ne prend aucun paramètre et renvoie la date du jour, complétée de l’heure du système.
Dim dtHeureSysteme As Date
dtHeureSysteme = Now
Exemple 4 : utilisation de la fonction Now()
Il sera par la suite possible de travailler sur les différentes parties de ces dates et heures renvoyées...
Créer une date ou une heure : les fonctions DateSerial() et TimeSerial()
Si vous avez un doute sur la syntaxe complète des dates, et pour éviter d’intervertir malencontreusement les mois et les jours, vous pouvez utiliser certaines fonctions que retournent une date selon les paramètres fournis.
Affecter une date précise : DateSerial()
La fonction qui permet de retourner une date précise est DateSerial(). Cette fonction prend en paramètre trois valeurs : l’année, le mois et le jour, et sa syntaxe générale est la suivante :
DateSerial(Annee As Integer, Mois As Integer, Jour As Integer)
Exemple 5 : syntaxe générale de la fonction DateSerial()
Ainsi, il vous suffit de fournir les informations pour affecter ensuite la valeur de type Date à votre variable.
Dim dt1erAvril2023 As Date
dt1erAvril2023 = DateSerial(2023,4,1)
Exemple 6 : utilisation de la fonction DateSerial()
Cette fonction a également comme particularité de toujours retourner une date valide, pour peu que la date correspondante tombe dans l’intervalle reconnu par VBA.
Debug.Print DateSerial(2023, 2, 29) ' retournera le 1er mars 2023
Debug.Print DateSerial(2024, -5, 10) ' retournera le 10 octobre 2023
Debug.Print DateSerial(2023, 0, 25) 'retournera le 25 décembre 2022
Debug.Print DateSerial(2023, 0, 50) 'retournera le 19 janvier...
Addition et soustraction de dates
Lorsque vous souhaitez calculer une date dans le passé ou dans le futur, deux méthodes sont à votre disposition. Si vous travaillez uniquement sur des jours ou des heures à additionner ou soustraire, vous utiliserez aisément l’addition numérique. Si vous avez besoin de calculer selon les bases calendaires : un mois, un trimestre, une année… la fonction DateAdd() aura toute sa place dans votre panoplie de fonctions VBA à connaître.
Par addition numérique
Comme vous le savez à présent, le mode de fonction des dates se fait par valeur entière pour les jours. Aussi pour ajouter un jour à une date, pour connaître la date du lendemain, il suffit d’effectuer une addition avec le symbole d’addition +, comme dans l’exemple suivant.
Dim dt As Date
dt = Date + 1
'la variable contient à présent la date de demain
Exemple 10 : addition d’une valeur numérique à une date
De la même façon, si vous souhaitez savoir la date et l’heure 8 heures plus tôt qu’une date, cela s’effectuera avec le symbole de soustraction -, comme dans l’exemple suivant.
Dim dt As Date
dt = #3/5/2023 9:35:00 PM# - (8 / 24) 'rappel, une heure = 1/24 de jour,
une minute = 1/(24*60) et une seconde = 1/(24*60*60)
' la variable dt contiendra alors la valeur #2023-03-05 1:35PM#
Exemple 11 :...
Parties d’une date ou d’une heure
Lorsque vous programmez en manipulant des dates, il peut également être nécessaire de connaître les parties d’une date, comme l’année, le mois, le jour du mois, voire le jour de la semaine, l’inverse de ce que permettent les fonctions DateSerial() et TimeSerial(). Voici quelques fonctions qui vous seront très utiles pour obtenir pareille information.
Année, mois ou jour d’une date : Year(), Month(), Day()
Lorsqu’il s’agit de connaître une partie d’une date, les trois fonctions les plus simples sont Year(), Month() et Day() qui prennent chacune en paramètre une date et retournent sous forme de valeur numérique entière respectivement l’année, le mois et le jour du mois. Leur syntaxe générale est la suivante :
Dim iAnnee As Integer, iMois As Integer, iJour As Integer
Dim dt As Date
'affecter à dt une date
iAnnee = Year(dt)
iMois = Month(dt)
iJour = Day(dt)
Exemple 14 : utilisation des fonctions Year(), Month() et Day() sur une date
Ainsi, avec la date du 26 juillet 2023, les variables se verront affecter les valeurs suivantes :
Dim iAnnee As Integer, iMois As Integer, iJour As Integer
Dim dt As Date
dt = #7/26/2023#
iAnnee = Year(dt) '2023
iMois = Month(dt) '7
iJour = Day(dt) '26
Exemple 15 : valeurs retournées par les fonctions Year(), Month() et Day()
Les valeurs retournées par la fonction Month() vont de 1 à 12 et celles par la fonction Day() de 1 à 31.
Jour de la semaine d’une date : WeekDay()
Lorsqu’il vous importe de savoir si une date tombe un lundi, un mercredi ou durant un week-end, VBA met à votre disposition la fonction WeekDay(). Cette fonction a pour syntaxe générale la suivante :
WeekDay(date, [PremierJourDeLaSemaine])
Exemple 16 : syntaxe générale de la fonction WeekDay()
Le premier paramètre de cette fonction est la date sur laquelle vous cherchez à travailler, et le second paramètre le premier jour de la semaine. En effet, si votre semaine commence le lundi, le mardi sera le jour 2, alors que si elle commence le dimanche, le mardi sera le jour 3.
Les valeurs possibles de ce second paramètre sont les suivantes :
Constante VBA |
Valeur numérique |
Description |
vbUseSystem |
0 |
Utilise le paramètre API NLS. |
vbSunday |
1 |
Dimanche (par défaut)) |
vbMonday |
2 |
Lundi |
vbTuesday |
3 |
Mardi |
vbWednesday |
4 |
Mercredi |
vbThursday |
5 |
Jeudi |
vbFriday |
6 |
Vendredi |
vbSaturday |
7 |
Samedi |
La fonction retourne une valeur comprise entre 1 et 7, selon le tableau suivant :
Constante VBA |
Valeur numérique |
Description |
vbSunday |
1 |
Dimanche |
vbMonday |
2 |
Lundi |
vbTuesday |
3 |
Mardi |
vbWednesday |
4 |
Mercredi |
vbThursday |
5 |
Jeudi |
vbFriday |
6 |
Vendredi |
vbSaturday |
7 |
Samedi |
Voici des exemples sur quelques dates :
Debug.Print Weekday(#11/11/1918#) 'retourne 2 - Lundi, vbMonday
Debug.Print Weekday(#1/1/2000#) 'retourne 7 - Samedi, vbSaturday
Debug.Print Weekday(#8/15/1969#) 'retourne 6 - Vendredi, vbFriday
Debug.Print Weekday(#7/20/1969#) 'retourne 1 - Dimanche, vbSunday
Exemple 17 : usage de la fonction...
Formater l’affichage de la date sous forme de texte : FormatDateTime() et Format()
Dans bien des cas, il vous sera utile d’afficher selon un certain format vos dates, pour nommer des fichiers par exemple. Les fonctions FormatDateTime() et Format() vous permettent d’obtenir sous forme de chaîne de caractères le résultat attendu.
Fonction spécifique : FormatDateTime()
La première fonction dédiée pour le formatage des dates est FormatDateTime(). La syntaxe générale de cette fonction est la suivante :
FormatDateTime(valeur, [FormatNomme As vbDateTimeFormat])
Exemple 23 : syntaxe générale de la fonction FormatDateTime()
La fonction retourne une chaîne de caractères, comme dans l’exemple suivant :
Debug.Print FormatDateTime(#2023/07/29 10:35:14#, vbShortDate) 'affiche 2023/07/29
Exemple 24 : usage de la fonction FormatDateTime()
Parmi les formats disponibles pour les dates, vous pouvez utiliser les constantes VBA suivantes :
Constante |
Description |
Exemple avec la date 19/01/2010 20:34:05 (format québécois) |
vbGeneralDate |
Affiche une date et/ou une heure. Pour les nombres réels, affiche une date et une heure. En l’absence de partie décimale, affiche seulement une date. S’il n’y a pas de partie entière, affiche seulement l’heure. Le mode d’affichage de la date et de l’heure... |
Transformer une valeur en date ou heure : IsDate(), DateValue(), TimeValue() et CDate()
Parmi les derniers points qui pourraient vous servir pour manipuler les dates et heures, ces fonctions permettent de transformer les types de données comme des chaînes de caractères ou des valeurs numériques en type de donnée Date.
Ce texte est-il une date valide : IsDate()
Avant de vouloir transformer une chaîne de caractères en type Date, il est pertinent de s’assurer en amont que la chaîne correspond bien à une date valide. La fonction IsDate()est faite pour cela. La syntaxe générale de cette fonction est la suivante :
Function IsDate(ValeurATester) As Boolean
Exemple 27 : syntaxe générale de la fonction IsDate()
Cette fonction retourne un booléen. Si la ValeurATester peut être interprétée comme une date, une heure ou une date et heure valides, alors la fonction retourne True.
Quelques exemples de valeurs qui peuvent être testées avec IsDate() :
Debug.Print IsDate("23-jan") 'Vrai
Debug.Print IsDate("29-fev") 'Faux
Debug.Print IsDate("15:10:45") 'Vrai
Debug.Print IsDate("35:10:00") 'Faux
Exemple 28 : exemples de retours de la fonction IsDate()
Récupérer la date, l’heure ou l’ensemble d’une chaîne : DateValue()...
Exercices
Afficher la date et l’heure système
Heure du système
Créez une macro AfficherDateHeureMaintenant.
Cette macro affichera à l’utilisateur la date et l’heure du système.
Exécutez la macro AfficherDateHeureMaintenant (maintenant).
Date du jour
Créez une macro AfficherDateDuJour.
Cette macro affichera à l’utilisateur la date du jour.
Exécutez la macro AfficherDateDuJour (aujourd’hui).
Créer une date et une heure
Utilisation de DateSerial
Écrivez une fonction PremierDeLAn, de portée publique, qui retourne une date.
Cette fonction prend en paramètre une valeur numérique entière iAnnee.
Cette fonction doit retourner le 1er janvier de l’année iAnnee fournie en paramètre.
Créez une macro AfficherPremierDeLAn.
Cette macro affichera le retour de la fonction PremierDeLAn, à laquelle elle passe l’année 2023.
Exécutez la macro AfficherPremierDeLAn (1er janvier 2023).
Utilisation de TimeSerial
Créez une fonction MoinsLeQuart, de portée publique, qui retourne une date.
Cette fonction prend en paramètre une valeur numérique entière, comprise entre 0 et 23, nommée iHeure.
Cette fonction doit retourner l’heure fournie en paramètre, moins 15 minutes.
Créez une macro AfficherMoinsLeQuart.
Cette macro affichera le retour de la fonction MoinsLeQuart à trois reprises, en lui fournissant successivement les valeurs 10, 13 et 0.
Exécutez la macro AfficherMoinsLeQuart (09:45:00, 12:45:00 et 23:45:00).
Additions et soustractions
À l’année prochaine
Écrivez une fonction LAnneeProchaine, de portée publique, retournant une date.
Cette fonction prend en paramètre une date nommée DateDepart.
Cette fonction retourne la date se situant 1 an dans le futur...