Crear el árbol de carpetas del año desde Excel con una macro parametrizable

Esta vez no hay una pregunta que resolver: Hector pasó por el grupo y dejó directamente la herramienta, una macro que crea en Windows la carpeta del año y, dentro, una subcarpeta por cada mes transcurrido. La típica tarea de enero que todos hacemos a mano y que luego se arrastra mes a mes.

Lo interesante no es que cree carpetas, que eso son dos líneas, sino cómo está construida. El punto de entrada es un único Sub con nueve parámetros opcionales, así que la misma macro sirve para el que quiere 2026\01.- ene y para el que quiere Gastos 2026\01 - enero, sin tocar el código:

``
CrearCarpeta _
rutaBase:="C:\Reportes", _
PrefijoCarpetaAnio:="Gastos", _
UsarSoloAnioNumerico:=False, _
formatoMes:="mm - mmmm", _
PreguntarRutaSiVacia:=False, _
AbrirCarpetaAlFinal:=True
`

Los nueve argumentos se agrupan en un Type propio que viaja de una función a otra como un solo bloque, en lugar de ir arrastrando nueve variables sueltas por toda la macro.

Para nombrar los meses no hay ninguna lista de textos escrita a mano: se construye una fecha con DateSerial(anio; mes; 1) y se le aplica Format$, de modo que el nombre sale del formato que pidas. Con "mm.- mmm" obtienes 01.- ene y con "mm - mmmm" obtienes 01 - enero. Y hay un detalle bien pensado: la macro comprueba si el formato ya incluye mm y, si no lo incluye, antepone ella el número del mes, porque una carpeta llamada solo enero se ordena alfabéticamente y te deja abril el primero.

Las carpetas se crean con Scripting.FileSystemObject en vez de con el MkDir de toda la vida. La ventaja es que el mismo objeto ofrece FolderExists, así que antes de crear se comprueba, y la macro distingue entre carpetas creadas y carpetas que ya estaban para dártelo en el resumen final.

Y una idea que merece la pena robar aunque no crees carpetas nunca: el selector de carpeta usa Application.FileDialog(4), pero está envuelto en un manejador de errores que, si el cuadro de diálogo no está disponible, cae a un InputBox para escribir la ruta a mano. La macro no se muere, degrada.

En los comentarios apareció el enfoque alternativo. Un miembro contó que él esto lo hace con el Bloc de notas, y Hector le dio la razón: escribir los comandos en un fichero .bat, o cambiar la extensión desde PowerShell. Es una vía perfectamente válida y más rápida si es algo puntual. La diferencia está en el uso repetido: el .bat` hay que editarlo cada vez que cambias de año o de estructura, mientras que la macro recibe esa información como argumentos y ya sabe en qué mes estamos.

El libro incluye un segundo módulo con siete ejemplos listos para ejecutar, desde el modo silencioso hasta el interactivo, así que se puede ver el comportamiento de cada combinación antes de decidir cuál te encaja.

Un aviso de Hector que evita el primer tropiezo, y que vale para cualquier libro con macros que descargues de internet:

> Al descargar, no olviden desbloquear el archivo con clic derecho, propiedades, desbloquear. Ya que por contener macros viene bloqueado al descargar.

Windows marca los ficheros que vienen de fuera y Excel se niega a ejecutar sus macros aunque habilites el contenido. Si no lo desbloqueas, la macro no arranca y parece que está rota.

Cada enero se repite la misma escena: alguien se sienta a crear a mano la carpeta del año nuevo y, dentro, las doce carpetas de los meses. Doce clics derechos, doce veces "Nueva carpeta", doce veces escribir el nombre. Y en febrero otra vez, porque el año pasado se hizo con otro criterio y ahora los nombres no coinciden.

Hector compartió en la comunidad una macro que resuelve exactamente eso. Y aunque el resultado sea humilde, crear carpetas, la forma en que está construida tiene varias ideas que merece la pena mirar de cerca aunque nunca vayas a crear una carpeta desde Excel.

El problema

Automatizar la creación de carpetas es fácil. Lo difícil es que la automatización te sirva a ti y también al de al lado.

Uno quiere las carpetas como 2026\01.- ene. Otro las quiere como Gastos 2026\01 - enero. Un tercero las quiere colgando de una ruta fija y sin que le pregunten nada, porque las lanza desde otro proceso. La macro típica resuelve el caso de quien la escribió, y el resto acaba abriendo el editor de VBA para cambiar un literal a mano.

