【Excel】テンプレートのDaysAndWeeksなどを使ってカレンダーを作る

Excelには標準のカレンダーテンプレートがあり、非常にきれいな見た目でカレンダーを作成してくれます。

私は仕事で、Excelしか使えない(googleカレンダーがNGの職場)などではこのExcelカレンダーを予定管理に使用しています。

しかし、複数人の予定などを管理する際には、このExcelのカレンダーのフォーマットでは難しいので独自に作成する必要があります。

そんな時に、このExcel標準のカレンダーで使用している関数式を利用できたら楽だなと思い、関数式を解析してみることにしました。

DaysAndWeeks、カレンダーの年、WeekStartとは何か?

Excel標準カレンダーの関数式を見ると以下のような値が格納されています。

=DaysAndWeeks+DATE(カレンダーの年,12,1)-WEEKDAY(DATE(カレンダーの年,12,1),(WeekStart="月曜日")+1)+1

ここでWEEKDAYとDATEはExcelの関数なのですが、以下の3つは関数ではありません。

  • DaysAndWeeks
  • カレンダーの年
  • WeekStart

上記の3つは関数式ではないとすると何なのでしょうか?

結論を書くと、上記の3つは「名前」です。

Excelの関数式ではセルを参照する際に、「=A1」などとアドレスで指定をするのですが名前をつけることによって、その名前でセルを参照できるようになります。

「カレンダーの年」というのは、名前だとすぐに推測できたのですが、DaysAndWeeksというのは関数っぽい命名なのでパッと名前だとわかりにくいですね。

それぞれの定義について

DaysAndWeeksなどの名前について、Excelカレンダー上でどのように定義されているかを確認します。

カレンダーの年

カレンダーの年の設定値

カレンダーの年は、予定表の年セルにある値です。つまり2020といったような西暦が返却されます。

WEEKDAY

WEEKDAYの設定値

WEEKDAYは、予定表の週の始まりセルにある値です。この値はカレンダーの左端を何曜日にするか決めるのに使用されます。

DaysAndWeeks

DaysAndWeeksはシートの条に定義がないのでわかりにくいのですが、数式→名前の管理から確認をすることができます。

確認をするとDaysAndWeeksには以下のような値が格納されています。

DaysAndWeeksの設定値
={0,1,2,3,4,5,6} + {0;1;2;3;4;5}*7

これは1行に7日分のデータを返すために定義されている配列になります。


定義を移植して自作でカレンダーを作る

次に自分で作成したExcelに名前定義を移植して、関数式を使えるようにしていきます。

まずはシート上に、カレンダーの年、WeekStartを設定します。

シート上に、カレンダーの年、WeekStartを設定します

名前ボックスから値を設定できるので、西暦を入れたセルの名前を「カレンダーの年」、週の始まりを定義したセルを「WeekStart」に設定します。

次に数式→名前の管理から、DaysAndWeeksの名前を作成します。

DaysAndWeeksの名前は以下のように定義します。

DaysAndWeeksの名前は以下のように定義

次にワークシート上で1周目を記載したいセル(7個)を選択した状態で、1セル目に以下の式を設定します。

※カレンダーの年の次の引数(下記式で言うと12)は、カレンダーで表示したい月を指定します。この月の値も他セルを参照して定義にするようにすると便利かと思います。

=DaysAndWeeks+DATE(カレンダーの年,12,1)-WEEKDAY(DATE(カレンダーの年,12,1),(WeekStart="月曜日")+1)+1

配列数式にするので、ctrl キーと shift キーを押しながら enter キーを押して入力します。

すると7日分のデータがセルに表示されますが、標準の書式だと数値になってしまっているので日付に変換を行います。

セルの書式設定から日付を選択します。

↑これで1行分のデータを表示することができました。

そしてこれを5行分作成すれば、その月のカレンダーが作成できます。

2行目の式には以下のように、最後の引数を+1ではなく+8を指定します。

=DaysAndWeeks+DATE(カレンダーの年,12,1)-WEEKDAY(DATE(カレンダーの年,12,1),(WeekStart="月曜日")+1)+8


コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)