🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA MkDir dans Excel — créer un dossier, et pourquoi il ne peut pas créer un chemin imbriqué

|

VBA MkDir dans Excel — créer un dossier, et pourquoi il ne peut pas créer un chemin imbriqué

TL;DRMkDir crée un seul niveau de dossier, pas un chemin. MkDir "C:\A\B\C" lève error 76 si C:\A\B n'existe pas déjà, et MkDir sur un dossier qui existe déjà lève error 75 — ce n'est pas une opération silencieuse sans effet. « Créer ce dossier » revient en réalité à « créer chaque niveau manquant, et seulement là où il est absent ».

Sub MakeReportsFolder()
    MkDir "C:\Reports"          ' fonctionne seulement si C:\ existe et C:\Reports N'existe PAS
    MkDir "C:\Reports\2026\Q1"  ' error 76 - le parent C:\Reports\2026 n'existe pas encore
End Sub

MkDir ressemble à l'instruction la plus simple de VBA — un mot-clé, un chemin. L'ennui, c'est qu'elle fait bien moins que son nom ne le laisse croire. Elle ne crée pas un chemin ; elle crée un unique répertoire dont le parent doit déjà être là. Et elle ne tolère pas un dossier qui existe déjà — elle s'arrête sur une erreur. Les deux surprises viennent de la même racine : MkDir est une opération à un seul niveau, et toute routine « créer un dossier » robuste se construit autour de cette limite.

Ce que vous allez apprendre

  • Le modèle mental — MkDir crée un seul niveau, pas un chemin
  • Pourquoi un chemin imbriqué lève error 76, et pourquoi FileSystemObject.CreateFolder ne récurse pas davantage
  • Pourquoi MkDir sur un dossier existant lève error 75 — et le test qui le transforme en un « garantir l'existence » sûr
  • La boucle protégée par un test d'existence qui crée un chemin complet, niveau par niveau
  • Pourquoi un simple MkDir "Reports" atterrit sous CurDir, et non dans le dossier de votre classeur
  • Le motif sûr « créer le dossier s'il n'existe pas » pour une macro sans surveillance

Le modèle mental : MkDir crée un seul niveau, pas un chemin

L'idée clé, c'est que MkDir crée une unique entrée de répertoire à l'intérieur d'un dossier qui doit déjà exister. C'est l'exact équivalent de taper md à une invite de commande avec l'ancien comportement non récursif : il ajoute un enfant à un parent, et il s'attend à ce que ce parent soit là.

  • MkDir "C:\Reports" — crée Reports à l'intérieur de C:\. Parfait, car C:\ existe.
  • MkDir "C:\Reports\2026" — crée 2026 à l'intérieur de C:\Reports. Fonctionne seulement si C:\Reports existe déjà.
  • MkDir "C:\Reports\2026\Q1" — exige que C:\Reports\2026 existe d'abord, sinon il échoue.

Dès que vous voyez MkDir comme « ajouter un enfant à un parent existant », ses deux erreurs célèbres cessent de surprendre — ce ne sont que les deux façons de violer cette hypothèse : le parent est absent, ou l'enfant est déjà là.

Erreur 76 : MkDir ne peut pas créer un chemin imbriqué (et CreateFolder non plus)

Pointez MkDir sur un chemin de plus d'un niveau, où un dossier intermédiaire est absent, et il s'arrête :

MkDir "C:\Reports\2026\Q1"    ' error 76 - "Path not found" si C:\Reports\2026 est absent

Le correctif répandu — « il suffit d'utiliser le FileSystemObject » — ne résout pas cela. CreateFolder est lui aussi une opération à un seul niveau ; il lève « Path not found » pour un parent absent exactement comme MkDir :

Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
fso.CreateFolder "C:\Reports\2026\Q1"    ' echoue aussi si C:\Reports\2026 n'existe pas

Aucun des deux intégrés ne crée les dossiers intermédiaires à votre place. Construire un chemin profond est donc intrinsèquement une boucle : découpez le chemin sur le séparateur et créez chaque niveau du haut vers le bas, en sautant ceux qui existent déjà. Il n'existe aucun appel unique en VBA intégré qui fasse un mkdir -p ; c'est vous qui l'écrivez. La boucle tient en quelques lignes (ci-dessous), et une fois que vous l'avez, la création imbriquée est un problème résolu.

