Microsoft365だと数式はスピルで結果が表示されるので、いちいち数式を右や下にコピーする必要がない。Excelでカレンダーを作る必要が本当にあるかどうかは別として、マンスリーカレンダー(七曜カレンダー)を作るのはとてつもなく簡単になった。
例えばこんな感じの外連味のないカレンダーなら下記のように数式を入れるだけで出来上がる。
=LET(
y,A1,
m,B1,
bm,DATE(y,m,1),
cal,SEQUENCE(6,7,bm-WEEKDAY(bm+1,3)),
IFERROR(IF(MONTH(cal)=m,cal,""),"")
)
書式は別途変更が必要。因みに月曜始まりなら「WEEKDAY(_bm+1,3)」を「WEEKDAY(_bm,3)」とすればいい。
蛇足ながら、月跨ぎの日も表示させるなら数式を下のようにすればいい。
=LET(
y,A1,
m,B1,
bm,DATE(y,m,1),
IFERROR(SEQUENCE(6,7,bm-WEEKDAY(bm+1,3)),"")
)
とはいえ、これだけではさすがに味気がないので少し工夫してみる。
例えば、2行一組にして下に祝日名が下段に表示されるようにしてみよう。この場合は祝日一覧を別途作る必要がある。
手で作ってもいいけど「年」情報を利用するなら、
=LET(
y,年,
url,"https://holidays-jp.github.io/api/v1/"&y&"/date.json",
json,WEBSERVICE(url),
arry,TEXTSPLIT(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(
json,CHAR(10),""),"""",""),"{",""),"}",""),":",","),
HSTACK(TRIM(TAKE(arry,,1))/1,DROP(arry,,1))
)
としても作れる。「祝日」シートの A1に祝日一覧の数式が入っているとして、
=LET(
y,A1,
m,B1,
bed,DATE(y,m,1),
tfd,bed-WEEKDAY(bed+1,3),
cal,tfd+INT(SEQUENCE(12,,0,1/2))*7+SEQUENCE(1,7,0),
hd,祝日!A1#,
REF,LAMBDA(c,INDEX(hd,,c)),
xl,XLOOKUP(cal,REF(1),REF(2),""),
flg,MOD(SEQUENCE(ROWS(cal)),2)=1,
IFERROR(IF(MONTH(cal)=m,IF(flg,cal,xl),""),"")
)
例えばこんな式で交互に表示する内容を振り分けすればいい。LAMBDAで関数を作らずに、TAKE/DROP/CHOOSECOLSでやっても特に問題なし。
この手のやり方は、応用すればスケジュール内容を表示させるのにも使える。