Este artículo desglosará cada línea de código VBA utilizada para ocultar columnas en el calendario automático.
Si desea crear un calendario que registre datos de varios meses, explore los recursos adicionales en este articulo.
Recordar el código VBA para ocultar los últimos días en el calendario
Sub Hide_Day()
Dim Num_Col As Long
'This instruction cleans the content of the cells in your calendar
Range("B7:AF13").ClearContents
For Num_Col = 30 To 32
' Test if the month of the cells (row 6) is the same of the month selected (cell A1 or cells(1,1))
If Month(Cells(6, Num_Col)) >= Cells(1, 1) Then
Columns(Num_Col).Hidden = True
Else
Columns(Num_Col).Hidden = False
End If
Next
End Sub
Línea 1: Creación del nombre de la subrutina
En cualquier programa VBA, todo el código está escrito dentro de subrutinas (Sub). Cada subrutina debe tener un nombre único en el proyecto.
Este nombre se utilizará en el proyecto de calendario para vincular el código con la lista desplegable.
Sub Hide_Day()
Línea 2: declarar la variable
- Para evaluar el valor del día en las diferentes columnas, debemos crear una variable para leer el índice de cada columna (1, 2, 3,...).
- La variable Num_Col se declara (Dim) como un Número Entero (As Long)
- Porque el índice de columna de Excel nunca se expresa con un decimal
Dim Num_Col As Long
Línea 3: comienzo del bucle
Ahora vamos a crear un bucle para extender la variable. Num_Col desde 30 hasta 32.
For Num_Col = 30 To 32
La razón por la que comenzamos nuestro ciclo en el valor 30 es porque para cualquier mes, los días 29, 30 y 31 estarán siempre en las columnas 30, 31 y 32.
Línea 4: Prueba entre el mes calculado en las celdas y el mes seleccionado
Aquí está el truco del programa. 😉😎
¿Cómo calcula Excel la fecha?
Como sabes, todos los meses tienen 28 días. Pero febrero podría tener 29 días cada 4 años y 4 meses tienen 30 días (abril, junio, septiembre, noviembre).
Parece complejo crear un test para cada caso. Por otro lado, Excel calcula con precisión una fecha incluso si el número de días a sumar se extiende hasta el final del mes.
Por ejemplo, si sumamos 30 días a la parte superior 1 de febrero de 2019, Excel devolverá la fecha del 3rd de marzo 2019.
=FECHA(2019;2;1)+30 => 03/03/2019
Cómo codificar una celda en VBA
En VBA, para leer el contenido de una celda, sólo hay que escribir Cells(index row, index column). Entonces, para A1, escribirás Cells(1, 1) y para la celda AD6 con el día 29, el código es Cells(6, 30)
Pero también puedes sustituir uno de los argumentos de Cells por una variable como esta Cells(6, Num_Col)
Construcción de la prueba.
Volvamos al calendario de febrero de 2019. Las columnas 30, 31 y 32 tendrán fechas de marzo (y no de febrero) debido a la regla explicada en la fórmula anterior.
Entonces, escribiremos una prueba entre el mes (devuelta por la función VBA Month) de las columnas 30, 31 y 32 y el valor devuelto por el menú desplegable para el mes.

Entonces, la prueba verificará si el mes en las celdas AD6, AE6 y AF6 (o Cells(6, 30), Cells(6, 31) et Cells(6,32)) es mayor o igual a A1 (la celda vinculada al menú desplegable del mes). Pero no necesitamos probar las 3 columnas, la variable lo hará por nosotros 😀
If Month(Cells(6, Num_Col)) >= Cells(1, 1) Then
Línea 5: Ocultar las columnas del calendario en VBA
Si la prueba es verdadera, la columna Num_Col Está oculto (Hidden = True).
Columns(Num_Col).Hidden = True
Líneas 6 y 7: Mostrar la columna
De lo contrario (Else), lo que significa que la prueba es Falsa, entonces la columna Num_Col no está oculto (Hidden = False)
Else
Columns(Num_Col).Hidden = False
Esta prueba parece extraña, pero en este caso, el mes seleccionado tiene 31 días y desea poder mostrar la columna anterior oculta (¡qué inteligente 😉!)
Líneas 8 y 9: Cerrar las instrucciones
En VBA, al crear una prueba, se debe indicar cuándo finaliza. Lo mismo ocurre con un bucle.
Al final de la prueba If is End If, y el bucle For, debes escribir la instrucción Next
End If
Next
Línea 10: Borrar los datos
Después del bucle en las 3 columnas, el programa borrará el contenido del rango B6 a AF13 Range("B6:AF13") con la instrucción ClearContents
Range("B6:AF1").ClearContents
Línea 11: Fin de la subrutina
Precisamente para indicar el final de una prueba o de un bucle, debes indicar que tu subrutina ha finalizado con la instrucción.
End Sub

