年間カレンダーの作成2

「祝日情報を含めたカレンダーを」というリクエストは大変多いのです。
祝日判定をプログラムソースコード上で行なうことに危機感があります...   今までの方法では、前ページの「GP_GetHoliday_Sub」のように年間各月の祝日の判定はプログラムソース記述で行なっているのが現状でした。 2019~2021年では、平成天皇の退位や令和天皇の即位による「天皇誕生日」の移動、東京五輪特別措置法による祝日変更などで、祝日判定プログラムを変更する必要が発生しておりました。
であれば、このような祝日変更をプログラムの修正なく対応できないものか、と考えたのです。

春分の日、秋分の日は特殊な計算が必要ですが、それ以外の祝日はテーブル登録から計算できないかと考える時期が来ました。
そこで考えたのがこのページの方法です。厳密な処理速度は不利かも知れませんが、メンテナンス性では画期的なものかも知れません。
祝日判定に影響を受ける「営業日数計算」「営業日数経過後日付計算」も今回作成したプログラム(クラス)に含めており、 動作を検証するシートがサンプルにあるので確認して下さい。

祝日の判定方法が現在のように「固定日」か「ハッピィマンデー」であって、その中で日付が増えるとか変更になる範囲であれば、 プログラムソースコードの変更は不要で「祝日パラメータ」の変更だけで対応できます。 但し、例えば「週休2日が定着したので土曜日が祝日と重なったら振替休日が発生する」のような変更が起きた場合はこの限りではありません。

なお、そもそもの「祝日」についての定義は内閣府の説明があります。以下にリンクを置きます。
「国民の祝日」について(内閣府)

なお、このページを公開してから「シート構成が換えられない」など「祝日パラメータシート」は使いたくないというご意見もいただきましたので、「祝日パラメータ」をシートではなくソースコードで記述するサンプルを次ページに追加しています。

さらに「祝日パラメータ」を個々のワークブック内に盛り込まずに社内ネットワーク上で共有した場所で一元管理できるようにしたいというご意見もいただきましたので、外部ファイルから「祝日パラメータ」を読み込むサンプルをさらにその次ページに追加しています。

まず、サンプルの動作を見てみましょう。

年間カレンダー作成のイメージ
(画像をクリックすると、このページのサンプルがダウンロードできます)

今回のサンプルはA4版で印刷して「実用的」にご利用いただけるようなものにしてみました。
「年間カレンダー」シートではこのように「開始年」「終了年」が指定できるので、これを指定して「作成」ボタンをクリックして下さい。

作成した年間カレンダーのイメージ

例えば、20年くらいの期間を指定しても近年のPCなら数秒でカレンダーブックが作成されます。 カラープリンタに印刷していただければ実用的な年間カレンダーになると思います。
本来は「検証用」として作成しているものなので、ご利用の際は少なくとも既存年について正しくなっているのかを確認して下さい。

「営業日数関連」シートです。

「営業日数関連」シート

当サイトでは従来から祝日関連ロジックを公開していましたが、これらも当然ながら「祝日」の処理に影響されます。
この中には「日付間の営業日数算出」や「指定営業日数経過後の営業日算出」これらも新しい祝日計算に対応させて今回のサンプルに含めてあります。 ご利用の際はサンプルで算出結果を確認して下さい。

「祝日パラメータ」シートです。

「祝日パラメータ」シート

ここに「祝日パラメータ」というシートが見えると思います。これが今回の「本題」です。
「祝日パラメータ」はこのようになっています。祝日法が改正されたら、ここに行を追加するなどで対応できるわけです。
A列が「月」で月間カレンダーを作成するのに対応する祝日情報を照らし合わせるためのテーブルです。 同じ祝日でも年ごとに有効範囲が違ったり、祝日名が替わったり、固定日だったのがハッピィマンデーになったりするので、 それぞれに有効年期間を登録してあります。
例えば4月を見ていただくと、 1988年までは「天皇誕生日」、1989年~2006年は「みどりの日」、 2007年以降は「昭和の日」として名称の変更だけですがこのように設定されています。
7月の「海の日」は1996年に始まって、2002年までは「720日」に固定されていましたが、 2003年以降が「7月第3月曜日」のハッピィマンデーに変わったというのもこのように設定されてます。
さらに2020年と2021年は「東京五輪に関する祝日移動の特別措置法」の対応をおこなっていますので、「海の日」は2020年が23(固定日)2021年が22(固定日)となり、2022年以降は「7月第3月曜日」のハッピィマンデーに戻るという設定になっています。「スポーツの日」「山の日」も同様です。