Nueve argumentos en lugar de nueve ediciones

El punto de entrada es un único procedimiento público con nueve parámetros opcionales: la ruta base, el prefijo del año, si usar solo el año numérico, el formato del mes, el separador, si preguntar la ruta cuando falta, si preguntar cuando la carpeta ya existe, si abrir la carpeta al terminar y si mostrar el resumen.

`` CrearCarpeta _ rutaBase:="C:\Reportes", _ PrefijoCarpetaAnio:="Gastos", _ UsarSoloAnioNumerico:=False, _ formatoMes:="mm - mmmm", _ PreguntarRutaSiVacia:=False, _ AbrirCarpetaAlFinal:=True ``

Al llamarla con los nombres de los argumentos, la línea se lee sola. Y dentro de la macro esos nueve valores no viajan sueltos: se agrupan en un Type propio, de modo que las funciones internas reciben un solo bloque de configuración en vez de una lista interminable de parámetros.

Los nombres de los meses no están escritos en ningún sitio

Aquí está el detalle más elegante. No hay una lista con "enero", "febrero", "marzo". Lo que hay es una fecha construida al vuelo con DateSerial(anio; mes; 1) a la que se le aplica Format$.

Eso significa que el nombre de la carpeta sale del formato que pidas. Con "mm.- mmm" obtienes 01.- ene. Con "mm - mmmm" obtienes 01 - enero. Con "mmmm" obtienes solo enero. La macro no sabe nada de meses: sabe de formatos.

Y hay una comprobación que delata a alguien que ya se ha tropezado antes: si el formato que le pasas no incluye mm, la macro antepone ella el número del mes. El motivo es que Windows ordena las carpetas alfabéticamente, así que una estructura con los meses en texto plano te coloca abril arriba del todo y septiembre en medio. El número delante mantiene el orden natural del año.

Comprobar antes de crear

Las carpetas se crean con Scripting.FileSystemObject y no con el clásico MkDir. La razón práctica es que el mismo objeto ofrece FolderExists, así que la macro puede preguntar antes de actuar y llevar dos contadores separados: carpetas creadas y carpetas que ya estaban. Al terminar te muestra ambos números, que es la diferencia entre "he hecho algo" y "he hecho esto exactamente".

La idea que puedes robar aunque no crees carpetas

El selector de carpeta usa Application.FileDialog(4), el cuadro de diálogo estándar de Windows para elegir una ubicación. Pero está envuelto en un manejador de errores con un plan B: si ese diálogo no está disponible, la macro cae a un InputBox donde escribes la ruta a mano.

No se muere, degrada. Es un patrón que puedes aplicar a cualquier macro que dependa de algo que quizá no esté ahí.

El enfoque alternativo

En el grupo apareció el contrapunto. Otro miembro contó que él esto lo hace con el Bloc de notas, y Hector le dio la razón: escribir los comandos en un fichero .bat, o cambiar la extensión desde PowerShell. Es una vía válida y más rápida para algo puntual.

La diferencia está en el uso repetido. El fichero por lotes hay que editarlo cada vez que cambias de año o de estructura. La macro recibe esa información como argumentos y ya sabe en qué mes estamos, porque lee la fecha del sistema y crea solo los meses transcurridos.

Un aviso que ahorra media hora

Hector añadió una advertencia al compartir el libro: al descargarlo hay que desbloquearlo con clic derecho, Propiedades, Desbloquear.

Windows marca los ficheros que vienen de fuera y Excel se niega a ejecutar sus macros aunque habilites el contenido desde la barra amarilla. Si no lo desbloqueas, no pasa nada al pulsar el botón y todo apunta a que la macro está rota. No lo está.

Conclusión

Una aportación que no respondía a ninguna pregunta y que, sin embargo, enseña más de diseño de macros que muchos ejemplos hechos a propósito: parámetros con nombre en lugar de literales, configuración agrupada, nombres derivados de un formato en vez de una lista fija, comprobación antes de actuar y un plan B cuando algo falla. Así funciona la comunidad de Influexcel: a veces alguien pregunta, y a veces alguien simplemente deja algo encima de la mesa.

Más contenido de Excel en InflueXcel