TL;DR —
MkDircrea un nivel de carpeta, no una ruta.MkDir "C:\A\B\C"lanzaerror 76siC:\A\Bno existe ya, yMkDirsobre una carpeta que ya existe lanzaerror 75— no es una operación nula silenciosa. «Crear esta carpeta» es en realidad «crear cada nivel que falta, y solo donde no está».
Sub MakeReportsFolder()
MkDir "C:\Reports" ' funciona solo si C:\ existe y C:\Reports NO
MkDir "C:\Reports\2026\Q1" ' error 76 - el padre C:\Reports\2026 aun no existe
End Sub
MkDir parece la instrucción más simple de VBA — una palabra clave, una ruta. El problema es que hace
mucho menos de lo que su nombre sugiere. No crea una ruta; crea un único directorio cuyo padre ya
tiene que estar ahí. Y no tolera una carpeta que ya existe — se detiene con un error. Ambas sorpresas
vienen de la misma raíz: MkDir es una operación de un solo nivel, y toda rutina robusta de «crear
carpeta» se construye en torno a ese límite.
Lo que aprenderás
- El modelo mental —
MkDircrea un nivel, no una ruta - Por qué una ruta anidada lanza
error 76, y por quéFileSystemObject.CreateFoldertampoco recursa - Por qué
MkDirsobre una carpeta existente lanzaerror 75— y la comprobación que lo convierte en un seguro «asegurar que existe» - El bucle protegido por comprobación de existencia que crea una ruta completa, nivel a nivel
- Por qué un
MkDir "Reports"desnudo aterriza bajoCurDir, no en la carpeta de tu libro - El patrón seguro de «crear carpeta si no existe» para una macro desatendida
El modelo mental: MkDir crea un nivel, no una ruta
La idea clave es que MkDir crea una única entrada de directorio dentro de una carpeta que ya debe
existir. Es el equivalente exacto de teclear md en una línea de comandos con el comportamiento
antiguo, no recursivo: añade un hijo a un padre, y espera que ese padre esté ahí.
MkDir "C:\Reports"— creaReportsdentro deC:\. Bien, porqueC:\existe.MkDir "C:\Reports\2026"— crea2026dentro deC:\Reports. Funciona solo siC:\Reportsya existe.MkDir "C:\Reports\2026\Q1"— necesita queC:\Reports\2026exista primero, o falla.
En cuanto ves MkDir como «añadir un hijo a un padre existente», sus dos errores famosos dejan de
sorprender — son solo las dos maneras en que esa suposición puede violarse: falta el padre, o el hijo ya
está ahí.
Error 76: MkDir no puede crear una ruta anidada (y CreateFolder tampoco)
Apunta MkDir a una ruta de más de un nivel de profundidad, donde falta una carpeta intermedia, y se
detiene:
MkDir "C:\Reports\2026\Q1" ' error 76 - "Path not found" si falta C:\Reports\2026
El arreglo más extendido — «usa simplemente el FileSystemObject» — no resuelve esto. CreateFolder
es también una operación de un solo nivel; lanza «Path not found» ante un padre que falta exactamente
igual que MkDir:
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
fso.CreateFolder "C:\Reports\2026\Q1" ' tambien falla si C:\Reports\2026 no existe
Ninguno de los dos built-ins crea las carpetas intermedias por ti. Así que construir una ruta
profunda es intrínsecamente un bucle: trocea la ruta por el separador y crea cada nivel de arriba
abajo, saltándote los que ya existen. No hay una sola llamada en el VBA built-in que haga un mkdir -p;
la escribes tú. El bucle son unas pocas líneas (abajo), y una vez que lo tienes, la creación anidada es un
problema resuelto.
Error 75: MkDir sobre una carpeta existente no es una operación nula
La segunda sorpresa es que MkDir falla cuando la carpeta ya existe — no tiene éxito en silencio:
MkDir "C:\Reports" ' primera ejecucion: la crea
MkDir "C:\Reports" ' segunda ejecucion: error 75 - "Path/File access error"
Por eso una macro que «funcionó una vez» se cae en su segunda ejecución. MkDir no es idempotente, así
que llamarlo sin condiciones es un bug. El arreglo es comprobar primero, con la forma consciente de
carpetas de Dir o con FolderExists:
If Dir("C:\Reports", vbDirectory) = "" Then MkDir "C:\Reports" ' crea solo si no existe
El flag vbDirectory hace que Dir coincida con carpetas, así que
Dir(path, vbDirectory) = "" significa «esta carpeta no existe». Envuelve MkDir en ese test y la
instrucción se convierte en un asegurar-que-existe seguro: crea la carpeta la primera vez y no hace
nada en cada ejecución posterior. La alternativa más limpia es fso.FolderExists(path), que se lee sin
ambigüedad y nunca toca el cursor compartido de Dir descrito en la guía de Dir.
El patrón: crea una ruta completa, nivel a nivel
Juntando los dos límites, aquí está la rutina que crea de forma fiable una ruta anidada — el mkdir -p
que VBA no te da. Recorre la ruta desde la raíz, creando cada nivel que falta:
Sub EnsurePath(ByVal fullPath As String)
Dim parts() As String, build As String, i As Long
parts = Split(fullPath, "\")
build = parts(0) ' la unidad, p.ej. "C:"
For i = 1 To UBound(parts)
build = build & "\" & parts(i)
If Dir(build, vbDirectory) = "" Then MkDir build ' crea este nivel si no existe
Next i
End Sub
Llama a EnsurePath "C:\Reports\2026\Q1" y crea Reports, luego 2026, luego Q1, saltándose
cualquiera que ya exista y sin lanzar nunca error 75 ni 76. Esta es la forma que toma casi todo
ayudante de «crear carpeta» de producción, porque ambos built-ins la fuerzan. El bucle
For y el Split hacen el recorrido; la
protección Dir(..., vbDirectory) hace la seguridad.
Por qué un nombre de carpeta desnudo aterriza en el lugar equivocado
MkDir acepta una ruta relativa — un nombre sin unidad ni \ inicial — y ahí es donde vive un bug
sutil:
MkDir "Reports" ' adonde va esto? NO necesariamente junto a tu libro
Una ruta relativa se resuelve contra CurDir, el directorio de trabajo actual de Excel — que
normalmente no es la carpeta donde está guardado tu libro, y que cambia cada vez que un diálogo de Abrir
archivo apunta a un sitio nuevo. Así que MkDir "Reports" puede crear la carpeta en Documentos un día y
en otro sitio al siguiente. El hábito fiable es construir una ruta absoluta a partir de
ThisWorkbook.Path:
MkDir ThisWorkbook.Path & "\Reports" ' siempre junto a este libro
Ese es todo el tema de la guía de CurDir: las rutas relativas en MkDir,
RmDir y las aperturas de archivos se resuelven todas contra un directorio de
trabajo que no controlas, así que ancla cada ruta a ThisWorkbook.Path en su lugar.
El veredicto honesto: un nivel, protegido, absoluto
MkDir es la herramienta correcta para crear una carpeta — siempre que respetes lo que de verdad hace.
Cuatro reglas:
- Crea un nivel → una ruta anidada necesita un bucle nivel a nivel; ni
MkDirniCreateFolderhacenmkdir -p. - No es idempotente → protégelo con
If Dir(path, vbDirectory) = "" Then(oFolderExists) o lanzaerror 75en la segunda ejecución. - Un padre que falta es
error 76→ construye de la raíz hacia abajo, no desde la hoja. - Un nombre relativo sigue a
CurDir→ construye rutas absolutas a partir deThisWorkbook.Pathpara que la carpeta aterrice siempre donde esperas.
En el momento en que escribes MkDir dos veces en un script — una para crear, otra «por si acaso» —
reemplaza ambas por el bucle protegido. Ese único ayudante elimina error 75, error 76 y el bug de la
carpeta equivocada de una sola vez.
Cómo ayuda ExcelMaster
Crear una carpeta de forma segura significa acordarse de que MkDir crea solo un nivel, de que da
error si el padre falta (76) o la carpeta ya existe (75), y de que un nombre desnudo sigue a
CurDir en lugar de a tu libro — cuatro trampas alrededor de una instrucción que parece que debería solo
crear una carpeta.
ExcelMaster escribe la rutina de
crear-carpeta que no se atascará. Describe el trabajo — «guarda cada informe en una subcarpeta con fecha»
o «construye el árbol de salida si no está» — y produce el bucle protegido por comprobación de existencia,
nivel a nivel, anclado a ThisWorkbook.Path, de forma que la ruta se crea una vez
y nunca lanza error 75 en una nueva ejecución. Tú describes la carpeta que quieres; él escribe el código
que crea cada nivel que falta y se salta el resto.
Preguntas frecuentes
¿Cómo creo una carpeta en VBA?
Usa la instrucción MkDir con una ruta completa: MkDir "C:\Reports". Crea un nivel de carpeta dentro de
un padre que ya debe existir. Protégelo para que no falle en una nueva ejecución —
If Dir("C:\Reports", vbDirectory) = "" Then MkDir "C:\Reports" — porque MkDir lanza error 75 si la
carpeta ya existe en lugar de no hacer nada.
¿Por qué VBA MkDir da error 76 Path not found?
Porque MkDir crea solo un nivel y la carpeta padre de tu ruta no existe.
MkDir "C:\Reports\2026\Q1" falla con error 76 si falta C:\Reports\2026. MkDir no crea las carpetas
intermedias, y FileSystemObject.CreateFolder tampoco. Para construir una ruta profunda, crea cada nivel
de la raíz hacia abajo en un bucle, comprobando Dir(level, vbDirectory) antes de cada MkDir.
¿Cómo creo una carpeta solo si no existe ya?
Comprueba primero con el flag vbDirectory:
If Dir("C:\Reports", vbDirectory) = "" Then MkDir "C:\Reports". Dir(path, vbDirectory) devuelve el
nombre de la carpeta cuando existe y una cadena vacía cuando no, así que el MkDir corre solo cuando la
carpeta está ausente. La alternativa más clara es fso.FolderExists(path) del FileSystemObject, que se
lee sin ambigüedad y no perturba el cursor de Dir.
¿Cómo creo carpetas anidadas de una vez en VBA?
No hay una sola llamada mkdir -p en el VBA built-in — tanto MkDir como FileSystemObject.CreateFolder
crean un solo nivel. Trocea la ruta por "\" y crea cada nivel de arriba abajo: empieza por la unidad,
añade un segmento cada vez, y haz MkDir de cada segmento que Dir(build, vbDirectory) informe como
ausente. Ese bucle crea Reports, luego 2026, luego Q1, saltándose cualquiera que ya exista.
¿Dónde crea MkDir una carpeta cuando uso una ruta relativa?
Una ruta relativa como MkDir "Reports" se resuelve contra CurDir, el directorio de trabajo actual de
Excel — que normalmente no es la carpeta de tu libro y puede cambiar cuando un diálogo de Abrir
archivo apunta a otro sitio. Para crear la carpeta junto a tu libro cada vez, construye una ruta absoluta:
MkDir ThisWorkbook.Path & "\Reports".
Probado en
Probado en: Excel 365 (Windows 11), VBA 7.1 — última verificación el 23/08/2026.
Guías relacionadas: VBA RmDir · VBA CurDir · VBA Check If File Exists · VBA Dir · VBA FileSystemObject
