[ノンプログラミング: Excel] シートにカレンダーを作ろう!①(当月の日付のみ表示)
こんにちは!ゆーすけっちょです。
今回は、Excelでカレンダーの作り方を紹介しようと思います。
カレンダーを作るといっても、ただ作表するのではなく、数式や関数を使って、西暦と月を入力するだけで日付部分が勝手に変わる便利なカレンダーを作ります。
一度カレンダーを作って、そこから応用もしていきます!
記事の最後で自分で作るのは面倒な方の為に僕が作ったカレンダーをダウンロードすることもできます。
では、始めます!
< 要件 >
・西暦と月以外は入力しない
・カレンダーの日付部分以外で、計算するためのセルやシートは使わない
・できれば、当月の日付だけが表示されたカレンダー①と前月や翌月の日付が表示されたカレンダー②の2種類欲しい(今回は①を説明します。次の記事で②を説明します。)
以上、3つの要件をクリアしたいと思います。
< カレンダーの法則 >
(1)ひと月の日数は最低で28日間(ちょうど4週間)あり、1日が
日曜から始まるとちょうど4週の枠で納まる。
(2)1週間の始まりを何曜日で区切ろうが、最大で6週にまたがる月が
発生する
< 作成開始(当月日付だけのカレンダー) >
→ Step.1 →
まず、カレンダーの大枠から作ります
西暦、月、曜日、日付表示部分を作成します。
日付表示部分は”< カレンダーの法則 >(2)” の事から6週分の枠を下の画像のように作成します。
※これをベースに話を進めていきます
→ Step.2 →
次に数式や関数を入れていくわけですが、1週目の日曜(左上)から数式を入れていきます。
まず、入力する前に頭の中で、”○○をする為には何の関数を使ったら良いか?” を見当を付けていきます。
【【 使えそうな関数の見当を付ける 】】
・西暦、月が別々のセルに情報としてあり、それを使って1日目の日付(シリアル値)を求めるためには・・・
→ DATE関数?
・日付(シリアル値)から曜日を判断するためには・・・
→ WEEKDAY関数?
・数式を入力するセルの曜日と1日(ついたち)の日付の曜日を一致させるためには・・・
→ IF関数? それとも CHOOSE関数?
・数式を入力するセルの左隣に日付が入っていれば、その翌日を表示させたい・・・
→ IF関数? それとも IFERROR関数?
どんな関数を使ったら良いか見当が付いたので、次にその関数にはどんな情報を与えれば良いのか? を考えていきます。
【【 関数に与える情報と組み立て 】】
1)1日目の日付(シリアル値)を求める
=DATE(西暦, 月, 1)
2)1日は何曜日(曜日番号は何)か?
=WEEKDAY(1日の日付)
3)入力するセルの曜日と1日の曜日は同じか?
もし、同じだったら1日の日付を表示させる。
違っていれば空欄にする。
=IF(入力するセルの曜日=CHOOSE(曜日番号,
"日", "月", "火", "水", "木", "金", "土"), 1日の日付, "")
4)左隣にセルが表示されていれば、その翌日の日付を表示させる。
=IF(左隣="", 何かの処理, 左隣+1)
または
=IFERROR(左隣+1, 何かの処理)
ここまで来れば、あとは1つずつ組み合わせていくだけです。
それでは、1週目の日曜(セル[B9])に数式を入れますが、セル[B9] は日付が入力されているか判断するためのセルが左隣や上に無いので、上述の1)~3)を組み立てて入力します。
セル[B9]に
=IF(B7=CHOOSE(WEEKDAY(DATE($C$4,$F$4,1)),"日","月","火","水","木","金","土"),DATE($C4,$F$4,1),"")
・・・と入力します。(画像参照 ↓ )
次は、セル[B9]に入力した数式を右隣のセル[C9]へコピーします。
セル[C9]の左隣にもし日付が表示されていればその翌日を返したいので、
”【【 関数に与える情報と組み立て 】】の 4)”のように
数式を以下のように修正します。
セル[C9](修正前)
=IF(C7=CHOOSE(WEEKDAY(DATE($C$4,$F$4,1)),"日","月","火","水","木","金","土"),DATE($C4,$F$4,1),"")
・・・これを
↓ ↓ ↓ ↓ ↓
セル[C9](修正後)
=IFERROR(B9+1,IF(C7=CHOOSE(WEEKDAY(DATE($C$4,$F$4,1)),"日","月","火","水","木","金","土"),DATE($C4,$F$4,1),""))
・・・に修正します。(画像参照↓)
「もし、左隣(セル[B9]) に1を足してエラーになったら、数式内の右(セルの曜日と1日が一致すれば日付を返す)を評価する」ということです。
IF文を使って、「もし、左隣(セル[B9]) が空白だったら、数式内の右(セルの曜日と1日が一致すれば日付を返す)を評価する」というように
=IF(B9="",IF(C7=CHOOSE(WEEKDAY(DATE($C$4,$F$4,1)),"日","月","火","水","木","金","土"),DATE($C$4,$F$4,1),""),B9+1)
・・・と入力しても構いません。
次に修正したセル[C9] をオートフィルで土曜までコピーします。
→ Step.3 →
次に2週目~4週目を入力します。
ここが最も簡単な部分です。
記事の上にも書いたカレンダーの法則より
< カレンダーの法則 >
(1)ひと月の日数は最低で28日間(ちょうど4週間)あり、1日が
日曜から始まるとちょうど4週の枠で納まる。
・・・の事を逆に考えると”4週目までは必ず日付が入る”ということになります。
ですので、2週目から4週目は、ただ前日の日付に1足して日付を表示するだけで良いのです。
セル[B10]には、
=H9+1
セル[C10]には、
=B10+1
・・・と入力します。
そして、セル[C10]をコピーして、セル[D10]からセル[H10 ]へ貼り付けます。
3週目、4週目は数式の構造が同じで良いので、2週目をコピーして貼り付けるだけです。
すると、このようになります。
→ Step.4 →
あと、もう少しです!
次に5週目~6週目を入力していきます。
5週目の日曜(セル[B13])は、1週目日曜から数えて29日目です。
2月でも4年に1度しか29日目はありませんので、2月が日曜始まりであっても5週目の日曜(29日目)以降は発生しない場合があります。
ですので、5週目の日曜(セル[B13])では4週目土曜(セル[H12])とその翌日が同じ月かどうかを比較し、同じ月であれば左隣の日付+1が表示されるような数式を入力します。
日付から月を求めるためには、
・MONTH関数
・TEXT関数
などで、求めることができます。
上記の条件を数式で組み立てると・・・
MONTH関数を使うと、
=IF(MONTH(4週目土曜)=MONTH(4週目土曜+1), 4週目土曜+1, "")
TEXT関数を使うと、
=IF(TEXT(4週目土曜, "m")=TEXT(4週目土曜+1, "m"), 4週目土曜+1, "")
という数式になると思います。
上述の数式では、空欄(””)を返すように記述しています。そうするとコピーして他のセルで使ったときに前のセルで空欄を返された場合に対処できません。
そこで、前のセルで空欄が返されていてもエラーにならないようにすらために数式を
=IF(4週目土曜日="", "", IF(MONTH(4週目土曜)=MONTH(4週目土曜+1), 4週目土曜+1, ""))
・・・このようにします。
そして、これをセルに具体的に入力します。
セル[B13]:
=IF(H12="","",IF(MONTH(H12)=MONTH(H12+1),H12+1,""))
・・・と入力します。(画像参照 ↓ )
これさえ入力できてしまえば、あとは5週目の他の曜日と6週目も同じように入力するだけです。
次に入力したセル[B13]を[C13]に貼り付けましょう。そして、セル[C13]の参照セルを変えます。
そうしたら、セル[C13]を[D13]から[H13]まで貼り付けます。
これで5週目は完成です。
あとの6週目は5週目と同じ数式でOKですので、5週目を6週目に貼り付けるだけです。
※ 2020年2月は6週目がありませんので、空欄のままになります。
これで、面倒な数式を入力する作業はお終いです。
→ Step.5 →
あとは、最後に自分の好みで体裁を整えるだけです。
日付部分については、日付のシリアル値が表示されていますので、セルの書式設定を変更します。
日付部分の表示書式は、”d;”と入力するだけで、日付の”日”部分だけ表示してくれます。(dayの略が "d" だと覚えておきましょう)
あと、西暦は4桁の数値、月は1~12の数値しか入力することがありませんので、入力規則でおかしな値が入力されないようにすると良いかもしれません。
シンプルですが、完成するとこのような形になります。↓
< 応用 >
応用として、売上成績カレンダーなんていうのも良いかもしれません。
売上データは別シートにあり、カレンダー側に数式を入れ、集計もさせるようにすれば、日別で売上の推移が一目瞭然です。
上で完成させたシンプルなカレンダーに行を挿入し、集計するための数式を当てはめるだけです。
用途としては無限大かもしれません。
これまで作成したカレンダーと応用として紹介した売上成績カレンダー、上で紹介していない日付の下を広げて書き込みできるスペースを設けたカレンダーをダウンロードできるようにしました。
ご自由にダウンロードして下さい。
以上、最後までご覧いただき、ありがとうございました!
記事の内容が良ければ ”スキ” をしてもらえると嬉しいです。
それじゃ、また ( 'ω' )ノ