「処理区分」など値が判りにくい項目は見出し行にコメントを設定しているので何の値がどのような意味か判るようになっていますがここで説明しておきます。

[処理区分]
意味 説明
0 固定日 日にちが固定されている祝日の区分です。「固定日時」の2項目を指定します。
1 ハッピーマンデー 「第n週月曜日」という指定を行なう区分です。「HM時」の2項目を指定します。
2 会社休日 区別のために値を設けていますが、動作は原則「固定日」と同じです。
但し、法制休日より優先されることはないようにしています。
9 特殊処理 「春分の日」「秋分の日」のための区分です。(特殊計算)


[振替(固定日)]
意味 説明
0 通常 該当日が日曜日と重なった時は以降の最初の平日が「振替休日」になる
1 振替無し 該当日が日曜日と重なっても他日を「振替休日」にしない


[曜日(HappyMonday)]
意味
0 日曜日
1 月曜日※
2 火曜日
3 水曜日
4 木曜日
5 金曜日
6 土曜日

※ハッピーマンデーは常に月曜日なのでこの値は「1」となります。
※開始年がよく判っていないものは「0」、終了年が決まっていないものは「9999」としています。

会社休日を「祝日パラメータ」の盛り込むには

「祝日パラメータ」シート

祝日テーブルの算出プロシージャのサンプルコードを提供し始めた当初から「会社休日の反映」に関する問合せをいただいていました。
以前はこれについても「祝日法改正」と同じことでプログラムソースコードを修正していただくことしかありませんでした。
ですが、今回の「祝日パラメータ」シートによる方式の変更によりプログラムソースコードの変更を行なわずにこれらに対応できるようになりました。
以前のサンプルでは「祝日パラメータ」シートはパスワード無しでシート保護していたので、保護を外してから変更して下さい。
また、月ごとの罫線は条件付き書式なので行の挿入を行なうと崩れることがあります。 行の挿入は行なわず、その下にあたるセル範囲をコピーして挿入する行数分下げた位置へ値貼り付けするようにして下さい。
並び順は基本的に「月日」の昇順として下さい。「月」の順に不正があると起動時にエラーになります。

ダウンロードしていただけるサンプルに中に「05_AboutCalendar1(会社休日含例).xlsm」があり、 これは、年末年始の12/29~1/3を会社休日として設定する例です。 「会社創立記念日」が休日だというような場合でも、このシートに設定を追加して対応することができるでしょう。

「元旦」は元々祝日なのでそのままですが、12/29~12/311/2~1/3を「会社休日」として追加しています。 「元旦」が日曜日と重なる年では1/2は「会社休日」ではなく「振替休日」になります。(法制休日優先としています)

「祝日パラメータ」シートのL1セルにこのシートの更新日付を持たせるようにしました。
サンプル内ではこの項目を参照する仕組みはありませんが、こういった仕組みを社内に配布すると、やがて「最新版」なのかを調べる必要が発生することになると思います。 この時、この「更新日付」が役立つと思います。
「更新日付」のチェックは運用側の担当者の目視の他、フォルダ内に同様のワークブックが多数あるなら、マクロを作成して一斉に調べるというような方法も採れます。

この「更新日付」は自動的には更新されません。「祝日パラメータ」シートを変更する際には必ず変更日をL1セルに登録するように運用して下さい。

それではソースコードです。
この機能を利用中のワークブックでこれらを利用するためには、以下のものを持ち込んで下さい。

オブジェクト 用途等
「祝日パラメータ」シート 上記のワークシートで、実行側ではこのシートは非表示にしておいて構いません。
modAboutCalendar2 月間カレンダーテーブルのユーザー定義や公開プロシージャ(起動部分)が収容されています。
clsAboutCalendar2 祝日パラメータテーブルや公開プロシージャ(実動作部分)を含む全機能が収容されています。
機能の呼び出し方については、本サンプルのソースコードを参考にして下さい。 シート上のボタンからの記述は該当シートモジュールに記述しています。

私は古くはCOBOL言語出身だったのでテーブルの「要素位置0」に馴染めなかった時期がありましたが、 それは最初の頃だけで、現在はそんなことはありません。 下記の関数で返される「カレンダーテーブル」は先頭要素位置は0であり、31日の内容が格納される位置は30となります。

今回公開するモジュール(modAboutCalendar2)の主要公開プロシージャは以下の4つです。

