なんでもエクセル(Nandemo Excel)

何でもエクセルでやってしまう そこのあなた。ようこそ

数式/関数:カレンダーを作る1

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でやっても特に問題なし。

この手のやり方は、応用すればスケジュール内容を表示させるのにも使える。