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

VBA CurDir & ChDir in Excel — por qué una ruta relativa aterriza en la carpeta equivocada

|

VBA CurDir & ChDir in Excel — por qué una ruta relativa aterriza en la carpeta equivocada

TL;DR — Una ruta relativa (un nombre sin unidad, como "Reports") se resuelve contra CurDir, el directorio de trabajo actual de Excel — que no es la carpeta de tu libro y cambia cada vez que un diálogo de Abrir archivo apunta a un sitio nuevo. Así que MkDir "Reports" u Open "data.csv" pueden aterrizar en un lugar distinto en cada ejecución. Ancla cada ruta a ThisWorkbook.Path.

Sub WhereDoesThisGo()
    MkDir "Reports"                              ' creada bajo CurDir - a menudo NO junto al libro
    MkDir ThisWorkbook.Path & "\Reports"         ' creada junto a ESTE libro, siempre
End Sub

Este es el bug detrás de toda una familia de informes confusos: «mi macro creó la carpeta en el sitio equivocado», «guardó el archivo en Documentos», «funcionaba ayer y hoy no». Ninguno de ellos es aleatorio. Todos se remontan a un hecho que la gente nunca piensa en cuestionar — que una ruta relativa en VBA se resuelve contra un directorio de trabajo que Excel gestiona por ti, y ese directorio no está donde supones. Entiende CurDir, y cada uno de esos bugs se vuelve evitable con un solo hábito.

Lo que aprenderás

  • El modelo mental — una ruta relativa no significa nada hasta que se resuelve contra CurDir
  • Por qué CurDir no es ThisWorkbook.Path, y adónde apunta en realidad
  • Cómo un diálogo de Abrir archivo cambia CurDir en silencio a mitad de macro
  • Por qué ChDir no puede cambiar la unidad, y por qué ChDrive es una instrucción aparte
  • Por qué ThisWorkbook.Path está vacío para un libro que nunca se ha guardado
  • El único hábito que elimina toda la clase de bugs de carpeta equivocada

El modelo mental: una ruta relativa se resuelve contra CurDir

La idea clave es que VBA tiene dos tipos de ruta, y se comportan de forma completamente distinta:

  • Absoluta — empieza con una unidad o raíz: "C:\Reports\March.xlsx". Significa exactamente un lugar.
  • Relativa — sin unidad, sin \ inicial: "Reports" o "data\in.csv". Significa «relativa al directorio actual», y VBA rellena el resto a partir de CurDir.

CurDir es una función que devuelve ese directorio de trabajo — CurDir para la unidad actual, o CurDir("D") para una específica. Toda instrucción que toma una ruta — MkDir, RmDir, Open, Kill, Name, Dir — resuelve una ruta relativa contra CurDir. Así que la pregunta «¿adónde fue mi carpeta?» es en realidad «¿cuál era CurDir en el momento en que corrió la instrucción?» — y esa es una pregunta mucho menos obvia de lo que suena.

CurDir no es ThisWorkbook.Path

Aquí está el malentendido en la raíz de todo esto: la gente supone que el «directorio actual» es la carpeta donde vive el libro. No lo es. Son dos valores sin relación:

Debug.Print CurDir              ' el directorio de trabajo de Excel - a menudo C:\Users\You\Documents
Debug.Print ThisWorkbook.Path   ' donde esta guardado ESTE libro - p.ej. D:\Projects\2026

CurDir empieza como lo que sea que Windows le entregó a Excel al arrancar (con frecuencia tu carpeta de Documentos) y no tiene ninguna conexión con el sitio desde el que abriste tu libro. Así que MkDir "Reports" no crea una carpeta junto a tu archivo — crea una bajo CurDir, que podría estar en cualquier parte. ThisWorkbook.Path, en cambio, siempre apunta a la carpeta que contiene el libro que ejecuta el código. Siempre que quieras decir «junto a mi libro», esa es la propiedad que quieres — nunca CurDir.

Un diálogo de Abrir archivo cambia CurDir en silencio