プロシージャID 説明
FP_InitAboutCalendar カレンダー関連関数クラス初期化
[戻値]処理結果(※祝日設定などで不備があると Falseが返る)
[引数]①チェック工程スキップ(Option)
          ②強制再初期化スイッチ(Option)
※クラスが生成され、祝日パラメータテーブルが作成される
※本処理は各カレンダー作成時に初期化済みかの確認で呼び出される他、
    ワークブックを開いた時と祝日パラメータシートからの戻り時にも呼び出すようにしています。
FP_GetCalendarTable1 カレンダーテーブル作成(当月1ヶ月用)
[戻値]処理結果(※祝日設定などで不備があると Falseが返る)
[引数]①年
         ②月
         ③カレンダーテーブルが返される
         ④チェック工程スキップ(Option)
※カレンダー関連関数クラスが初期化済でない時は本処理から初期化される
GP_GetCalendarTable1 カレンダーテーブル作成(当月1ヶ月用)
[戻値]※なし
[引数]①年
         ②月
         ③カレンダーテーブルが返される
※カレンダー関連関数クラスが初期化済であること(本処理内では判定しない)
FP_GetCalendarTable3 カレンダーテーブル作成(当月+前後の3ヶ月用)
[戻値]処理結果(※祝日設定などで不備があると Falseが返る)
[引数]①年
         ②月
         ③カレンダーテーブルが返される
         ④当月開始位置INDEXが返される(Option)
         ⑤当月終了位置INDEXが返される(Option)
         ⑥チェック工程スキップ(Option)
※カレンダー関連関数クラスが初期化済でない時は本処理から初期化される
GP_GetCalendarTable3 カレンダーテーブル作成(当月+前後の3ヶ月用)
[戻値]※なし
[引数]①年
         ②月
         ③カレンダーテーブルが返される
         ④当月開始位置INDEXが返される(Option)
         ⑤当月終了位置INDEXが返される(Option)
※カレンダー関連関数クラスが初期化済であること(本処理内では判定しない)
FP_SumEigyoNissu 営業日数算出(土日祝日を除外)
[戻値]処理結果(※祝日設定などで不備があると Falseが返る)
[引数]①期間開始日
         ②期間終了日
         ③営業日数が返される
         ④歴日数が返される(Option)
         ⑤チェック工程スキップ(Option)
※カレンダー関連関数クラスが初期化済でない時は本処理から初期化される
FP_SumEigyoBi 営業日数経過後営業日算出(土日祝日を除外)
[戻値]処理結果(※祝日設定などで不備があると Falseが返る)
[引数]①起算日
         ②経過営業日数(マイナス可)
         ③算出結果(営業日日付)が返される
         ④チェック工程スキップ(Option)
※カレンダー関連関数クラスが初期化済でない時は本処理から初期化される
「チェック工程スキップ」のオプションは、処理内部で行なっている「祝日パラメータ」シートのチェックと並べ替えの工程をスキップします。 「祝日パラメータ」シートが正しく登録されていて、月ごとの並べ替えも済んでいるという前提で「True」をセットして運用することができます。
「カレンダー関連関数クラス初期化(FP_InitAboutCalendar)」はWorkbook_Openで初回呼び出しを行なうようにすれば動作レスポンスが向上します。

では、「カレンダー関連モジュール(modAboutCalendar2)」のソ-スコードです。
先頭にある「g_typCalendar2」がカレンダーテーブルのユーザー定義となります。
利用者側でソースコードの改変は不要だと思いますので「公開プロシージャ」だけ見ていただければご利用には充分だと思います。
実際のカレンダー作成の詳細機能はクラス(clsAboutCalendar2)側に実装されていますが、全てこのモジュールから呼び出される構造なので クラス(clsAboutCalendar2)側の内容理解がなくても運用できるようになっています。