Erreur 75 : MkDir sur un dossier existant n'est pas une opération neutre

La seconde surprise, c'est que MkDir échoue quand le dossier existe déjà — il ne réussit pas discrètement :

MkDir "C:\Reports"    ' premiere execution : le cree
MkDir "C:\Reports"    ' seconde execution : error 75 - "Path/File access error"

Voilà pourquoi une macro qui « a marché une fois » plante à sa seconde exécution. MkDir n'est pas idempotent, donc l'appeler sans condition est un bug. Le correctif est de vérifier d'abord, avec la forme de Dir qui reconnaît les dossiers ou avec FolderExists :

If Dir("C:\Reports", vbDirectory) = "" Then MkDir "C:\Reports"   ' creer seulement si absent

L'indicateur vbDirectory fait que Dir reconnaît les dossiers, si bien que Dir(path, vbDirectory) = "" signifie « ce dossier n'existe pas ». Enveloppez MkDir dans ce test et l'instruction devient un garantir-l'existence sûr : elle crée le dossier la première fois et ne fait rien à chaque exécution suivante. L'alternative plus propre est fso.FolderExists(path), qui se lit sans ambiguïté et ne touche jamais au curseur partagé de Dir décrit dans le guide Dir.

Le motif : créer un chemin complet, niveau par niveau

En réunissant les deux limites, voici la routine qui crée de façon fiable un chemin imbriqué — le mkdir -p que VBA ne vous donne pas. Elle parcourt le chemin depuis la racine, en créant chaque niveau manquant :

