使用 Arrayformula 或 LOOKUP 填充日历

Filling a calendar using Arrayformula or LOOKUP

我制作了一个日历 sheet 并想使用 Arrayformula 或某种 Lookup 来填充它。 问题是,每个单元格中的代码都不同,我是否需要所有代码都是相同的代码,或者是否可以做一个为每一行做不同公式的 Arrayformula?

我花了很长时间让日历代码正常工作,但现在想简化代码,但我不确定下一步应该做什么:

https://docs.google.com/spreadsheets/d/1u_J7bmOFyDlYXhcL5dW3CHFJ1esySAKK_yPc6nFTdLA/edit?usp=sharing

如有任何建议,我们将不胜感激。

我在你的文件中添加了一个新的 sheet,名为 '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会变成J5R5Z5

备注

这个概念围绕着使用 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开始的数字数组,对应一个月的天数加上第1天之前的间隔数

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

更新了 sheet

日历上的值是日期,因此格式必须是 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)
,))

更短的解决方案:

=INDEX(IFNA(VLOOKUP(SEQUENCE(6, 7), {SEQUENCE(DAY(EOMONTH(B3, ))+WEEKDAY(B3, 2), 1, ), 
 {IFERROR(ROW(INDIRECT("1:"&WEEKDAY(B3, 2)))/0); SEQUENCE(DAY(EOMONTH(B3, )), 1, B3)}}, 2, )))