'***************************************************************************************************
'   カレンダー関連関数(クラス呼び出し部分)                      modAboutCalendar2(Module)
'
'   作成者:井上治  URL:https://www.ne.jp/asahi/excel/inoue/ [Excelでお仕事!]
'***************************************************************************************************
'   ※カレンダー関連関数の主要部分はクラス(clsAboutCalendar2)側に実装されている
'***************************************************************************************************
'変更日付 Rev  変更履歴内容------------------------------------------------------------------------>
'18/09/23(1.70)新規作成
'19/12/22(1.71)Option Private Moduleを追加
'22/05/20(1.72)FP_InitAboutCalendarに強制再初期化スイッチを追加(祝日パラメータ変更時即時更新対応)
'***************************************************************************************************
Option Explicit
Option Private Module
'===================================================================================================
Public Const g_cnsParaSheet As String = "祝日パラメータ"
'---------------------------------------------------------------------------------------------------
' 祝日含むカレンダーテーブル用ユーザー定義(公開)
Public Type g_typAboutCalendar2
    Hiduke As Date                                  ' 日付
    Yobi As Long                                    ' 曜日(0=日、1=月、2=火~6=土)
    Syusu As Long                                   ' 週数(1始まりで日曜日発見時に1加算)
    HmSyusu As Long                                 ' 週数(0始まりで月曜日発見時に1加算) ※祝日法(HM)対応
    Syuku As Long                                   ' 祝日判定(0=通常、1=祝日、2=振替休日、3=会社休日)
    SyukuNm As String                               ' 祝日名称
    FurikaeKbn As Long                              ' 振替区分(0=通常、1=振替休日を行なわない)
End Type
'---------------------------------------------------------------------------------------------------
' カレンダー関連関数クラス
Public g_clsAboutCalendar As clsAboutCalendar2      ' カレンダー関連関数クラス
Private g_blnInitAboutCalendar As Boolean           ' カレンダー関連関数クラス初期化判定
' [注]VBAではモジュール保持変数の「保持」は保証されない

'***************************************************************************************************
'   ■■■ 公開プロシージャ(Public) ■■■
'***************************************************************************************************
'* 処理名 :FP_InitAboutCalendar
'* 機能  :カレンダー関連関数クラス初期化
'---------------------------------------------------------------------------------------------------
'* 返り値 :処理成否(Boolean)
'* 引数  :Arg1 = チェック工程スキップ(Boolean)               ※Option
'*      Arg2 = 強制再初期化スイッチ(Boolean)               ※Option
'---------------------------------------------------------------------------------------------------
'* 作成日 :2018年09月23日
'* 作成者 :井上 治
'* 更新日 :2022年05月20日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:初期化済みの場合はスキップされる
'***************************************************************************************************
Public Function FP_InitAboutCalendar(Optional ByVal blnOmitCheck As Boolean = False, _
                                     Optional ByVal blnForcedInit As Boolean = False) As Boolean
    '-----------------------------------------------------------------------------------------------
    ' 強制再初期化判定
    If blnForcedInit Then
        g_blnInitAboutCalendar = False
    End If
    ' 未初期化なら初期化を行なう
    If Not g_blnInitAboutCalendar Then
        ' カレンダー関連関数クラスを初期化
        Set g_clsAboutCalendar = New clsAboutCalendar2
        ' 祝日パラメータテーブル作成
        g_blnInitAboutCalendar = g_clsAboutCalendar.MakeHoliParamater(blnOmitCheck)
    End If
    FP_InitAboutCalendar = g_blnInitAboutCalendar
End Function

'***************************************************************************************************
'* 処理名 :FP_GetCalendarTable1
'* 機能  :カレンダーテーブル作成(当月1ヶ月用)
'---------------------------------------------------------------------------------------------------
'* 返り値 :処理成否(Boolean)
'* 引数  :Arg1 = 年(Long)
'*      Arg2 = 月(Long)
'*      Arg3 = カレンダーテーブル(Array:Structure)         ※Ref参照
'*      Arg4 = チェック工程スキップ(Boolean)               ※Option
'---------------------------------------------------------------------------------------------------
'* 作成日 :2018年02月07日
'* 作成者 :井上 治
'* 更新日 :2018年09月23日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:
'***************************************************************************************************
Public Function FP_GetCalendarTable1(ByVal lngY As Long, _
                                     ByVal lngM As Long, _
                                     ByRef tblCalendar() As g_typAboutCalendar2, _
                                     Optional ByVal blnOmitCheck As Boolean = False) As Boolean
    '-----------------------------------------------------------------------------------------------
    ' カレンダー関連関数クラス初期化
    If Not FP_InitAboutCalendar(blnOmitCheck) Then
        FP_GetCalendarTable1 = False
        Exit Function
    End If
    ' カレンダーテーブル作成(当月分)
    Call g_clsAboutCalendar.GetCalendarTable1(lngY, lngM, tblCalendar)
    FP_GetCalendarTable1 = True
End Function

