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

VBA MkDir en Excel — crea una carpeta, y por qué no puede crear una ruta anidada

|

VBA MkDir en Excel — crea una carpeta, y por qué no puede crear una ruta anidada

TL;DRMkDir crea un nivel de carpeta, no una ruta. MkDir "C:\A\B\C" lanza error 76 si C:\A\B no existe ya, y MkDir sobre una carpeta que ya existe lanza error 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 — MkDir crea un nivel, no una ruta
  • Por qué una ruta anidada lanza error 76, y por qué FileSystemObject.CreateFolder tampoco recursa
  • Por qué MkDir sobre una carpeta existente lanza error 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 bajo CurDir, 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" — crea Reports dentro de C:\. Bien, porque C:\ existe.
  • MkDir "C:\Reports\2026" — crea 2026 dentro de C:\Reports. Funciona solo si C:\Reports ya existe.
  • MkDir "C:\Reports\2026\Q1" — necesita que C:\Reports\2026 exista 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 MkDir ni CreateFolder hacen mkdir -p.
  • No es idempotente → protégelo con If Dir(path, vbDirectory) = "" Then (o FolderExists) o lanza error 75 en 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 de ThisWorkbook.Path para 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