Calendario mensual dinámico con una sola fórmula

Un miembro de la comunidad preguntó cómo generar un calendario mensual completo en Excel usando únicamente fórmulas, sin VBA ni macros. El calendario debe mostrar los días del mes organizados por semanas (lunes a domingo), con encabezados de día, y adaptarse automáticamente al cambiar el mes y el año.

La primera propuesta usa LET + SECUENCIA con una matriz de 6×7 y un offset basado en DIASEM:

``
=LET(
año, A1,
mes, B1,
primerDia, FECHA(año, mes, 1),
ultimoDia, FECHA(año, mes + 1, 0),
diasMes, DIA(ultimoDia),
diaSemana, DIASEM(primerDia, 2),
offset, SI(diaSemana = 7, 0, diaSemana),
secuencia, SECUENCIA(6, 7) - offset,
calendario, SI((secuencia >= 1) (secuencia <= diasMes), secuencia, ""),
encabezados, {"D","L","M","M","J","V","S"},
APILARV(encabezados, calendario)
)
`

Leo propuso una versión más compacta con TEXTO, BYROW y FILTRAR para eliminar filas vacías automáticamente:

`
=LET(f,FECHA(A1,B1,1),d,SECUENCIA(6,7,f-DIASEM(f,1)+1),dd,TEXTO(SI(MES(d)=B1,d,""),"d"),APILARV(NOMPROPIO(TEXTO(SECUENCIA(,7),"ddd")),FILTRAR(dd,BYROW(1dd,CONTAR))))
`

Y la solución más avanzada, también de Leo, usa PIVOTARPOR para pivotar las fechas por número de semana:

`
=LET(a,A1,m,B1,i,FECHA(a,m,1),s,SECUENCIA(DIA(FIN.MES(i,0)),,i),EXCLUIR(PIVOTARPOR(NUM.DE.SEMANA(s),APILARH(DIASEM(s),TEXTO(s,"ddd")),TEXTO(s,"dd"),SINGLE,,0,,0),1,1))
`

Funciones utilizadas: LET, SECUENCIA, APILARV, FECHA, DIASEM, TEXTO, BYROW, FILTRAR, PIVOTARPOR, FIN.MES, EXCLUIR, NUM.DE.SEMANA`.

El problema: un calendario mensual solo con fórmulas

Generar un calendario mensual en Excel —días organizados por semanas de lunes a domingo, con cabeceras, que se recalcule solo al cambiar mes y año— parece territorio de VBA. Pero la comunidad demostró que se puede hacer solo con fórmulas dinámicas, y hasta de tres maneras distintas, cada una más compacta que la anterior.

Enfoque 1: SECUENCIA con offset y DIASEM

La primera propuesta parte de una cuadrícula de 6x7 (seis semanas posibles, siete días) y desplaza el arranque según el día de la semana del día 1:

=LET(
    año; A1; mes; B1;
    primerDia; FECHA(año; mes; 1);
    ultimoDia; FECHA(año; mes + 1; 0);
    diasMes; DIA(ultimoDia);
    diaSemana; DIASEM(primerDia; 2);
    offset; SI(diaSemana = 7; 0; diaSemana);
    secuencia; SECUENCIA(6; 7) - offset;
    calendario; SI((secuencia >= 1) * (diasMes >= secuencia); secuencia; "");
    APILARV(encabezados; calendario)
)

SECUENCIA(6;7) crea los números del 1 al 42; al restar el offset (la posición del primer día) se alinea el 1 del mes en su casilla correcta. El SI con la doble condición deja en blanco todo lo que se sale del mes, y APILARV pega la fila de cabeceras (encabezados, con las iniciales D L M M J V S) encima.

Enfoque 2: la versión compacta de Leo

Leo comprimió todo en una línea usando TEXTO, BYROW y FILTRAR para eliminar las filas sobrantes automáticamente:

=LET(f;FECHA(A1;B1;1);d;SECUENCIA(6;7;f-DIASEM(f;1)+1);dd;TEXTO(SI(MES(d)=B1;d;"");"d");APILARV(NOMPROPIO(TEXTO(SECUENCIA(;7);"ddd"));FILTRAR(dd;BYROW(1*dd;CONTAR))))

Aquí SECUENCIA(6;7;...;1) genera las fechas reales arrancando en el lunes anterior al día 1. TEXTO(...;"d") pinta el número de día solo si pertenece al mes buscado, y FILTRAR con BYROW(...;CONTAR) descarta las semanas que quedan totalmente vacías. Las cabeceras salen de TEXTO(SECUENCIA(;7);"ddd") con NOMPROPIO, sin escribirlas a mano.

Enfoque 3: PIVOTARPOR por número de semana

La versión más avanzada, también de Leo, trata las fechas como datos y las pivota por número de semana:

=LET(a;A1;m;B1;i;FECHA(a;m;1);s;SECUENCIA(DIA(FIN.MES(i;0));;i);EXCLUIR(PIVOTARPOR(NUM.DE.SEMANA(s);APILARH(DIASEM(s);TEXTO(s;"ddd"));TEXTO(s;"dd");SINGLE;;0;;0);1;1))

NUM.DE.SEMANA(s) agrupa las fechas por semana (las filas), DIASEM(s) las coloca en su columna de lunes a domingo, y PIVOTARPOR monta la rejilla. EXCLUIR(...;1;1) quita las cabeceras autogeneradas para dejar el calendario limpio.

Funciones clave

  • SECUENCIA: genera la rejilla de días o el rango de fechas del mes.
  • DIASEM / NUM.DE.SEMANA: sitúan cada fecha en su columna y su semana.
  • FIN.MES / DIA: calculan cuántos días tiene el mes.
  • FILTRAR + BYROW: eliminan las semanas vacías.
  • PIVOTARPOR / EXCLUIR: pivotan las fechas y recortan cabeceras.

Conclusión

Tres formas de pensar el mismo calendario: una aritmética (SECUENCIA con offset), una compacta (TEXTO + FILTRAR) y una relacional (PIVOTARPOR por semana). Ninguna necesita una sola línea de VBA. Es un ejemplo perfecto de cómo las matrices dinámicas de Excel moderno convierten en fórmula lo que antes pedía una macro. De estos retos salen varios cada semana en la comunidad de InflueXcel.

Más casos con estas funciones

Más contenido de Excel en InflueXcel