'***************************************************************************************************
'* 処理名 :GP_GetCalendarTable1
'* 機能  :カレンダーテーブル作成(当月1ヶ月用)
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数  :Arg1 = 年(Long)
'*      Arg2 = 月(Long)
'*      Arg3 = カレンダーテーブル(Array:Structure)         ※Ref参照
'---------------------------------------------------------------------------------------------------
'* 作成日 :2018年09月23日
'* 作成者 :井上 治
'* 更新日 :2018年09月23日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:カレンダー関連関数クラスが初期化済であること(本処理内では判定しない)
'***************************************************************************************************
Public Sub GP_GetCalendarTable1(ByVal lngY As Long, _
                                ByVal lngM As Long, _
                                ByRef tblCalendar() As g_typAboutCalendar2)
    '-----------------------------------------------------------------------------------------------
    ' カレンダーテーブル作成(当月分)
    Call g_clsAboutCalendar.GetCalendarTable1(lngY, lngM, tblCalendar)
End Sub

'***************************************************************************************************
'* 処理名 :FP_GetCalendarTable3
'* 機能  :カレンダーテーブル作成(当月+前後の3ヶ月用)
'---------------------------------------------------------------------------------------------------
'* 返り値 :処理成否(Boolean)
'* 引数  :Arg1 = 年(Long)
'*      Arg2 = 月(Long)
'*      Arg3 = カレンダーテーブル(Array:Structure)         ※Ref参照
'*      Arg4 = カレンダーテーブル当月開始INDEX(Long)       ※Ref参照(Option)
'*      Arg5 = カレンダーテーブル当月終了INDEX(Long)       ※Ref参照(Option)
'*      Arg6 = チェック工程スキップ(Boolean)               ※Option
'---------------------------------------------------------------------------------------------------
'* 作成日 :2018年02月08日
'* 作成者 :井上 治
'* 更新日 :2018年09月23日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:
'***************************************************************************************************
Public Function FP_GetCalendarTable3(ByVal lngYear As Long, _
                                     ByVal lngMonth As Long, _
                                     ByRef tblCalendar() As g_typAboutCalendar2, _
                                     Optional ByRef lngCurrStartIx As Long = -1, _
                                     Optional ByRef lngCurrEndIx As Long = -1, _
                                     Optional ByVal blnOmitCheck As Boolean = False) As Boolean
    '-----------------------------------------------------------------------------------------------
    ' カレンダー関連関数クラス初期化
    If Not FP_InitAboutCalendar(blnOmitCheck) Then
        FP_GetCalendarTable3 = False
        Exit Function
    End If
    ' カレンダーテーブル作成(当月+前後の3ヶ月用)
    Call g_clsAboutCalendar.GetCalendarTable3(lngYear, _
                                              lngMonth, _
                                              tblCalendar, _
                                              lngCurrStartIx, _
                                              lngCurrEndIx)
    FP_GetCalendarTable3 = True
End Function

'***************************************************************************************************
'* 処理名 :GP_GetCalendarTable3
'* 機能  :カレンダーテーブル作成(当月+前後の3ヶ月用)
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数  :Arg1 = 年(Long)
'*      Arg2 = 月(Long)
'*      Arg3 = カレンダーテーブル(Array:Structure)         ※Ref参照
'*      Arg4 = カレンダーテーブル当月開始INDEX(Long)       ※Ref参照(Option)
'*      Arg5 = カレンダーテーブル当月終了INDEX(Long)       ※Ref参照(Option)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2018年09月23日
'* 作成者 :井上 治
'* 更新日 :2018年09月23日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:カレンダー関連関数クラスが初期化済であること(本処理内では判定しない)
'***************************************************************************************************
Public Sub GP_GetCalendarTable3(ByVal lngYear As Long, _
                                ByVal lngMonth As Long, _
                                ByRef tblCalendar() As g_typAboutCalendar2, _
                                Optional ByRef lngCurrStartIx As Long = -1, _
                                Optional ByRef lngCurrEndIx As Long = -1)
    '-----------------------------------------------------------------------------------------------
    ' カレンダーテーブル作成(当月+前後の3ヶ月用)
    Call g_clsAboutCalendar.GetCalendarTable3(lngYear, _
                                              lngMonth, _
                                              tblCalendar, _
                                              lngCurrStartIx, _
                                              lngCurrEndIx)
End Sub

