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.