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`.

Más contenido de Excel en InflueXcel