はもちくわ

コードについて自分なりの解釈を書いてます。

【EXCEL】関数で万年業務カレンダー(日付固定)を作ってみる〜第3回〜前、翌営業日の計算(土日休みの場合)

全5回に渡って、下のような万年業務カレンダーをつくっていきます。

記事の構成は下のようになっています。内容が重なるものはサラッと書きますので、詳しく知りたい方は、過去回をご確認ください。

万年業務カレンダーの作成全5回

今回は、土日休みの場合の、前営業日、翌営業日の計算です。

このサンプルカレンダーには、日付を指定して予定を設定する箇所があります。会社規定なんかで日付が決まった業務って多分結構あるんじゃないですか?給料支給日なんかは典型的だと思います。
ただ、予定日が休業日に当たってしまって、営業日の前か後に予定変更になることってありますよね。これ、自分で実際にカレンダーをみて確認するよりも、自動で表示できたら便利じゃないですかっ!

そんなわけで、やっていきます!
でも、まあ、、、今回は土日のみの計算なので、正直、使いみちがないかもしれませんが、、、、お付き合いください!

さて、土日が休業日ということは、指定された日付が何曜日なのか?がわからないといけませんね。それを調べるのは言うもでも無く、WEEKDAY関数です。
サンプルカレンダーの形で該当日の曜日を関数で導き出すとすると、

このように指定すれば、該当日が月曜から何日ズレているかを調べることができます。
では、この関数から得られた結果(以後、戻り値)から判断できることと、求めたいものとの関係を図に表してみます。

こうしてみると、休みであることは「戻り値が6以上なら休み」という条件でいけることがわかります。それでは休みの時、前営業日を指定するにはどうすればいいでしょうか?
戻り値から考えてみます。
戻り値が6(土曜日)のときは−1日、7(日曜日)のときは−2日すれば前営業日になりますね。
それならば、それぞれについて、1つずつ条件分岐してと、、、、いやいや、翌営業日のことも考えなくてはなりませんし、できたら条件分岐や式は、ある程度まとめたいですね。

こんなときは、共通点や法則を探します。
6のときは1、7のときは2になればいいわけです。

いかがでしょうか?共通点見つかりましたか?

はい、そうです。どちらも戻り値から「5」を引くことで前営業日を指定できそうです。
この「5」はどこからきたのでしょうか??
ちょっと上の図を見てください。「5」は、前営業日「金曜日」の戻り値ですね。なんか、日付を移動することに関連がありそうじゃないですか!?(笑)

こうなると、翌営業日にも共通点があるかもしれません!一回考えてみましょう。
戻り値6(土曜日)のときは+2日、戻り値7(日曜日)のときは+1日すれば翌営業日を指定できます。こちらの共通点は、どちらも「8」から戻り値を引くと求めたい数になっています。
先程の図に当てはめると、翌営業日の「月曜日」は「8」です。
これは完全に関連がありますね!文面では前と翌営業日で、戻り値から引く、戻り値を引くで違って見えますが、マイナスなのかプラスなのかの違いを加味すると実は一緒です。

では、この共通性をWEEKDAY関数の戻り値を受けた式にまとめてみます。

今回の場合、休みの前か後ろかは、ユーザー判断で変わるものですから、結局、それに合わせて条件分岐をする必要があって、それぞれで数値を使います。上のように「結果曜日の数値」とまとめてますが、使いません(笑)
ですが、あとあと修正したり、見直したりすることを考えると、ある程度、式は同じ形にしておくと、見直しが少なくなりますので便利です。まあ、これしなくても動きますので、面倒なら条件の数だけ式書いちゃってもいいですけどね(笑)私の過去記事「関数だけで勤務時間表をつくってみる」では、結局、あるだけ条件並べて時間判断してますからね(笑)できる人はもっとまとめると思います。

で、この部分だけを式で表すと

これで営業日の前後によって結果が変わる式はできました。式をひとつにまとめたので、見た目もわかりやすくできましたね。
ただ、これだけでは、予定日が休みになっているかどうかの判定やその他の条件分岐がありません。なので、外側につけていきます。
長くなるので上の式を「営業日計算式」とまとめます。

=IF(M3="","",IF(OR(WEEKDAY(DATE($C$1,$E$1,M3),2)<6,N2=""),M3,「営業日計算式」))

【お詫びの追記 2023年4月27日】・WEEKDAY関数式の記述を間違えてましたので修正しました

この式については解説図をつけませんが、

  • 予定日の設定がなければ空白
  • 予定日が休みでない場合と前後の記載がない場合は予定日
  • 予定日が休みで前後の記載があるときは営業日を計算する

という3区分の条件分岐になりました。この判断式を表の右端セルO3に入れて使います。もちろん、そのまま表の終わりまで下方向にコピーしてくださいね。また、このまま使うと、予定日の前後の判定は、「前」以外、何か値をいれたらすべて翌営業日と判断されます。サンプルでは「後」「翌」どちらでいれてもいいように、そうしてますが、「翌」だけのほうがよければ少し条件分岐を工夫してください。ただ、、関数でだけで縛らなくても、「前・後」、「前・翌」どちらでもいいので入力してもらう場所自体に入力規制リストを使って縛ったほうが良さそうですけどね。

さあ、これで日付設定の表に日付と営業日の前か後を入れると、土日は除いた該当日付が表示されるようになりました。
第2回と同じく、この内容をカレンダーに予定を表示させるのは第5回でやります。第5回では、曜日設定と予定が被っても2つとも表示させられるようにします。

それでは今回はここまでです。読んで頂きありがとうございました。