[ノンプログラミング: Excel] シートにカレンダーを作ろう!②(前月と翌月の日付も表示)
こんにちは! ゆーすけっちょです。
今回も前回に引き続き、Excelでカレンダーの作り方を紹介しようと思います。
< 前回の記事を読んでいない方のために >
カレンダーを作るといっても、ただ作表するのではなく、数式や関数を使って、西暦と月を入力するだけで日付部分が勝手に変わる便利なカレンダーを作ります。
一度カレンダーを作って、そこから応用もしていきます!
今回は、前回の記事 ”[ノンプログラミング: Excel] シートにカレンダーを作ろう!①(当月の日付のみ表示)”( https://note.com/skeccho/n/n1a672f8b3caf )と比べると物凄く簡単にできます。
どれぐらい簡単なのかというと、日付部分に使う関数は2種類のみ。
他には条件付き書式で1種類だけです。
記事の最後で、自分で作るのは面倒という方の為に僕が作ったカレンダーをダウンロードすることもできます。
では、始めます!
< 基本要件 >
・西暦と月以外は入力しない
・カレンダーの日付部分以外で、計算するためのセルやシートは使わない
・できれば、当月の日付だけが表示されたカレンダー①と前月や翌月の
日付が表示されたカレンダー②の2種類欲しい(今回は②を説明します。
前回の記事で①を説明しました。)
以上、3つの要件をクリアしたいと思います
<追加要件>
・前月と翌月の日付は区別できるように色を変えたい
今回は、前月と翌月の日付もカレンダーに含まれるので、区別できるようにしたいと思います。
< カレンダーの法則 >
(1)ひと月の日数は最低で28日間(ちょうど4週間)あり、1日が
日曜から始まるとちょうど4週の枠で納まる。
(2)1週間の始まりを何曜日で区切ろうが、最大で6週にまたがる月が
発生する
< 作成開始
(前月と翌月の日付も表示されたカレンダー) >
→ Step.1 →
まず、カレンダーの大枠から作ります
西暦、月、曜日、日付表示部分を作成します。
日付表示部分は”< カレンダーの法則 >(2)” の事から6週分の枠を下の画像のように作成します。
※これをベースに話を進めていきます
→ Step.2 →
次に数式や関数を入れていくわけですが、関数を必要とするのは、1週目の日曜(左上)の1箇所だけです。
まず、考え方ですが、何月でも良いので1日が何曜日か?を求めるときにWEEKDAY関数を使用します。
WEEKDAY関数は、引数に与えた日付から曜日の番号を返してくれます。
WEEKDAY関数に
日曜日の日付を与えると → 1
月曜日の日付を与えると → 2
火曜日の日付を与えると → 3
水曜日の日付を与えると → 4
木曜日の日付を与えると → 5
金曜日の日付を与えると → 6
土曜日の日付を与えると → 7
・・・のように返してくれます。
これを利用します。
今回のカレンダーでは、1週目の日曜から日付を表示させるので、日曜の曜日番号に着目します。
日曜の曜日番号をWEEKDAY関数で求めると 1 が返ってくることから、当月の1日が何曜日であっても日曜の曜日番号を求めるためにはどう計算したら良いか?という事です。
まず、仮に1日が”水曜”だとすれば、曜日番号は 4 です。
この4から日曜の曜日番号 1 を求めるためには 4から3を引きます。
これを各曜日に当てはめて考えていくと、
1日が日曜(曜日番号: 1)で、日曜(曜日番号: 1)を求めるには、1=1ー0
1日が月曜(曜日番号: 2)で、日曜(曜日番号: 1)を求めるには、1=2ー1
1日が火曜(曜日番号: 3)で、日曜(曜日番号: 1)を求めるには、1=3ー2
1日が水曜(曜日番号: 4)で、日曜(曜日番号: 1)を求めるには、1=4ー3
1日が木曜(曜日番号: 5)で、日曜(曜日番号: 1)を求めるには、1=5ー4
1日が金曜(曜日番号: 6)で、日曜(曜日番号: 1)を求めるには、1=6ー5
1日が土曜(曜日番号: 7)で、日曜(曜日番号: 1)を求めるには、1=7ー6
・・・となります。
つまり、曜日番号から(曜日番号-1)を引いてあげれば日曜の曜日番号が求められるという事です。
それを日付に変えて計算します。
2020年2月1日を例にすると、2020年2月1日は土曜です。
曜日番号は 7 ですので、その週の日曜の日付を求めるためには、
2020年2月1日から(7ー1)つまり6を引きます。
すると2020年2月1日の6日前は2020年1月26日(日曜)であることがわかります。
この事からカレンダー1週目の日曜は2020年1月26日にすれば良いのです。
これを具体的に数式へ落とし込んで計算します。
数式で使用する関数は、
・DATE関数
・WEEKDAY関数
の2つです。
組み立てると、
DATE関数で1日の日付(シリアル値)を求め、そこから1日の曜日番号
から1を引いた数を引く
ということになり、関数で書き表すと
=DATE( 西暦, 月, 1 ) - ( WEEKDAY( DATE( 西暦, 月, 1 )) - 1)
となります。
上記の事から1週目の日曜(セル[B9])には、
=DATE($C$4,$F$4,1)-(WEEKDAY(DATE($C$4,$F$4,1))-1)
と入力します。(画像参照 ↓)
→ Step.3 →
残りのセルは、左隣又は前日の日付を参照して1を加算するだけです。
はい、これで重要な部分は半分終わりました。
→ Step.4 →
今回のカレンダーでは、当月日付のみ表示するのとは違い、見た目を整えることが重要となります。
なぜかと言うと、前月や翌月の日付をそのままにしておくと、カレンダー全体が見づらく、いつからいつまでが当月なのかがわかりません。
ですので、残りの重要な部分は体裁を整えることになります。
では、どの部分の体裁を整えるのかというと、
① 日付の表示を ”日を表す数字” のみにする
② 前月と翌月の日付の色を変える
・・・です。
それでは、順に体裁を整えていきます。
① 日付の表示を ”日を表す数字” のみにする
日付の”〇日”の数字のみにする場合は、カレンダーの日付部分を範囲選択し、右クリックー[セルの書式設定] ー [表示形式] ー [分類(C): ]から”ユーザー定義”を選択します。
種類(T): に何か表示されていると思いますが、それを一旦消去し、
d;
と入力して、[OK]を押下します。
すると5桁の日付シリアル値が表示されていましたが、日を表す数字だけ表示されたと思います。
② 前月と翌月の日付の色を変える
日付を当月とそれ以外で区別するために前月と翌月の日付を淡色に変更します。
見た目だけ変えればよいので、”条件付き書式” を使います。
まず、1週目から6週目の日付を範囲選択します。
そして、Excelの[ホーム]タブから[条件付き書式∨]をプルダウンします。
[新しい書式ルール(N)...]を選択すると、新しい書式ルールウィンドウが開きます。
そして、"ルールの種類を選択して下さい(S): "の中から[→数式を使用して、書式設定するセルを決定]を選択します。
"次の数式を満たす場合に値を書式設定(O): " の下に何か入力するボックスがありますが、そこに条件を数式で記述します、
条件付き書式を使う目的として、”当月以外の日付の色を変えたい” ので、セルの日付シリアル値を見て当月かどうかを判断させなければなりません。
日付シリアル値から月を取得するには、MONTH関数またはTEXT関数を使用します。
当月の基準となるのが、カレンダーの上側に入力されている西暦と月になりますが、カレンダーの法則として1週目の土曜から4週目の土曜には必ず日付が入るので、1週目の土曜から4週目の土曜のどれかを参照しても判断できます。
今回は、1週目の土曜は必ず日付が入るものとして、1週目の土曜を当月の基準とします。
そうすると、条件付き書式に入力する数式は以下のようになります。
=MONTH($H$9)<>MONTH(B9)
・・・です。
後は、作成する人によってフォント色を変えたり、セルの色を変えるようにします。
今回は、フォント色をグレーにしてみました。
これを適用すると、
このようになったかと思います。
もし、ならなかったという人は、条件付き書式を行う前の範囲選択のやり方を誤ったか、数式の右辺を絶対参照にしてしまったかのどちらかだと思います。
範囲選択は上の画像を例にするとB9~H14まで選択しますが、B9からではなく別のセルから選択した場合です。
条件付き書式で相対参照で数式を指定する場合、アクティブセル(セル範囲で一番最初に選択するセル、範囲選択した中の白い1つのセル)を起点に参照セルがズレていきます。
そうすると上で入力した数式、
=MONTH($H$9)<>MONTH(B9)
は、意図したとおりに機能しなくなってしまいます。
最後に軽く体裁を整えて終わります。
僕はシンプルにこのようなカレンダーにしました。(画像参照 ↓)
< 応用 >
前回の記事と同様に売上成績カレンダーを作ってみました。
売上データは別シートにあり、カレンダー側に数式を入れ、集計もさせるようにすれば、日別で売上の推移が一目瞭然です。
※ 上の画像では、明日以降の成績は表示されないようになっています。
(記事執筆時: 2020/3/4)
この記事で作成したカレンダーと応用として紹介した売上成績カレンダー、上で紹介していない日付の下を広げて書き込みできるスペースを設けたカレンダーをダウンロードできるようにしました。
ご自由にダウンロードして下さい。
以上、最後までご覧いただき、ありがとうございました!
記事の内容が良ければ ”スキ” をしてもらえると嬉しいです。
それじゃ、また ( 'ω' )ノ
この記事が気に入ったらサポートをしてみませんか?