【Excel】Excel  でカレンダーを作ってみる

# はじめに
Excelでカレンダーを作る機会があったので，使いそうな機能をまとまてみる．主にこの記事で扱う機能は以下の通り．

- 年月を入力したらその日数を表示する
- 日付に対応した曜日を表示させる
- 土日に色を付ける
- 祝日，個人定義の祝日，振替休日に色を付ける

以上の実装はバージョンによっていくつか方法はあると思うので，あくまで参考程度に．
今回使用したのは以下のバージョン．

- Excel for Mac バージョン 16.13

# [Step1]年月を入力したらその月の日数を表示する
まずは新しいBookを作成して年月を入力するセル，その月の末日，日数を表示するセル，そして日付表示用のセルを準備します．日付は一番少なくても28日なので，28までは先に入力しておきます．
<img width="1451" alt="Excelカレンダー_1.png" src="https://qiita-image-store.s3.amazonaws.com/0/252806/5dd2ddd0-d392-7100-7256-e34e6cacb746.png">
次に末日の計算方法だが，Excelの<font color="Red">___DATE関数___</font>を使います．DATE関数とは以下のように(年/月/日)の値を入力，もしくはセルを選択してあげると日付の形式で表示してくれる関数．
<img width="1059" alt="Excelカレンダー_2.png" src="https://qiita-image-store.s3.amazonaws.com/0/252806/be27ad34-0d5c-55ba-e13b-4061a49d275f.png">
DATE関数を使ってどうやって末日を求めるかというと，___今月の末日は来月の1日の前の日___というのを利用します！下の通りです．
<img width="1059" alt="Excelカレンダー_3.png" src="https://qiita-image-store.s3.amazonaws.com/0/252806/d18ea153-0085-6156-50ce-ac6dcf1f78a0.png">
年は入力セルをそのままで，月のセルの値に1足してあげます．日にちは1日に固定して最後に一日引いてあげます．
ここで，12月だったら1を足して大丈夫なの？と思う方がいらっしゃるかもしれませんが，そこはExcelがうまくやってくれているので気にしなくていいです！

そして日にちだけ取り出したいときは新たに<font color="Red">___DAY関数___</font>を使い，さっきの日付を表示しているセルを選択してあげれば日数だけ取り出せました！
<img width="1059" alt="Excelカレンダー_4.png" src="https://qiita-image-store.s3.amazonaws.com/0/252806/2442aa88-e13b-ec75-f2b3-abe984152560.png">
ここまでで，年月や日付を選択しているときに一応絶対参照(行や列の前につけている$)しています．あまり意味はないです...
# [Step2]日数に応じて日付けを表示させる
次は日数に応じて29~31日を表示/日表示させます．ここでは<font color="Red">___IF関数___</font>を使います．これは___=IF(論理式,[式の値が真の場合], [式の値が偽の場合])___で表しています．ここで偽のときの値を入力しないと偽のときに####となってしまうので，空白' 'を入れておきましょう．
<img width="1440" alt="Excelカレンダー_5.png" src="https://qiita-image-store.s3.amazonaws.com/0/252806/bd811a99-7b77-8886-69fa-cfad149e5e51.png">
同様に30日のセルは___=IF(I3>=30,30," ")___，31日のセルは___=IF($I$3>=31,31," ")___で対応して表示させることができます．

# [Step3]日付に対応した曜日を表示させる
曜日の表示方法はいくつかあります．一番有名なのは___WEEKDAY関数___を使うものですが，ここでは表示形式を変更するものを紹介します．
<img width="1172" alt="Excelカレンダー_6.png" src="https://qiita-image-store.s3.amazonaws.com/0/252806/b81bfe5c-2885-f1ee-a896-69e8594eaa88.png">
曜日を表示したいセルに先ほど使ったDATE関数で日付を入力します．このままではもちろん日付形式が表示されますが，

<font color="Red">赤枠</font>で囲んでいる表示形式 → "その他の番号書式..." → "ユーザ定義"

