El artículo sobre la creación de calendario automático es uno de los artículos más leídos en este sitio, y también es el más comentado, particularmente por la macro que te está causando problemas.
Este artículo le explicará cada línea del código. Esto le permitirá comprender la lógica y adaptar el código a sus necesidades. Si nunca has creado una macro, es fundamental conocer los conceptos básicos de programación en este artículo.
Aquí está el código utilizado en el calendario para ocultar los días.
Sub Masquer_Jour()
Dim Num_Col As Long
For Num_Col = 30 To 32 ' Boucle sur les cellules des jours 29, 30 et 31
If Month(Cells(6, Num_Col)) >= Cells(1, 1) Then
Columns(Num_Col).Hidden = True
Else
Columns(Num_Col).Hidden = False
End If
Next
Range("B6:AF13").ClearContents 'Supprime le contenu dans les cellules
End Sub
Si quieres un calendario que registra datos de mes a mes, Volver a este artículo o descargar el archivo.
Línea 1: Crear el nombre del procedimiento
Este es el nombre que identificará de forma única el procedimiento. También es gracias a este nombre que podemos enlazar menú desplegable a macro.
Sub Masquer_Jour()
Línea 2: Declaración de variables
Para escanear varias columnas para leer la fecha que contienen, necesitamos usar una variable. la variable Num_Col se declara (Dim) para ser un número entero (As Long)
Dim Num_Col As Long
Línea 3: Inicio del bucle
Vamos a escribir un bucle que variará la variable. Num_Col desde el valor 30 y termina en el valor 32
For Num_Col = 30 To 32
La razón es porque en la construcción de nuestro calendario los días 29, 30 y 31 siempre se calcularán en las columnas 30, 31 y 32.

Línea 4: Prueba entre el mes calculado y el mes seleccionado
El truco completo del macro calendario está aquí 😮👍
Como sabes, todos los meses tienen 28 días, pero el mes de febrero puede tener 29 días cada 4 años y 4 meses tienen 30 días (abril, junio, septiembre, noviembre).
Presentado así, el problema parece complicado de resolver. Pero por otro lado, Excel siempre sabe adaptar las fechas si ya ha pasado final de mes. Por ejemplo, si sumamos 30 días el 1 de febrero, Excel devolverá la fecha del 3 de marzo.
=DATE(2019;2;1)+30 => 03/03/2019
Entonces, en nuestro calendario, si elegimos el mes de febrero, las columnas 30, 31 y 32 mostrarán las fechas del mes de marzo.

Por lo tanto, escribiremos una prueba que comparará el valor del mes (Month) en las columnas 30, 31 y 32 con el mes devuelto por el menú desplegable.

