Cdate vba : convertir une date dans ExcelCHANTABILITY
Dans VBA, les dates peuvent rapidement devenir un vrai casse-tête. Une cellule contient parfois une date bien lisible comme 15/03/2025, tandis qu’une autre renvoie du texte, une valeur vide ou un format importé depuis un logiciel étranger. Résultat : les comparaisons échouent, les tris deviennent incohérents et les macros se mettent à faire… des choses très créatives.
La fonction CDate permet de convertir une valeur en date dans Excel VBA. Elle est particulièrement pratique lorsqu’une date est stockée sous forme de texte ou lorsqu’une variable doit être explicitement transformée en type Date.
Dans cet article, vous allez voir comment utiliser CDate, quelles valeurs elle accepte, pourquoi les formats internationaux peuvent poser problème et comment éviter les erreurs les plus fréquentes.
À quoi sert la fonction CDate en VBA ?
La fonction CDate convertit une expression en donnée de type Date. Elle peut transformer une chaîne de caractères, un nombre ou une valeur issue d’une cellule, à condition que VBA puisse l’interpréter comme une date valide.
Sa syntaxe est très simple :
CDate(expression)
L’argument expression correspond à la valeur à convertir. Cette valeur peut être :
- une date écrite directement dans le code ;
- le contenu d’une cellule Excel ;
- une variable contenant du texte ;
- un nombre représentant une date Excel ;
- une valeur renvoyée par une fonction ou une procédure.
Voici un exemple minimal :
Sub ConvertirDate() Dim MaDate As Date MaDate = CDate("15/03/2025") MsgBox MaDateEnd Sub
Dans cet exemple, la chaîne de caractères « 15/03/2025 » est convertie en véritable date VBA, puis affichée dans une boîte de dialogue.
Convertir le contenu d’une cellule en date
Le cas le plus fréquent consiste à récupérer une date présente dans une cellule. Imaginons que la cellule A2 contienne la valeur 15/03/2025.
Sub ConvertirCelluleEnDate() Dim MaDate As Date MaDate = CDate(Range("A2").Value) MsgBox MaDateEnd Sub
Vous pouvez également écrire le résultat dans une autre cellule :
Sub ConvertirEtEcrireDate() Range("B2").Value = CDate(Range("A2").Value) Range("B2").NumberFormat = "dd/mm/yyyy"End Sub
La ligne NumberFormat est importante. Une date est stockée par Excel sous forme de nombre, mais son affichage dépend du format appliqué à la cellule. Sans format explicite, vous pourriez voir apparaître un nombre comme 45731 au lieu de 15/03/2025.
Il faut donc distinguer deux notions :
- la valeur réelle : le nombre interne utilisé par Excel pour représenter la date ;
- le format d’affichage : la manière dont cette date apparaît à l’écran.
Comprendre les dates dans Excel
Excel enregistre généralement les dates sous forme de nombres séquentiels. Par exemple, le nombre 1 représente le 1er janvier 1900 dans le système de dates standard d’Excel. Chaque jour supplémentaire ajoute une unité.
La partie décimale représente l’heure. Ainsi :
- 1 correspond à une date sans heure ;
- 0,5 correspond à midi ;
- 0,25 correspond à 6 heures du matin ;
- 1,75 correspond à une journée et 18 heures.
CDate peut donc convertir un nombre représentant une date :
Sub ConvertirNombreEnDate() Dim MaDate As Date MaDate = CDate(45731) MsgBox Format(MaDate, "dd/mm/yyyy")End Sub
Le résultat dépend du numéro de série utilisé. Dans un fichier réel, il est préférable de laisser Excel gérer cette conversion à partir d’une cellule correctement renseignée plutôt que d’inscrire des numéros de série directement dans le code.
Convertir une date stockée sous forme de texte
Lorsque des données sont importées depuis un fichier CSV, un logiciel de gestion ou une application web, les dates arrivent parfois sous forme de texte. Visuellement, la valeur ressemble à une date, mais Excel la traite comme une simple chaîne de caractères.
Par exemple, la cellule A2 peut contenir le texte suivant :
15/03/2025
Pour le convertir :
Sub ConvertirTexteEnDate() Dim TexteDate As String Dim DateConvertie As Date TexteDate = Range("A2").Value DateConvertie = CDate(TexteDate) Range("B2").Value = DateConvertie Range("B2").NumberFormat = "dd/mm/yyyy"End Sub
Une fois la conversion effectuée, vous pourrez utiliser la valeur dans des calculs ou des comparaisons :
Sub VerifierDate() Dim DateLimite As Date DateLimite = CDate(Range("A2").Value) If DateLimite < Date Then MsgBox "Cette date est dépassée." Else MsgBox "Cette date est encore valide." End IfEnd Sub
La fonction Date renvoie la date actuelle de l’ordinateur. Vous pouvez donc comparer directement deux variables de type Date.
Éviter les erreurs avec IsDate
Le principal piège de CDate est simple : si la valeur ne peut pas être interprétée comme une date, VBA déclenche une erreur d’exécution 13 : Incompatibilité de type.
Ce code provoquera une erreur si A2 contient le texte « En attente » :
Sub ConversionRisquee() Dim MaDate As Date MaDate = CDate(Range("A2").Value)End Sub
Avant d’utiliser CDate, prenez l’habitude de vérifier la valeur avec IsDate :
Sub ConversionSecurisee() Dim Valeur As Variant Valeur = Range("A2").Value If IsDate(Valeur) Then Range("B2").Value = CDate(Valeur) Range("B2").NumberFormat = "dd/mm/yyyy" Else Range("B2").Value = "Date invalide" End IfEnd Sub
Cette méthode permet à votre macro de continuer son exécution au lieu de s’arrêter brutalement au milieu du traitement. C’est particulièrement utile lorsqu’une colonne contient des cellules vides, des mentions textuelles ou des erreurs d’importation.
Gérer les cellules vides
Une cellule vide mérite également une attention particulière. Selon le contexte, VBA peut interpréter une valeur vide comme une date par défaut, ce qui n’est pas toujours souhaitable.
Pour éviter de convertir une cellule vide, testez-la avant d’appeler CDate :
Sub IgnorerCellulesVides() Dim Valeur As Variant Valeur = Range("A2").Value If Trim(Valeur & "") = "" Then Range("B2").ClearContents ElseIf IsDate(Valeur) Then Range("B2").Value = CDate(Valeur) Range("B2").NumberFormat = "dd/mm/yyyy" Else Range("B2").Value = "Valeur non reconnue" End IfEnd Sub
L’expression Trim(Valeur & « ») permet de traiter proprement une cellule vide ou contenant uniquement des espaces. C’est une petite précaution qui évite bien des surprises dans les fichiers importés.
Attention aux formats français et américains
Les dates peuvent être ambiguës. Que signifie la valeur 03/04/2025 ? En France, il s’agit généralement du 3 avril 2025. Aux États-Unis, elle correspond au 4 mars 2025.
Lorsque vous utilisez CDate avec une chaîne de caractères, VBA s’appuie sur les paramètres régionaux du système. Le résultat peut donc varier selon l’ordinateur sur lequel la macro est exécutée.
Sub DateAmbigue() Dim MaDate As Date MaDate = CDate("03/04/2025") MsgBox Format(MaDate, "dd/mm/yyyy")End Sub
Sur un système français, cette date sera généralement interprétée comme le 3 avril. Sur un système configuré en anglais américain, elle pourra être comprise comme le 4 mars.
Pour éviter cette ambiguïté, utilisez de préférence la fonction DateSerial lorsque vous connaissez séparément l’année, le mois et le jour :
Sub CreerDateSansAmbiguite() Dim MaDate As Date MaDate = DateSerial(2025, 4, 3) MsgBox Format(MaDate, "dd/mm/yyyy")End Sub
Avec DateSerial, l’ordre est toujours le même :
- l’année ;
- le mois ;
- le jour.
Le résultat sera donc systématiquement le 3 avril 2025, quel que soit le format régional de l’ordinateur.
Construire une date à partir de texte
Si vos données sont au format AAAAMMJJ, CDate ne pourra pas toujours les interpréter correctement. Dans ce cas, il est préférable de découper la chaîne puis d’utiliser DateSerial.
Sub ConvertirFormatAAAAMMJJ() Dim Texte As String Dim Annee As Integer Dim Mois As Integer Dim Jour As Integer Dim MaDate As Date Texte = Range("A2").Value If Len(Texte) = 8 And IsNumeric(Texte) Then Annee = CInt(Left(Texte, 4)) Mois = CInt(Mid(Texte, 5, 2)) Jour = CInt(Right(Texte, 2)) If IsDate(DateSerial(Annee, Mois, Jour)) Then MaDate = DateSerial(Annee, Mois, Jour) Range("B2").Value = MaDate Range("B2").NumberFormat = "dd/mm/yyyy" Else Range("B2").Value = "Date invalide" End If Else Range("B2").Value = "Format incorrect" End IfEnd Sub
Cette approche est plus longue, mais elle est beaucoup plus fiable pour traiter des données structurées provenant d’un export informatique.
Utiliser CDate avec une heure
CDate ne convertit pas uniquement les dates. Elle peut également traiter une valeur contenant une date et une heure :
Sub ConvertirDateEtHeure() Dim DateHeure As Date DateHeure = CDate("15/03/2025 14:30") Range("A1").Value = DateHeure Range("A1").NumberFormat = "dd/mm/yyyy hh:mm"End Sub
Vous pouvez ensuite extraire séparément la date et l’heure avec les fonctions DateValue et TimeValue :
Sub SeparerDateEtHeure() Dim Valeur As Date Valeur = CDate("15/03/2025 14:30") Range("A1").Value = DateValue(Valeur) Range("B1").Value = TimeValue(Valeur) Range("A1").NumberFormat = "dd/mm/yyyy" Range("B1").NumberFormat = "hh:mm"End Sub
DateValue conserve uniquement la partie date, tandis que TimeValue conserve uniquement l’heure.
Parcourir une colonne avec CDate
Voici un exemple concret pour convertir toutes les dates présentes dans la colonne A et placer le résultat dans la colonne B. La macro vérifie chaque ligne et signale les valeurs qui ne sont pas reconnues.
Sub ConvertirTouteUneColonne() Dim DerniereLigne As Long Dim Ligne As Long Dim Valeur As Variant DerniereLigne = Cells(Rows.Count, "A").End(xlUp).Row For Ligne = 2 To DerniereLigne Valeur = Cells(Ligne, "A").Value If Trim(Valeur & "") = "" Then Cells(Ligne, "B").ClearContents ElseIf IsDate(Valeur) Then Cells(Ligne, "B").Value = CDate(Valeur) Cells(Ligne, "B").NumberFormat = "dd/mm/yyyy" Else Cells(Ligne, "B").Value = "Date invalide" End If Next LigneEnd Sub
La boucle commence à la ligne 2 afin de préserver une éventuelle ligne d’en-têtes. Si votre tableau débute à une autre ligne, adaptez simplement la valeur de départ.
CDate, DateValue ou DateSerial : quelle fonction choisir ?
Ces trois fonctions sont complémentaires, mais elles ne répondent pas exactement au même besoin :
- CDate sert à convertir une valeur existante en type Date ;
- DateValue extrait la partie date d’une valeur pouvant contenir une heure ;
- DateSerial construit une date à partir de l’année, du mois et du jour.
Utilisez donc CDate lorsque la valeur est déjà complète et correctement interprétable :
MaDate = CDate(Range("A2").Value)
Préférez DateSerial lorsque vous voulez éviter les problèmes de format régional :
MaDate = DateSerial(2025, 3, 15)
Et utilisez DateValue pour ignorer l’heure :
MaDate = DateValue(Range("A2").Value)
Les bonnes pratiques à retenir
- Déclarez vos variables de date avec le type Date.
- Vérifiez les valeurs avec IsDate avant d’utiliser CDate.
- Traitez les cellules vides avant toute conversion.
- Appliquez un format d’affichage avec NumberFormat.
- Évitez les chaînes ambiguës comme « 03/04/2025 » dans les macros destinées à plusieurs utilisateurs.
- Utilisez DateSerial lorsque l’année, le mois et le jour sont connus séparément.
- Utilisez des références qualifiées comme Worksheets(« Feuil1 »).Range(« A2 ») dans les projets importants.
En résumé, CDate est une fonction très pratique pour convertir rapidement une valeur en date dans Excel VBA. Elle devient particulièrement efficace lorsqu’elle est associée à IsDate, à un contrôle des cellules vides et à un formatage explicite. Avec ces quelques réflexes, vos macros pourront traiter les dates importées, comparer des échéances et automatiser vos tableaux sans se laisser piéger par un simple changement de format.