'***************************************************************************************************
'* 処理名 :FP_SumEigyoNissu
'* 機能  :営業日数算出(土日祝日を除外)
'---------------------------------------------------------------------------------------------------
'* 返り値 :処理成否(Boolean)
'* 引数  :Arg1 = 期間開始日(Date)
'*      Arg2 = 期間終了日(Date)
'*      Arg3 = 営業日数(Long)                              ※Ref参照
'*      Arg4 = 歴日数(Long)                                ※Ref参照(Option)
'*      Arg5 = チェック工程スキップ(Boolean)               ※Option
'---------------------------------------------------------------------------------------------------
'* 作成日 :2018年02月08日
'* 作成者 :井上 治
'* 更新日 :2018年09月23日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:開始日、終了日自体も営業日判断に適用される
'***************************************************************************************************
Public Function FP_SumEigyoNissu(ByVal dteDateF As Date, _
                                 ByVal dteDateT As Date, _
                                 ByRef lngCntEigyo As Long, _
                                 Optional ByRef lngCntReki As Long = 0, _
                                 Optional ByVal blnOmitCheck As Boolean = False) As Boolean
    '-----------------------------------------------------------------------------------------------
    ' カレンダー関連関数クラス初期化
    If Not FP_InitAboutCalendar(blnOmitCheck) Then
        FP_SumEigyoNissu = False
        Exit Function
    End If
    ' 営業日数算出(土日祝日を除外)
    Call g_clsAboutCalendar.SumEigyoNissu(dteDateF, dteDateT, lngCntEigyo, lngCntReki)
    FP_SumEigyoNissu = True
End Function

'***************************************************************************************************
'* 処理名 :FP_SumEigyoBi
'* 機能  :営業日数経過後営業日算出(土日祝日を除外)
'---------------------------------------------------------------------------------------------------
'* 返り値 :処理成否(Boolean)
'* 引数  :Arg1 = 起算日(Date)
'*      Arg2 = 経過営業日数(Long)                          ※±可能
'*      Arg3 = 営業日数経過後営業日(Date)                  ※Ref参照(Option)
'*      Arg4 = チェック工程スキップ(Boolean)               ※Option
'---------------------------------------------------------------------------------------------------
'* 作成日 :2018年02月08日
'* 作成者 :井上 治
'* 更新日 :2018年09月23日
'* 更新者 :井上 治
'* 機能説明:経過日数は翌日(翌営業日)を「1」として算出される(前営業日は「-1」)
'* 注意事項:経過日数がゼロの場合は起算日をそのまま返す(土日祝判断なし)
'***************************************************************************************************
Public Function FP_SumEigyoBi(ByVal dteDateF As Date, _
                              ByVal lngCntKeika As Long, _
                              ByRef dteDateT As Date, _
                              Optional ByVal blnOmitCheck As Boolean = False) As Boolean
    '-----------------------------------------------------------------------------------------------
    ' カレンダー関連関数クラス初期化
    If Not FP_InitAboutCalendar(blnOmitCheck) Then
        FP_SumEigyoBi = False
        Exit Function
    End If
    ' 営業日数経過後営業日算出(土日祝日を除外)
    Call g_clsAboutCalendar.SumEigyoBi(dteDateF, lngCntKeika, dteDateT)
    FP_SumEigyoBi = True
End Function

'----------------------------------------<< End of Source >>----------------------------------------
ここまでが主要公開プロシージャです。
実際にカレンダー作成を行なっている部分をクラス側に移したため、このように非常にシンプルな記述になりました。
モジュール変数を見ても、公開と関係ない祝日パラメータテーブル等がクラス側に移動しており、カレンダー作成処理での理解が必要な範囲がこれだけだと解ります。
この他にサポート用プロシージャがありますが「祝日パラメータシート」が正しく登録されていれば不要なものなのでここでの説明は省略します。
また「カレンダー関連関数クラス(clsAboutCalendar2)」についてご覧になりたい方は実ソースをご覧下さい。

「配布の問題」に関する配慮は必要です。   この問題はそもそもプログラムソース記述を改変して祝日の変更に対応していた段階と何も変わらないのですが、 このような機能を盛り込むプログラムを利用先の各現場に配布する場合、どこで「どのバージョンが」使用されているかを管理できていなければ意味がありません。 しかも、配布時点で台帳等に記載したとしても、配布先で「自由にコピーがバラ撒かれる」ことも考えに含める必要があるのです。
本当は今回の「祝日パラメータ」が利用会社の全社から参照できるような場所に配置されていて、均質な状態で動作されるのが望ましい状態なのです。 この点、Excelは単に安易に複製が作成されてバラ撒かれる「危険性」があることに充分に留意して下さい。
祝日のことでないても新しいものを作成して配布しても、気がつかないところで以前のもののコピーが平気で利用されていまうということです。