で「___aaa___」としましょう．これで特定の日付の曜日を表示することができます！画像にあるように年月のセルを絶対参照，日にちのセルを行のみ絶対参照してコピーすれば一気に曜日も完成です．
<img width="728" alt="Excelカレンダー_7.png" src="https://qiita-image-store.s3.amazonaws.com/0/252806/a1a89291-9405-9782-4b73-702c6f51d951.png">
日にちと同様29~31日の表示/非表示はIF関数で設定してあげましょう．
<img width="1073" alt="Excelカレンダー_８.png" src="https://qiita-image-store.s3.amazonaws.com/0/252806/de1070de-37c8-881c-5ac5-bfe652c6836a.png">
表示形式は関数を使うよりも簡単で，他にも便利なものがたくさんあるので是非調べてみてください．

# [Step4]土日に色を付ける
ここでは先ほど少し紹介した<font color="Red">___WEEKDAY関数___</font>を使って色をつけたいと思います．WEEKDAY関数は日付に対応する1~7の数字を返すのですが，種類を空白にしておけば日曜=1,...,土曜=7になるはずなのでそれを使いましょう．
"条件付き書式"　→ "新しいルール" → "「スタイル」でクラシックを選択"　→ "数式を使用して，書式設定するセルを決定"
を選び，下のボックスに数式を入力すると条件を満たしたときに下の書式が適応されます．下の画像ではWEEKDAY(指定したセル)=1のとき，つまり日曜日のときにセルの背景を赤色にするという設定をしています．
<img width="1132" alt="Excelカレンダー_9.png" src="https://qiita-image-store.s3.amazonaws.com/0/252806/5a2e93eb-50b1-6c0e-b184-43cbd4c619d6.png">
<img width="617" alt="Excelカレンダー_10.png" src="https://qiita-image-store.s3.amazonaws.com/0/252806/46ed7fbc-1251-90f4-8b72-097bcb363130.png">
土曜日の背景を青色にするときは同様にWEEKDAY()=7としてあげましょう．ルールもセルの右下にカーソルを合わせてドラッグをするとコピーできるので，一気に全ての曜日に適応します．これで土日に色をつけるところまでできました．
<img width="1441" alt="Excelカレンダー_11.png" src="https://qiita-image-store.s3.amazonaws.com/0/252806/a221d595-2d8f-5eea-ee43-e885e011c687.png">

# [Step5]祝日，個人定義の祝日，振替休日に色を付ける
最後に祝日のセルの色の付け方です．前章で土日の色をつけたのでだいたいわかると思いますが，また新しくルールを作ります．ですが祝日を勝手に判断してくれる関数は残念ながらないので，別のシートにあらかじめ祝日(会社個別の祝日なども)まとめておく必要があります．そこだけ面倒ですね...
<img width="883" alt="Excelカレンダー_12.png" src="https://qiita-image-store.s3.amazonaws.com/0/252806/da495514-6355-9faf-9644-a17d88d6ddc7.png">
何度も出てきたDATE関数で年はSheet1のせるを絶対参照で選択，月日は手打ちです．春分の日と秋分の日は期間で決まっており，年を入力すれば分かるルールがあるわけでは無いので毎年チェックです！！最後に祝日を判別すルールを下に一気に載せちゃいます！

```
=COUNTIF(祝日!$B$2:$B$17,DATE($B$3,$D$3,B$6))=1
```
```
=AND(COUNTIF(祝日!$B$2:$B$17,DATE($B$3,$D$3,B$6)-1)=1,WEEKDAY(DATE($B$3,$D$3,B$6)-1)=1)=TRUE
```
<font color="Red">___COUNTIF関数___</font>は一つ目の引数の範囲に右の引数がある個数を教えてくれます．今だと祝日が被ることは無いので，その日が祝日かどうかは一つ目の式で分かるのです．そして<font color="Red">___AND関数___</font>は二つの引数(今回は二つの式)が共に真(条件が満たされているか)を判定します．振替休日は

- 前日が祝日
- 前日が日曜日

という二つが重なる時の月曜がお休みになるので，上の二つ目のような式になります("前日が祝日"かつ"その日が月曜日"でも同じです)．祝日の範囲は下の画像のようにドラッグで選択します．個別の祝日があるときもここに書き足して範囲選択すればOKです．
<img width="1322" alt="Excelカレンダー_13.png" src="https://qiita-image-store.s3.amazonaws.com/0/252806/4e2f9397-38b7-aee7-a145-21434c337713.png">


# 最後に
今回紹介した方法はあくまで一例なので間違いやもっといい方法があるかもしれません．参考程度にしていただけたら嬉しいです．