22/02/2023 a las 16:41
¿Cómo puedo hacer para que los datos queden para cada mes?
18/03/2023 a las 08:33
Pronto publicaré un libro de trabajo con esta funcionalidad.
22/02/2023 a las 16:39
¡Gran explicación! ¿Cómo puedo hacer que los datos se mantengan cada mes?
¡Gracias!
24/01/2023 a las 14:02
Cómo dejar el contenido en la tabla. El contenido no permanece cuando cambio los meses. ¿Puedo saber cuál debería ser el comando para diferentes contenidos por mes?
08/01/2023 a las 16:18
Señor, muy buenos métodos de enseñanza ods, por favor introduzca el código vba.
06/12/2022 a las 22:36
Me acabo de topar con esto y es sorprendente lo que he aprendido. Gracias.
Pero al revisar otros comentarios, ¿hay alguna forma de esa pieza final (almacenar los datos ingresados en el calendario de mes a mes?
16/12/2022 a las 10:25
Pronto 😉
06/10/2022 a las 11:48
la fórmula es incorrecta, debería ser If Month(Cells(6, Num_Kol)) > Cells(1, 1) Then
en lugar de If Month(Cells(6, Num_Kol)) > =Cells(1, 1) Then
04/02/2022 a las 19:04
Es un error de conversión de HTML... cambie la línea a esta:
Si Mes (Celdas (6, Num_Col)) > Celdas (1, 1) Entonces
26/01/2022 a las 12:32
De hecho tengo el mismo problema. Si selecciono "febrero" los días visualizados son 28, pero luego, si elijo otro mes, digamos "enero", los días visualizados siguen siendo 28 y no 31.
¿Hay alguna forma de solucionar este problema?
Gracias
23/12/2021 a las 16:11
Hola, necesito realizar un seguimiento de los días de vacaciones en este calendario. ¿Puedes decirme cómo ajustar el código para que mantenga los días marcados como vacaciones o no y no los borre? gracias
05/10/2021 a las 22:36
¡Hola señor!
El código no funciona. ¿Cómo puedo solucionarlo?
Sub Hide_Day()
Dim Num_Col mientras
'Esta instrucción limpia el contenido de las celdas de tu calendario.
Rango("B7:AF13").Borrar contenido
Para Num_Col = 30 a 32
'Prueba si el mes de las celdas (fila 6) es el mismo que el mes seleccionado (celda A1 o celdas(1,1))
Si Mes(Celdas(6, Num_Col)) >= Celdas(1, 1) Entonces
Columnas (Num_Col). Ocultas = Verdadero
otro
Columnas(Num_Col).Ocultas = Falso
Si terminar
Siguiente
End Sub
16/11/2021 a las 19:35
Sub Hide_Day()
Dim Num_Col mientras
'Esta instrucción limpia el contenido de las celdas de tu calendario.
Rango("B7:AF13").Borrar contenido
Para Num_Col = 30 a 32
'Prueba si el mes de las celdas (fila 6) es el mismo que el mes seleccionado (celda A1 o celdas(1,1))
Si mes (celdas (6, Num_Col)) celdas (1, 1) entonces
Columnas (Num_Col). Ocultas = Verdadero
otro
Columnas(Num_Col).Ocultas = Falso
Si terminar
Siguiente
End Sub
16/11/2021 a las 19:40
Al sitio le falta el signo no igual en el código intermedio.
Si Mes (Celdas (6, Num_Col)) signo igual Celdas (1, 1) Entonces
17/11/2021 a las 18:42
Gracias, lo reviso
28/01/2021 a las 18:05
Excelente señor, ¿puedo hacer esto en la hoja de Google, por favor?
28/01/2021 a las 18:15
VBA no está disponible con Google Sheet. Sólo para Excel
16/11/2020 a las 21:28
¡Hola señor!
Tengo una pregunta sobre la fórmula VBA para ocultar columnas. ¿Podrías ayudarme amablemente?
16/11/2020 a las 21:47
He agregado un enlace para la explicación del código. Esto te ayudará a personalizar tu proyecto.
01/12/2021 a las 11:16
Para mí, parece que oculta las columnas 30-32 independientemente del día en que uso esta fórmula. (calendario hecho igual que su guía)
Parece que verifica febrero y permanece allí, ¿alguna forma de evitarlo?