一个公式制作如图所示的简易万年历,更改年份和月份自动更新。

简易万年历


获取当月第1天

DATE引用指定的年份和月份,获取该月份的第1天:

=DATE(D2,E2,1)

获取当月第1天


获取当月第1周的星期一

由于周一到周日的排列方式,D4单元格的内容是:当月第1周星期一的日期。

2023/7/1是当月第1周的星期六, D4单元格的日期是2023/7/1减去5天。由此总结:

当月1日是星期一,当月第1周的星期一等于当月1日减0天;

当月1日是星期二,当月第1周的星期一等于当月1日减1天;

当月1日是星期三,当月第1周的星期一等于当月1日减2天;

……

当月第1周的星期一 = 当月1日 – (当月1日的星期数-1)

上一步中已经获取了当月1日:

=DATE(D2,E2,1)

(当月1日的星期数-1):

=WEEKDAY(DATE(D2,E2,1),3)

WEEKDAY的作用是返回日期的星期数,第二参数设置为3表示“从0(星期一)到6(星期天)的数字”,如:2023/7/1是星期六,则返回数字5.

两者相减:

=DATE(D2,E2,1)-WEEKDAY(DATE(D2,E2,1),3)

当月第1周的星期一


递增队列

=SEQUENCE(6,7,0)

SEQUENCE产生一个6行7列,起始数为0,以1递增的数字队列。

数字队列


日期的递增队列

把上2步的首个日期和队列相加,即得到42个连续的日期队列:

=DATE(D2,E2,1)-WEEKDAY(DATE(D2,E2,1),3)+SEQUENCE(6,7,0)

日期的递增队列


弱化显示非当月日期

单元格月份不等于指定月份,则执行条件格式,用浅灰色将其弱化显示:

=MONTH(D4)<>$E$2

条件格式设置