「営業日数」の計算(ユーザー定義関数)

ある日付からある日付までの日数ですが、会社の休日を除いた日数を算出します。
社内では人事関係のデータベースにも携わっていました。 関連部署の仕事の中で意外に苦労していたのが、休職の人の「欠勤」にあたる日数(営業日数)の算出なのです。 私の会社は普通に土曜、日曜、祝日と年末年始が休みなので、休職の人のその期間の「営業日数」として会社休日を除いた日数を算出する必要があります。 休職の期間が歴月の1日から末日に特定されていれば各月の営業日数を予め計算しておくことで算出でき簡単なことなのですが、 実際の休職の期間はそのような日付ではなく個人ごとにバラバラなので、人数が少ないものの大変な作業のようです。
ここでは、マクロを使って「ユーザー定義関数」を作成することで解決できる例を提示してみます。
※このページのサンプルコードは12/29~1/3を会社休日にするサンプルになっています。「祝日パラメータ」シートをご覧下さい。
プログラム修正なく祝日の変更に対応できないか!?   以前のこのページの方法では、年間各月の祝日の判定はプログラムソース記述で行なっているのが現状でした。
2019~2021年では、平成天皇の退位や令和天皇の即位による「天皇誕生日」の移動、東京五輪特別措置法による祝日変更などで、祝日判定プログラムを変更する必要が発生しておりました。
であれば、このような祝日変更をプログラムの修正なく対応できないものか、と考えたのです。

春分の日、秋分の日は特殊な計算が必要ですが、それ以外の祝日はテーブル登録から計算できないかと考える時期が来ました。
そこで考えたのが「年間カレンダーの作成2」です。営業日数算出のプロシージャも含めてあります。
祝日の定義は「祝日パラメータ」シートで設定するようになっており、会社休日の追加も行なえるようになっています。
このページもこの方法を利用する方法に変更しています。
「ユーザー定義関数」とは作成したマクロを計算式上で関数利用するものです。
サンプルはこのような簡単なものです。(05_SumEigyoNissu1.xlsm)
このような簡単な表です。
(画像をクリックすると、このページのサンプルがダウンロードできます)
このように「期間開始日」「期間終了日」を入力して、「営業日数」を算出するというものです。(「歴日数」は単なる差し引きです)
ここで登場する「SUMEIGYONISSU2」がユーザー定義関数です。
本来なら「マクロ」なのでプログラムなのですが、このページの機能のままであれば改変せずに利用できます。

逆に起算日から営業日数後の判定営業日を算出する関数も用意してあります。
営業日数経過後の営業日
上の「営業日数の算出」では、期間開始日も営業日数計算に掛かりますが、「日数経過後の営業日の算出」では起算日は営業日数に関係なくゼロ扱いなので算出に加わりません。 このため「営業日数の算出」とは1日分の差異が発生します。
このように「SUMEIGYOBI2」を「ユーザー定義関数」として計算式中に埋め込んであります。

もう一つ、日付別に「営業日」かどうかを判定する関数を用意しています。
ここまで紹介したのは、日付と日付間での営業日数が何日なのかの算出でしたが、もう一つはカレンダーのように日付が整然と並んだ状態で「ある日が営業日なのかどうか」を判定する関数を紹介してみます。
この関数「CHECKEIGYOBI2」では、セットした日付が営業日なら「1」、そうでなければ「0」を返します。 ですから、この結果を並べていって期間に当たる範囲を合計すると、結果として「営業日数」にもなるわけです。
「営業日カレンダー」の画面
「日付」は先頭の日付(ここでは「2018/5/1」)だけを手入力するものとし、それ以降の日付や曜日などは全て計算式で求めています。
なお、この画面サンプルにはありませんが、ダウンロードしていただくサンプルではD列に「祝日名」を追加してあります。

「3ヶ月予定表」の画面
このような横型の予定表でも利用することができ、このサンプルでは隠れている1行目に「CHECKEIGYOBI2」関数をセットしていて、 縦に黄色く見えている休日を意味する塗りつぶしの条件付き書式でも参照させています。

「祝日パラメータ」シートです。
「祝日パラメータ」シート
祝日の判定をプログラムソースコードで行なわないということで、このような「祝日パラメータ」シートを取り入れています。 祝日の改変はこのシート上で行なって下さい。
なお、ここでの変更を他シートに反映されるためには再計算が必要になります。このシートは運用時は非表示で構いません。
この「祝日パラメータ」シートの設定項目や変更方法については「年間カレンダーの作成2(VBA応用)の中段の説明をご覧下さい。

この関数の使うための準備
カレンダー関連の処理を行なっているワークブックにこれらの機能を実装させるには、このサンプルから以下を持ち込んで下さい。
・「祝日パラメータ」シート
clsAboutCalendar2.cls(Class)
modAboutCalendar2.bas(Module)
modCalendarForFomula1.bas(Module)
なお、本カレンダー関連の計算式上での反映は再計算が必要です。
また、本機能のワークシート関数利用では「祝日パラメータ」シートのチェック及び並べ替えが行なわれないので、事前にチェック及び並べ替えを行なっておく必要があります。