Excel:カレンダーを1つの数式で表示する

Microsoft 365でエクセルに動的配列数式が追加されたことで数式だけで出来ることが劇的に増えました。

動的配列数式とスピル機能を利用して1つの数式でカレンダーを表示してみた数式ワンライナーネタです。

以下はC2に入力された日付からその月のカレンダーの配列を返す数式です。

=LET(
    対象年, YEAR(C2),
    対象月, MONTH(C2),
    月初日, DATE(対象年,対象月,1),
    月末日, EOMONTH(月初日,0),
    基準日, 月初日-WEEKDAY(月初日),
    カレンダー, SEQUENCE(WEEKNUM(月末日)-WEEKNUM(月初日)+1,7)+基準日,
    IF(MONTH(カレンダー)=対象月,TEXT(カレンダー,"d"),""))

上記のカレンダーの数式の内容は以下です。

  1. 対象年にC2に入力された年を設定
  2. 対象月にC2に入力された月を設定
  3. 月初日に対象年の対象月の初日を設定
  4. 月末日に対象年の対象月の末日を設定
  5. 基準日にカレンダーに表示される最初の日の前の日を設定
    1. WEEKDAY関数で月初日の曜日に対する値を取得
      (週の基準を指定しない場合は日~土までそれぞれ1~7になる)
    2. 月初日から月初日の曜日に対応する値をマイナスした日付が最初の日曜日の前の日となる
  6. カレンダーに対象月の日付の配列を設定
    1. SEQUENCE関数で対象月の週数の行x7列の1から始まる連番の配列を作成
    2. 配列のそれぞれの値をそれぞれ基準日からその日数進めた日付に変換
  7. カレンダーに表示する値の配列に変換
    1. 日付の月が対象月の場合は日付の日
    2. 日付の月が対象月以外の場合は空

B4:H4に日~土の文字列を入力、B5に上記のカレンダーの数式を入力して表示される結果は以下です。

カレンダーを表示する数式の結果(B5:H9)
日付2021/2/1
123456
78910111213
14151617181920
21222324252627
28

日曜日の列の文字を赤色に土曜日の列の文字を青色にしています。

あとは条件付き書式でボーダーを設定するなど見た目を整えて完成です。