La razón por la que los bugs de carpeta equivocada son intermitentes — bien ayer, roto hoy — es que CurDir no se está quieto. Windows lo actualiza cada vez que el usuario (o tu propio código) navega por una carpeta en un diálogo de archivo:

Dim f As Variant
f = Application.GetOpenFilename          ' el usuario navega a D:\Client\Inbox y elige un archivo
' CurDir ahora es D:\Client\Inbox - se movio, de forma invisible
MkDir "Reports"                          ' crea D:\Client\Inbox\Reports, no donde querias

Nada en tu código dijo «cambia de directorio», y sin embargo CurDir se movió porque el diálogo lo fijó. Cualquier ruta relativa a partir de ese punto se resuelve contra la nueva ubicación. Por eso la misma macro escribe en una carpeta distinta según lo que el usuario haya clicado cinco minutos antes — una dependencia genuinamente invisible, y un ticket de soporte sin respuesta a menos que sepas que CurDir es la parte que se mueve.

ChDir cambia la carpeta — pero no la unidad

Si quieres fijar el directorio de trabajo deliberadamente, ChDir es la instrucción — pero tiene una trampa que pilla a casi todo el mundo: ChDir cambia la carpeta actual, no la unidad actual.

ChDir "D:\Data"     ' fija la carpeta por defecto de D: a \Data - pero SIGUES en la unidad C:
CurDir              ' sigue devolviendo C:\... - la unidad nunca cambio

Para moverte de verdad a otra unidad necesitas ChDrive primero, y es una instrucción aparte:

ChDrive "D"         ' cambia la unidad actual a D:
ChDir "D:\Data"     ' ahora fija la carpeta en D:

Esta división — una instrucción para la unidad, otra para la carpeta — es un resto de DOS, donde cada unidad recordaba su propio directorio actual. Es exactamente el tipo de sorpresa que hace frágil eso de «solo fija el directorio de trabajo». Lo cual apunta al arreglo de verdad: no gestiones ningún directorio de trabajo en absoluto.

El hábito que elimina toda la clase de bugs

Cada bug de carpeta equivocada de arriba desaparece si nunca usas una ruta relativa. Construye una ruta absoluta a partir de ThisWorkbook.Path y entrega esa a cada instrucción de archivo:

Dim base As String
base = ThisWorkbook.Path & Application.PathSeparator     ' p.ej. "D:\Projects\2026\"
MkDir base & "Reports"                                    ' siempre junto al libro
Open base & "data.csv" For Output As #1                   ' el mismo anclaje, sin dependencia de CurDir

Dos detalles hacen esto robusto. Usa Application.PathSeparator en lugar de un "\" fijo en el código para que este no dé por supuesto un separador, y cuida el separador final para que nunca produzcas ...2026Reports por accidente. Con cada ruta anclada a ThisWorkbook.Path, CurDir se vuelve irrelevante — puede vagar adondequiera que los diálogos lo empujen y tus carpetas seguirán aterrizando exactamente donde querías.

Un caso límite a proteger: ThisWorkbook.Path es una cadena vacía para un libro que nunca se ha guardado. Si una macro puede ejecutarse antes de su primer guardado, comprueba If ThisWorkbook.Path = "" Then y pide una ubicación en lugar de construir una ruta rota a partir de nada.

El veredicto honesto: ancla a ThisWorkbook.Path, nunca a CurDir

Vale la pena entender CurDir precisamente para que puedas dejar de depender de él. Cuatro reglas:

  • Una ruta relativa sigue a CurDir → y CurDir es el directorio de trabajo itinerante de Excel, no la carpeta de tu libro.
  • Un diálogo de Abrir archivo mueve CurDir → así que las rutas relativas están intermitentemente equivocadas; nunca confíes en que el directorio de trabajo esté donde lo dejaste.
  • ChDir no cambiará de unidad → necesitas ChDrive primero; ambos son señal de que estás gestionando un estado que no deberías tener que gestionar.
  • Ancla a ThisWorkbook.Path → construye rutas absolutas con Application.PathSeparator, protege el caso del libro sin guardar, y el bug de la carpeta equivocada desaparece para siempre.