Sub EnsurePath(ByVal fullPath As String)
    Dim parts() As String, build As String, i As Long
    parts = Split(fullPath, "\")
    build = parts(0)                                ' le lecteur, ex. "C:"
    For i = 1 To UBound(parts)
        build = build & "\" & parts(i)
        If Dir(build, vbDirectory) = "" Then MkDir build   ' creer ce niveau s'il est absent
    Next i
End Sub

Appelez EnsurePath "C:\Reports\2026\Q1" et il crée Reports, puis 2026, puis Q1, en sautant ceux qui existent déjà et sans jamais lever error 75 ni 76. C'est la forme que prend presque tout assistant « créer un dossier » de production, car les deux intégrés l'imposent. La boucle For et le Split font le parcours ; le garde-fou Dir(..., vbDirectory) assure la sûreté.

Pourquoi un simple nom de dossier atterrit au mauvais endroit

MkDir accepte un chemin relatif — un nom sans lecteur ni \ initial — et c'est là que se niche un bug subtil :

MkDir "Reports"    ' ou cela va-t-il ? PAS forcement a cote de votre classeur

Un chemin relatif est résolu par rapport à CurDir, le répertoire de travail courant d'Excel — qui n'est généralement pas le dossier où votre classeur est enregistré, et qui change chaque fois qu'une boîte de dialogue Ouvrir un fichier pointe vers un nouvel endroit. Ainsi MkDir "Reports" peut créer le dossier dans Documents un jour et ailleurs le lendemain. L'habitude fiable est de construire un chemin absolu à partir de ThisWorkbook.Path :

MkDir ThisWorkbook.Path & "\Reports"    ' toujours a cote de ce classeur

C'est tout le sujet du guide CurDir : les chemins relatifs dans MkDir, RmDir, et les ouvertures de fichier se résolvent tous par rapport à un répertoire de travail que vous ne contrôlez pas, alors ancrez plutôt chaque chemin à ThisWorkbook.Path.

Le verdict honnête : un seul niveau, protégé, absolu

MkDir est le bon outil pour créer un dossier — à condition de respecter ce qu'il fait réellement. Quatre règles :

  • Il crée un seul niveau → un chemin imbriqué exige une boucle niveau par niveau ; ni MkDir ni CreateFolder ne fait de mkdir -p.
  • Il n'est pas idempotent → protégez avec If Dir(path, vbDirectory) = "" Then (ou FolderExists), sinon il lève error 75 à la seconde exécution.
  • Un parent absent, c'est error 76 → construisez depuis la racine vers le bas, pas depuis la feuille.
  • Un nom relatif suit CurDir → construisez des chemins absolus à partir de ThisWorkbook.Path pour que le dossier atterrisse toujours là où vous l'attendez.

À l'instant où vous écrivez MkDir deux fois dans un script — une fois pour créer, une fois « au cas où » — remplacez les deux par la boucle protégée. Ce seul assistant élimine error 75, error 76 et le bug du mauvais dossier d'un seul coup.

Comment ExcelMaster aide

Créer un dossier en toute sécurité, c'est se souvenir que MkDir ne crée qu'un seul niveau, qu'il lève une erreur si le parent est absent (76) ou si le dossier existe déjà (75), et qu'un simple nom suit CurDir plutôt que votre classeur — quatre pièges autour d'une instruction qui semble ne devoir que créer un dossier.

ExcelMaster écrit la routine de création de dossier qui ne calera pas. Décrivez la tâche — « enregistre chaque rapport dans un sous-dossier daté », ou « construis l'arborescence de sortie si elle n'est pas là » — et il produit la boucle protégée par un test d'existence, niveau par niveau, ancrée à ThisWorkbook.Path, si bien que le chemin est créé une fois et ne lève jamais error 75 à une réexécution. Vous décrivez le dossier que vous voulez ; il écrit le code qui crée chaque niveau manquant et saute le reste.

Questions fréquentes

Comment créer un dossier en VBA ?

Utilisez l'instruction MkDir avec un chemin complet : MkDir "C:\Reports". Elle crée un niveau de dossier à l'intérieur d'un parent qui doit déjà exister. Protégez-la pour qu'elle n'échoue pas à une réexécution — If Dir("C:\Reports", vbDirectory) = "" Then MkDir "C:\Reports" — car MkDir lève error 75 si le dossier existe déjà au lieu de ne rien faire.

Pourquoi VBA MkDir donne-t-il l'erreur 76 Path not found ?

Parce que MkDir ne crée qu'un seul niveau et que le dossier parent de votre chemin n'existe pas. MkDir "C:\Reports\2026\Q1" échoue avec error 76 si C:\Reports\2026 est absent. MkDir ne crée pas les dossiers intermédiaires, et FileSystemObject.CreateFolder non plus. Pour construire un chemin profond, créez chaque niveau depuis la racine vers le bas dans une boucle, en vérifiant Dir(level, vbDirectory) avant chaque MkDir.

Comment créer un dossier seulement s'il n'existe pas déjà ?

Vérifiez d'abord avec l'indicateur vbDirectory : If Dir("C:\Reports", vbDirectory) = "" Then MkDir "C:\Reports". Dir(path, vbDirectory) renvoie le nom du dossier quand il existe et une chaîne vide sinon, si bien que le MkDir ne s'exécute que lorsque le dossier est absent. L'alternative plus claire est fso.FolderExists(path) du FileSystemObject, qui se lit sans ambiguïté et ne perturbe pas le curseur Dir.

Comment créer des dossiers imbriqués en une seule fois en VBA ?

Il n'existe aucun appel mkdir -p unique en VBA intégré — MkDir et FileSystemObject.CreateFolder créent tous deux un seul niveau. Découpez le chemin sur "\" et créez chaque niveau du haut vers le bas : partez du lecteur, ajoutez un segment à la fois, et faites MkDir sur chaque segment que Dir(build, vbDirectory) signale comme absent. Cette boucle crée Reports, puis 2026, puis Q1, en sautant ceux qui existent déjà.

Où MkDir crée-t-il un dossier quand j'utilise un chemin relatif ?

Un chemin relatif tel que MkDir "Reports" est résolu par rapport à CurDir, le répertoire de travail courant d'Excel — qui n'est généralement pas le dossier de votre classeur et peut changer quand une boîte de dialogue Ouvrir un fichier pointe ailleurs. Pour créer le dossier à côté de votre classeur à chaque fois, construisez un chemin absolu : MkDir ThisWorkbook.Path & "\Reports".

Testé dans

Testé dans : Excel 365 (Windows 11), VBA 7.1 — vérifié le 23/08/2026.

Guides associés : VBA RmDir · VBA CurDir · VBA Check If File Exists · VBA Dir · VBA FileSystemObject