我在您的文件中添加了一个名为“Aresvik”的新工作表。
绿色单元格有新公式。
单元格B3 可以是=date(B1,1,1)
那么每个连续的月份可以是=eomonth(B3,0)+1、=eomonth(J3,0)+1等。
单元格B5中的日期公式为:
=arrayformula(iferror(vlookup(sequence(7,7,1),{array_constrain(sequence(40,1),day(eomonth(B3,0))+weekday(B3,3),1),query({flatten(split(rept(",",day(eomonth(B3,0))-1),",",0,0));sequence(day(eomonth(B3,0)),1,1)},"offset "&day(eomonth(B3,0))-weekday(B3,3)&" ",0)},2,false),))
可以复制到Mo下面的其他单元格,所以B5会变成J5、R5、Z5等。
备注
这个概念围绕着使用SEQUENCE 函数来生成一个6 行7 列的数字网格:
sequence(6,7)
看起来像这样:
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 32 33 34 35
36 37 38 39 40 41 42
然后在VLOOKUP 中使用这些数字来获取日历的对应日期。如果一个月的第一天是星期四(2021 年 4 月),则 vlookup 范围需要在日期列表的顶部有 3 个间隙。 player0 比我原来的query 使用offset 有一个更优雅的解决方案,所以我在下面合并了它。单元格 Z3 是日期 1/4/2021:
=arrayformula(
iferror(
vlookup(sequence(6,7),
{sequence(day(eomonth(Z3,0))+weekday(Z3,2),1,0),
{iferror(sequence(weekday(Z3,2),1)/0,);sequence(day(eomonth(Z3,0)),1,Z3)}},
2,false)
,))
vlookup 范围的第一列是:
sequence(day(eomonth(Z3,0))+weekday(Z3,2),1,0)
这是一个从0开始的数字数组,对应于当月的天数加上第一天之前的间隔数。
vlookup 范围内的第二列是:
{iferror(sequence(weekday(Z3,2),1)/0,);sequence(day(eomonth(Z3,0)),1,Z3)}},
这是一个包含 2 列的数组,格式为:{x;y},其中y 位于x 下方,因为;。
这些是空白:iferror(sequence(weekday(Z3,2),1)/0,),后面是日期数字:sequence(day(eomonth(Z3,0)),1,Z3)
(以下示例为 2021 年 4 月):
0
1
2
3
4
5
6 44317
7 44318
8 44319
9 44320
10 44321
11 44322
12 44323
13 44324
14 44325
15 44326
16 44327
17 44328
18 44329
19 44330
20 44331
21 44332
22 44333
23 44334
24 44335
25 44336
26 44337
27 44338
28 44339
29 44340
30 44341
31 44342
32 44343
33 44344
34 44345
35 44346
36 44347
vlookup 获取初始序列(6x7 布局)中的每个数字,并根据 col1 中的匹配从范围中的 col2 中带回相应的日期。
当月的第一天是星期一时,iferror(sequence(weekday(BB1,2),1)/0,) 会在 vlookup 范围的 col2 中生成一个间隙。这就是为什么 vlookup 范围中的 col1 必须以 0 开头的原因。
我在https://docs.google.com/spreadsheets/d/1u_J7bmOFyDlYXhcL5dW3CHFJ1esySAKK_yPc6nFTdLA/edit#gid=68642071更新了表格
日历上的值是日期,所以格式必须是d。
如果你想要数字,那么使用:
=arrayformula(
iferror(
vlookup(sequence(6,7),
{sequence(day(eomonth(Z3,0))+weekday(Z3,2),1,0),
{iferror(sequence(weekday(Z3,2),1)/0,);sequence(day(eomonth(Z3,0)),1)}},
2,false)
,))