Este es el hilo que une las herramientas de carpetas: MkDir y RmDir son tan fiables como la ruta que les entregas, y una ruta relativa entrega tu destino a CurDir. Dales una ruta absoluta construida a partir de ThisWorkbook.Path, y ambas instrucciones hacen exactamente lo que esperas, en cada ejecución.

Cómo ayuda ExcelMaster

Acertar con una ruta significa saber que CurDir no es la carpeta de tu libro, que un diálogo de Abrir archivo la mueve sin avisar, que ChDir no puede cambiar de unidad, y que ThisWorkbook.Path está vacío hasta que el libro se guarda — cuatro trampas detrás de cada informe de «creó la carpeta en el sitio equivocado».

ExcelMaster escribe rutas que aterrizan donde quieres. Describe el trabajo — «guarda la exportación junto a este libro» o «construye la carpeta de salida en el directorio del proyecto» — y produce una ruta absoluta anclada a ThisWorkbook.Path con Application.PathSeparator, nunca una ruta relativa que dependa de CurDir, y protege el caso sin guardar. Tú describes adónde debe ir el archivo; él escribe la ruta que lo pone ahí en cada ejecución.

Preguntas frecuentes

¿Qué devuelve CurDir en VBA?

CurDir devuelve el directorio de trabajo actual de Excel — la carpeta contra la que se resuelven las rutas relativas. CurDir da el directorio de la unidad actual; CurDir("D") lo da para la unidad D. Normalmente es lo que sea que Windows fijó cuando arrancó Excel (a menudo tu carpeta de Documentos) y no tiene conexión con el sitio donde está guardado tu libro, así que no lo uses para decir «junto a mi archivo».

¿Por qué mi macro de VBA crea la carpeta o guarda el archivo en el sitio equivocado?

Porque usaste una ruta relativa, y VBA la resolvió contra CurDir en lugar de contra la carpeta de tu libro. CurDir es el directorio de trabajo de Excel, y un diálogo de Abrir archivo lo cambia en silencio, así que la misma ruta relativa aterriza en carpetas distintas en ejecuciones distintas. Construye una ruta absoluta a partir de ThisWorkbook.PathThisWorkbook.Path & "\" & "Reports" — y la ubicación deja de depender de CurDir.

¿Cuál es la diferencia entre CurDir y ThisWorkbook.Path?

CurDir es el directorio de trabajo itinerante de Excel — donde se resuelven las rutas relativas, modificable por cualquier diálogo de archivo. ThisWorkbook.Path es la carpeta donde está guardado el libro que ejecuta el código, y no se mueve. Cuando quieras decir «junto a este libro», usa siempre ThisWorkbook.Path; usa CurDir solo cuando de verdad quieras el directorio de trabajo, lo cual es raro.

¿Por qué ChDir no cambia la unidad en VBA?

Porque ChDir cambia solo la carpeta actual, no la unidad actual — una herencia de DOS, donde cada unidad guardaba su propio directorio actual. ChDir "D:\Data" mientras estás en C: fija la carpeta por defecto de D: pero te deja en C:. Para cambiar de unidad, llama a ChDrive "D" primero, luego a ChDir "D:\Data". En la práctica es más simple evitar el directorio de trabajo por completo y usar rutas absolutas.

¿Por qué ThisWorkbook.Path está vacío?

ThisWorkbook.Path devuelve una cadena vacía cuando el libro nunca se ha guardado — un libro sin guardar todavía no tiene carpeta. Si una macro pudiera ejecutarse antes del primer guardado, comprueba If ThisWorkbook.Path = "" Then y pide al usuario una ubicación (con Application.GetSaveAsFilename) en lugar de construir una ruta a partir de una cadena vacía, lo que produciría una ruta relativa resuelta contra CurDir.

Probado en

Probado en: Excel 365 (Windows 11), VBA 7.1 — última verificación el 23/08/2026.

Guías relacionadas: VBA MkDir · VBA RmDir · VBA Dir · VBA Open Workbook · VBA Check If File Exists