Por lo tanto, la prueba buscará si el valor del mes contenido en las celdas AD6, AE6 y AF6. O Cells(6, 30), Cells(6, 31) et Cells(6,32) son mayores o iguales al valor contenido en A1 (la celda vinculada del menú desplegable durante meses).
If Month(Cells(6, Num_Col)) >= Cells(1, 1) Then
Por supuesto, como estamos dentro de un bucle, el valor Num_Col primero tendrá el valor 30 y por lo tanto hará la prueba en la celda AD6, luego en el segundo paso por el bucle, la prueba se hará en la celda AE6 y así sucesivamente.
Línea 5: Ocultar columna
Si la prueba anterior es verdadera, la columna Num_Col Está oculto (Hidden = True Ocultar = Verdadero).
Columns(Num_Col).Hidden = True
Línea 6 y 7: Mostrar columna
Si la prueba es falsa (Else), luego la columna Num_Col se visualiza (Hidden = False)
Else
Columns(Num_Col).Hidden = False
Esta prueba puede parecer inútil pero si pasas de un mes que no tiene 31 días a un mes con 31 días, debes mostrar las columnas ocultas anteriores (inteligente)
Línea 8 y 9: Cerrar instrucciones
En VBA, cuando creas una prueba o un bucle, es fundamental indicar dónde terminan las instrucciones. Para indicar el final de una prueba. If, solo escribe la instrucción End If, y para un bucle For, debe terminar con la instrucción Next
End If
Next
Línea 10: Borrar los datos ingresados
Al final del procesamiento para ocultar o mostrar las columnas, el programa borrará los valores. ClearContents registrado en el rango de celdas B6 a AF13 Range("B6:AF13")
Range("B6:AF13").ClearContents
Línea 11: Completa el trámite
Al igual que con las pruebas o bucles, debes finalizar un procedimiento (y por lo tanto el final de tu programa) con la instrucción End Sub
End Sub
Conclusión
Como habrás notado, incluso si la macro de calendario es corta (8 líneas de código), cada línea es importante y tiene una función bien definida. Además, es importante comprender bien el código antes de realizar cualquier modificación.
02/09/2025 a las 10:47
Aquí está la macro:
Sub Hide_Day()
Dim Num_Col mientras
Rango("G13:AK45").Borrar contenido
Para Num_Col = 35 a 37
Si mes (celdas (12, Num_Col)) celdas (1, 3) entonces
Columnas (Num_Col). Ocultas = Verdadero
otro
Columnas(Num_Col).Ocultas = Falso
Si terminar
Siguiente
End Sub
Mi problema es el siguiente cuando cambio de mes, pongo un ejemplo; ingreso datos en enero y cuando voy al mes de febrero y vuelvo a enero los datos han desaparecido.
02/09/2025 a las 10:36
Hola, logré crear la macro y todo funciona. El problema es el siguiente:
Por ejemplo, yo ingreso datos en el mes de enero, cuando voy a febrero y vuelvo a enero, se borran todos mis datos...
Aquí está mi macro:
Sub Hide_Day()
Dim Num_Col mientras
Rango("G13:AK45").Borrar contenido
Para Num_Col = 35 a 37
Si mes (celdas (12, Num_Col)) celdas (1, 3) entonces
Columnas (Num_Col). Ocultas = Verdadero
otro
Columnas(Num_Col).Ocultas = Falso
Si terminar
Siguiente
End Sub
¿Podrías ayudarme por favor?
02/09/2025 a las 13:31
Este programa no gestiona el registro de datos. Para el registro de datos Tienes que comprar esta carpeta.
04/09/2025 a las 09:29
En respuesta, no podemos comprar su archivo. Me sigue decepcionando que nos ofrezcan un archivo excelente, pero no nos muestren consejos que pueden mejorar nuestra vida diaria, como el VBA que solicité.
20/07/2025 a las 17:41
Hola,
cuando uso tu código adaptándolo a mis celdas y al ejecutar la macro este colorea todo mi calendario con el color de la semana y borra los nombres de los días...
Comentarios faire?
21/07/2025 a las 02:00
Ha leído usted El artículo que explica cada línea de código ? Esto le ayudará a adaptar la carpeta a sus necesidades.
15/04/2025 a las 10:08
Hola,
Estoy haciendo un calendario con macro como lo indicas con tus códigos, sin embargo, mis fechas están en filas y no en columnas, por lo que no funciona, existe algún código especial si las fechas están en filas?
Si es así ¿qué es?
gracias por regresar
15/04/2025 a las 17:02
En el enlace a la explicaciones macro, tienes un párrafo que explica cómo transformar el código con un libro de trabajo organizado verticalmente.
16/02/2025 a las 16:00
Hola quisiera saber porque cuando abro el visual basic no veo ninguna linea de codigo como a ti?
gracias
16/02/2025 a las 17:05
¿Guardaste tu macro en formato xlsm?
17/01/2025 a las 16:12
Hola de nuevo, la idea es eliminar el contenido al pasar al mes siguiente y conservarlo al volver al mes anterior.
¿Cómo?
Aquí está mi macro:
Sub Hide_Day()
Dim Num_Col mientras
Rango("D7:AH14").Borrar contenido
Para Num_Col = 32 a 34
Si mes (celdas (6, Num_Col)) celdas (1, 3) entonces
Columnas (Num_Col). Ocultas = Verdadero
otro
Columnas(Num_Col).Ocultas = Falso
Si terminar
Siguiente
End Sub
21/01/2025 a las 03:25
Hola, para ello debes adquirir el calendario automático (enlace en el artículo). El trabajo es complicado y requirió varios días de desarrollo en VBA. El código tiene varios miles de líneas para tener en cuenta todos los escenarios (agregar un empleado, eliminar un empleado, modificar un valor, eliminar un valor único, etc.)
17/01/2025 a las 16:03
Hola,
¿Cómo nos aseguramos de que los datos introducidos cada mes queden registrados y no se sobrescriban? Cuando cambias de mes, los datos registrados en el mes anterior se borran, lo cual es muy restrictivo... ¿Existe alguna solución para esto? Eliminar el contenido claro no es suficiente para obtener información.
aquí está mi macro:
Sub Hide_Day()
Dim Num_Col mientras
Rango("D7:AH14").Borrar contenido
Para Num_Col = 32 a 34
Si mes (celdas (6, Num_Col)) celdas (1, 3) entonces
Columnas (Num_Col). Ocultas = Verdadero
otro
Columnas(Num_Col).Ocultas = Falso
Si terminar
Siguiente
End Sub
Gracias de antemano por sus comentarios.
01/07/2022 a las 10:57
Muchas gracias a ti. Este tutorial resuelve una de mis dificultades en la gestión del cronometraje del personal.
02/05/2022 a las 16:14
Hola,
Muchas gracias por tu esfuerzo y por todo lo que haces para ayudarnos.
Te estimo mucho y te deseo felicidad en el mundo entero.
Si me lo permiten me gustaría aprender a registrar mis datos de un mes para otro (seguimiento del tiempo del personal).
De nuevo muchas gracias.
25/04/2022 a las 15:10
Hola, me gustaría poder cambiar el mes pero actualizando cada vez los datos que contiene cada mes sin sobrescribirlos.
26/04/2022 a las 00:45
Debes eliminar la línea de la macro ClearContents.
13/08/2021 a las 07:14
Hola y gracias por el tutorial!
¡Necesito una mano amiga! Como muchos, mi calendario es vertical pero ese no es mi problema, adapté la macro. ¡Guardo y funciona! Excepto que cada mes tiene 28 días. Tuve que eliminar la línea que solicita la eliminación de las celdas para mis necesidades y noté que si configuro todo en FALSO y se muestra todo el día, me preguntaba si faltaba alguna línea en la macro. Tengo la impresión de que solo toma 28 días o se muestra todos los días... aquí están los códigos
Sub Hide_Day()
Atenuar Num_Lines mientras sea largo
For Num_Lignes = 31 To 33 ' Bucle en las celdas de los días 29, 30 y 31
Si mes (celdas (núm_líneas, 3)) > celdas (1, 1) entonces
Filas (Num_Lines). Ocultas = Verdadero
otro
Filas (Num_Lines). Ocultas = Falso
Si terminar
Siguiente
End Sub
Este código me permite ocultar 29-30-31 y solo aparecen 28 días sin importar el mes
y éste
Sub Hide_Day()
Atenuar Num_Lines mientras sea largo
For Num_Lignes = 31 To 33 ' Bucle en las celdas de los días 29, 30 y 31
Si mes (celdas (núm_líneas, 3)) > celdas (1, 1) entonces
Filas (Num_Lines). Ocultas = Falso
otro
Filas (Num_Lines). Ocultas = Falso
Si terminar
Siguiente
End Sub
Me permite mostrar todos los días sin importar el mes...
¡Puedo adaptarme pero todavía tengo lagunas macro! ¡Gracias por tu mano amiga!
01/11/2021 a las 03:10
¡Hola
mi mesa comienza en C5 y termina en AH15
el menú desplegable no afecta la macro, es invisible en el programa
en C1 se devuelve el valor del mes, esto es lo que se debe ingresar en la macro
SI Mes (Celdas (5, Num_Col)) > Celdas (1, 3) ENTONCES
I__> este número 5, corresponde a la fila de días de la semana en la tabla
La celda 1 es la primera fila de Excel y la 3 es la columna número 3 de Excel.
no olvides el cartel >
24/06/2021 a las 14:13
Bonjour à tous,
No entiendo porque cuando pongo las macros se me corta el calendario el día 28 de cada mes. ¿¿Sabes por qué??
24/06/2021 a las 14:30
La prueba de la celda es necesariamente siempre cierta. O hay un problema con los valores de las celdas o no estás apuntando a la fila correcta donde están tus fechas
24/06/2021 a las 23:27
Pasé más de 4 horas intentándolo todo, pero no entiendo por qué mis meses siempre terminan el día 28.
06/07/2021 a las 11:06
Hola, tuve el mismo problema, para solucionarlo cambié la celda de referencia del mes!
En el ejemplo:
Si Mes(Celdas(23, Num_Col)) Celdas(1, 1) Entonces 'vuelve a la Celda A1
Modificación de la celda de referencia del mes:
Si Mes(Celdas(23, Num_Col)) Celdas(1, 3) Entonces 'regresa a la Celda C1
funciona perfectamente,
gracias frederic
06/07/2021 a las 12:53
Cuidado, falta el símbolo “difieren de”:
Si Mes(Celdas(23, Num_Col)) Celdas(1, 3)
24/08/2021 a las 19:16
Muchas gracias por tu ayuda, a mí también me funciona.
Gracias de nuevo !!!
16/07/2021 a las 09:40
sólo debes poner el símbolo “es superior” en esta línea del test:
Si Mes (Celdas (6, Num_Col)) > Celdas (1, 1) Entonces
y no >= porque si pones >= entonces para cada mes la prueba será verdadera
17/04/2021 a las 13:03
Hola, intenté ingresar esta fórmula pero mi calendario está vertical.
Probé esta fórmula:
Sub Hide_Day()
Atenuar Num_Lines mientras sea largo
For Num_Lignes = 31 To 33 ' Bucle en las celdas de los días 29, 30 y 31
Si Mes (Celdas (2, Num_Lines)) >= Celdas (1, 1) Entonces
Líneas (Num_Lines). Ocultas = Verdadero
otro
Líneas (Num_Lines). Ocultas = Falso
Si terminar
Siguiente
Range("B3:I33").ClearContents 'Borra el contenido de las celdas
End Sub
pero no funciona.
¿Puedes ayudarme por favor?
22/03/2021 a las 18:19
¡Hola
Creé un calendario como este pero necesito guardar valores en la tabla para cada mes
22/03/2021 a las 20:01
NO ES POSIBLE. No puede ingresar valores en las celdas y al mismo tiempo recuperar el resultado de un mes anterior. Este no es el propósito de Excel
03/03/2021 a las 16:44
Hola,
Tengo la misma línea de código que tú, excepto por la cantidad de cuadros que cambian (tabla desplazada). Sin embargo, las casillas 28-29-30 e incluso la 31 no desaparecen.
Además, todas las filas de la tabla se vuelven rojas (el color de mis fines de semana).
¿Tienes una idea del problema?
Merci
20/05/2021 a las 18:32
Hola,
Para las columnas que no desaparecen, esto es normal porque no has completado todo el tutorial.
Para hacer esto, ve aquí https://excel-exercice.com/creation-dun-calendrier-automatique/ , luego vaya al paso "Paso 11: Vincular los menús desplegables a la macro"
Una vez que completes este paso, todo funcionará.
Para las líneas que se ponen rojas, también tengo lo mismo. Hasta ahora no he podido encontrar de dónde viene esto.
Te lo ruego.
06/02/2021 a las 19:22
¡Hola
Después de varias horas de investigación decidí preguntarte si es posible modificar esta macro.
por una mesa donde las fechas sean verticales, en lugar de perder el tiempo en algo imposible.
gracias de antemano por su respuesta
07/02/2021 a las 13:10
Simplemente invierte la escritura Cells(Num_Line,6) por Cells(6, Num_Line)
07/02/2021 a las 14:48
¡Hola
Gracias por tu rápida respuesta, funciona sin embargo borra las fórmulas de las celdas y no vuelven a aparecer al cambiar de mes; ¿No debería esto simplemente ocultar la línea?
gracias de antemano por su respuesta
17/05/2021 a las 10:47
Hola,
Tengo el mismo problema que "Christophe", la macro borra toda la tabla y no los días deseados (los del mes siguiente).
Aqui esta mi macro
Sub Hide_Day()
Atenuar Num_Line mientras sea largo
For Num_Line = 33 To 35 ' Bucle en las celdas de los días 29, 30 y 31
Si Mes (Celdas (Núm_línea, 1)) >= Celdas (1, 1) Entonces
Filas (Núm_fila). Ocultas = Verdadero
otro
Filas (Núm_fila). Ocultas = Falso
Si terminar
Siguiente
Range("A5:G35").ClearContents 'Borra el contenido de las celdas
End Sub
Merci
27/05/2021 a las 09:39
Hola,
Antes que nada pido disculpas porque si miramos un poco más detenidamente vemos que la línea:
"Range("A5:G35").ClearContents 'Elimina el contenido de las celdas' tal como está escrito elimina el contenido... (sin comentarios)
Luego, leyendo con más atención (y no rápidamente como la primera vez) me di cuenta de que todo lo que tenía que hacer era cambiar las líneas de referencia del mes:
Si Mes (Celdas (Núm_línea, 1)) >= Celdas (1, 1) Entonces
y eso es.
Gracias por el tutorial y buena suerte.
27/05/2021 a las 10:51
Bueno, esta es una buena respuesta. Sí, tienes que buscar un poco por ti mismo. Cuando realizas un proyecto con Excel siempre hay una parte que será específica y donde habrá que hacer una adaptación. No todas las respuestas están en la web, a veces todavía hay que pensar 😉
21/12/2021 a las 21:48
bonsoir
Me basé en tu calendario pero los ordené con los días verticalmente.
Soy nuevo en macros, ¿podrías ayudarme?
Le agradezco de antemano
Michel
21/12/2021 a las 22:41
Sin embargo, se explica en el artículo. En todas las instrucciones de Celdas (fila, columna) debes poner la variable en el parámetro de la fila y no en la columna.
31/01/2021 a las 18:53
Hola,
Gracias por este tutorial y estas explicaciones.
Por otro lado, noto (como ya lo mencioné en uno de los comentarios) cuando quiero llenar mi agenda, apenas cambio de mes (o año) todo se borra y es imposible conservar la información durante un mes seguido. el 'otro'. ¿Alguien puede aconsejarme y decirme cómo conservar los datos de un mes para otro?
Gracias de antemano a cualquiera que responda mi pregunta.
15/12/2020 a las 11:53
Hola,
¡Gracias por tu tutorial que me hizo la vida más fácil pero tengo un problema!
Creé exactamente el mismo calendario que tú, pero cuando quiero entrar a la macro hay un error de sintaxis que me bloquea.
Voici mon código:
Sub Hide_Day()
Dim Num_Col mientras
Para Num_Col = 30 a 32
Si mes (celdas (6, 30), celdas (6, 31), celdas (6, 32)> celdas (1, 1) entonces
Columnas (Num_Col). Ocultas = Verdadero
otro
Columnas(Num_Col).Ocultas = Falso
Si terminar
Siguiente
End Sub
¿Alguien puede ayudarme a finalizar este calendario correctamente? Gracias de antemano
20/05/2021 a las 18:14
Hola,
A la siguiente afirmación le falta un paréntesis:
Si mes (celdas (6, 30), celdas (6, 31), celdas (6, 32)> celdas (1, 1) entonces
En su lugar escribe:
Si mes (celdas (6, 30), celdas (6, 31), celdas (6, 32)) > celdas (1, 1) entonces
De hecho, olvidaste cerrar los paréntesis de la función MES.
20/05/2021 a las 18:37
Hola,
No, no creaste el mismo calendario que él.
En lugar de escribir:
Para Num_Col = 30 a 32
Si mes (celdas (6, 30), celdas (6, 31), celdas (6, 32)> celdas (1, 1) entonces
Escribir :
Para Num_Col = 30 a 32
Si mes (celdas (6, Num_Col))> celdas (1, 1) entonces
Porque en tu código usas el bucle for incorrectamente.
Te lo ruego.
23/11/2020 a las 14:37
Hola,
Seguí tu tutorial al pie de la letra, misma fila, misma columna. Solo que la macro no funciona para la primera línea Sub MAsquer_Jour(), se muestra en amarillo fluorescente. No entiendo por qué.
Y siempre se muestran las líneas que siguen a 30 y 31.
Merci d'avance pour votre retour
30/10/2020 a las 10:53
Hola,
Estaba ayudando a una amiga a progresar con sus ejercicios cuando me di cuenta de que su sitio web inyecta grandes errores en el código de sus macros. Rápidamente entendimos por qué ella no avanzaba.
la línea :
Si Mes (Celdas (6, Num_Col)) >= Celdas (1, 1) Entonces
Debe ser reemplazado por:
Si Mes (Celdas (6, Num_Col)) > Celdas (1, 1) Entonces
y la línea:
Range("B6:AF13").ClearContents 'Borra el contenido de las celdas
Debe ser reemplazado por:
Range("B6:AF13").ClearContents 'Borra el contenido de las celdas
El motivo de estas inyecciones es simple, no manejas bien la codificación de caracteres de tus páginas web, por lo que ciertos caracteres especiales no se muestran correctamente, una simple comilla se transforma en """ o una simple flecha se transforma en ">"
Por el bien de los principiantes, sería bueno corregir todo eso :)
30/10/2020 a las 11:22
Mil gracias,
De hecho, este es el tipo de error tipográfico que puede ocurrir pero que solo es visible en el momento de la publicación.
Esta corregido
10/09/2020 a las 12:09
Hola,
Llevo 2 días dándole vueltas a todo en todas direcciones... respecto a la macro. Mis columnas AD AE AF están bien escondidas, pero TODOS los meses de todos los años. No entiendo porqué. Alguien puede ayudarme ? El primer día de las fechas en mi tabla comienza en B6, termina en AF (31 días)
06/09/2020 a las 18:20
Hola;
Seguí el tutorial pero tuve un problema con la macro para ocultar los días porque el calendario que edité es opuesto al tuyo (días colocados verticalmente) ¿eso afecta la macro?
Merci par avance verter ayudante votre
31/08/2020 a las 15:53
hola no puedo transferir la macro en modo vertical??? podria usted ayudarme !!
09/07/2020 a las 18:08
Bonsoir,
Creé un documento siguiendo tu tutorial de Excel pero no entiendo la macro: "ocultar día"
¿Pueden ayudarme si les envío mi documento?
Muchas gracias.
23/11/2020 a las 16:09
Todo iba tan bien...
Muy muy pero luego muy decepcionado con el final... aunque respeté el formato de la tabla, la macro oculta sistemáticamente los últimos días, mi tabla se detiene en 28 días...
Perdí toda una tarde intentando resolver el problema sin éxito...
Por lo tanto, no recomiendo su tutorial a futuros lectores.
27/06/2020 a las 07:41
Hola,
Esto es lo que escribimos para que la macro funcione (Office Suite 2016):
Sub Hide_Day()
Dim Num_Col mientras
Para Num_Col = 30 a 32
Si Mes (Celdas (12, Num_Col)) > Celdas (1, 1) Entonces
Columnas (Num_Col). Ocultas = Verdadero
otro
Columnas(Num_Col).Ocultas = Falso
Si terminar
Siguiente
Rango ("B13", "AF15"). Borrar contenido
End Sub
Mi calendario comienza en B12. Haga que Range().ClearContents comience en B13 porque, de lo contrario, toda la primera línea de B1 desaparecerá...
Al igual que Moualek, esperaba que el calendario mantuviera los datos en la memoria, pero pasar de un mes al siguiente solo borra los datos permanentemente (si volvemos al mes con los datos, no queda nada)...
Por lo tanto, para aquellos que esperan configurar un calendario de vacaciones para un equipo o almacenar cualquier dato en la memoria a medida que avanza el calendario, esta no es la herramienta adecuada, al menos tal como está.
24/06/2020 a las 01:09
Hola,
Gracias por este tutorial. Sinceramente muy bien hecho!! ¡Bien hecho!
Sin embargo, tengo dos preguntas:
La línea: "If Month(Cells(8, Num_Col)) >= Cells(1, 1) Then" aparece en rojo y parece provocar un error en la macro. Sin embargo, el 8 corresponde a la línea de fecha de mi tabla y Cells(1,1) corresponde a las coordenadas de la celda donde aparece el número del mes en mis listas desplegables.
Además, esta línea de código parece no tener errores: Range("C9:AG11").ClearContents pero esta es: Range("C9:AG11").ClearContents
Probé ambos sin estar seguro de entender los matices entre los dos. Pensé que el segundo podría permitirte limpiar la tabla cuando cambies de mes sin borrar permanentemente los datos. Lo que permitiría encontrarlos regresando a dicho mes después. Pura especulación o esperanza por mi parte.
¡Gracias de nuevo por todo!