年間カレンダー作成(祝日パラメータシートを使わない方法)

原則としては「祝日パラメータシート方式」をお勧めします。
「祝日パラメータ」シートが使えないケースでは...   前ページの「祝日パラメータ」シートを使う方法は祝日、の変更が発生した時にVBAのソースコードを変更することなく対応できるということでお勧めしています。 また、ソースコードを見なくても「どのような祝日対応になっているか」が「祝日パラメータ」シートを見るだけで判別できるのも大きな利点です。
しかし、運用しているワークブックのシート構成が変更できない(「祝日パラメータ」シートが追加できない)場合や、 カレンダー処理で「祝日パラメータ」シートを参照するレスポンスも問題になるというようなことがあるかも知れません。

念のため説明しておきますが、連続してカレンダー処理を行なうようなケースでも、「祝日パラメータ」シートを参照するのは マクロブックの起動時か、その連続処理マクロの初回のカレンダー処理だけですから、 本ページで説明する「祝日パラメータシートを使わない方法」との違いは軽微なのです。

それでも「祝日パラメータシートを使わない方法」を選択したいという方のために できるだけ解りやすい方法で「祝日処理」を行なう方法をサンプルを添えて説明します。
実は「祝日パラメータ」シートから祝日情報をVBAの内部テーブルに読み込むのと同じレベルの処理を用意しています。 VBAの内部テーブルに祝日情報が読み込まれた後の各処理は「祝日パラメータシート方式」と全く変わらないのです。

どうしても「祝日パラメータ」シートが使えないという環境で、VBAのソースコードが多少理解できるという方は、 このページの方法を参考にして下さい。

また、「祝日パラメータシート」でもソースコード上の処理でも、それぞれの祝日処理は個々のワークブックに埋め込まれてしまいます。 このこと自体に懸念を持たれる場合は次ページをご覧下さい。
動作は全く同じようにしてあります。

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

このページ先頭の「年間カレンダーの作成」とほぼ同様の画面です。違うのは「祝日パラメータ」シートがないのと、「祝日パラメータ更新日」の表示がなくなっています。 こちらの処理では「祝日パラメータテーブル」はマクロのソースコードの記述で作成するので、祝日の改訂はソースコードの改訂になるので「カレンダーVer」値だけで判定ができるため、 「祝日パラメータ更新日」は持たせていません。
2つのシートのボタンによる動作も全く同じです。

「祝日パラメータシート方式」との違いは?
実は、内部の「祝日パラメータテーブル」を作成してからの動作は全く同じなのです。
原理的に違うのは、内部の「祝日パラメータテーブル」を作成するのを、ワークシートの「祝日パラメータ」シートから読み込むか、 ソースコードの記述から作成するかの違いです。 私が所属する会社ではこの他にSQLServerデータベースに「祝日パラメータ」テーブルを用意して読み込んでいます。

但し、「祝日パラメータシート方式」はワークシートとのI/Oの失敗がありうることと、 「祝日パラメータシート」自体の登録状態のチェック工程があり、「読み込み済か」「チェック済か」という判定もあるため、 クラスの初期化と「祝日パラメータテーブル」の作成は分離させていました。

一方、このページで紹介する「祝日パラメータシートを使わない方式」はワークシートの読み込み・チェックというものがないので、 クラスの初期化時点で「祝日パラメータテーブル」の作成を行なってしまいます。 ですから「読み込み済か」「チェック済か」という判定もありません。

この機能を利用中のワークブックでこれらを利用するためには、プロジェクトに以下のものを持ち込んで下さい。

オブジェクト 用途等
modAboutCalendar2R クラスの初期化及び月間カレンダーテーブルのユーザー定義や公開プロシージャが収容されています。
clsAboutCalendar2R 実際のカレンダー作成の全機能が収容されているクラスです。利用者プログラムから呼び出すことも可能ですが、上記の「modAboutCalendar2R」が呼び出し部分を行なうようにしているので、 利用者プログラムは「祝日(休日)の変更」以外では意識しなくても良いようにしてあります。
※祝日変更の場合は最後の方のプロシージャの修正が必要です。
機能の呼び出し方については、本サンプルのソースコードを参考にして下さい。 シート上のボタンからの記述は該当シートモジュールに記述しています。

今回公開するモジュール(modAboutCalendar2R)の公開プロシージャは以下の7つです。
ワークシートのアクセスがないため処理失敗の対応がなくなり、全て戻り値なしのサブプロシージャになります。

プロシージャID 説明
GP_InitAboutCalendar カレンダー関連関数クラス初期化
[戻値]なし
[引数]なし
GP_GetCalendarTable1 カレンダーテーブル作成(当月1ヶ月用)
[戻値]なし
[引数]①年
         ②月
         ③カレンダーテーブルが返される
※カレンダー関連関数クラスが初期化済でない時は本処理から初期化される
GP_GetCalendarTable1R カレンダーテーブル作成(当月1ヶ月用)
[戻値]なし
[引数]①年
         ②月
         ③カレンダーテーブルが返される
※カレンダー関連関数クラスが初期化済であること(本処理内では判定しない)
GP_GetCalendarTable3 カレンダーテーブル作成(当月+前後の3ヶ月用)
[戻値]なし
[引数]①年
         ②月
         ③カレンダーテーブルが返される
         ④当月開始位置INDEXが返される(Option)
         ⑤当月終了位置INDEXが返される(Option)
※カレンダー関連関数クラスが初期化済でない時は本処理から初期化される
GP_GetCalendarTable3R カレンダーテーブル作成(当月+前後の3ヶ月用)
[戻値]なし
[引数]①年
         ②月
         ③カレンダーテーブルが返される
         ④当月開始位置INDEXが返される(Option)
         ⑤当月終了位置INDEXが返される(Option)
※カレンダー関連関数クラスが初期化済であること(本処理内では判定しない)
GP_SumEigyoNissu 営業日数算出(土日祝日を除外)
[戻値]なし
[引数]①期間開始日
         ②期間終了日
         ③営業日数が返される
         ④歴日数が返される(Option)
GP_SumEigyoBi 営業日数経過後営業日算出(土日祝日を除外)
[戻値]なし
[引数]①起算日
         ②経過営業日数(マイナス可)
         ③算出結果(営業日日付)が返される
GP_GetCalendarTable1R」「GP_GetCalendarTable3R」は「GP_GetCalendarTable1」「GP_GetCalendarTable3」と使用方法は全く変わりませんが、クラスが初期化済かの判定を行なわずにクラス側のプロシージャを呼び出すようになっています。 クラスの初期化処理である「GP_InitAboutCalendar」が確実に呼び出されて、以降に実行時エラー等が起きていないという時に使用して下さい。
一方、「GP_GetCalendarTable1」「GP_GetCalendarTable3」の方はクラス初期化が行なわれたかのフラグ判定を行なってから カレンダーを作成するようになっています。 この違いはIfステートメント1つだけなので、処理速度としてもほとんど違いませんが、 今回の年間カレンダー作成では「作成」ボタンのクリックからの処理の先頭でクラス初期化を行なってしまうので、 その後の指定年範囲×12ヶ月という連続したカレンダー作成は「GP_GetCalendarTable1R」の方を使用しています。

それではソースコードです。
では、「カレンダー関連呼び出しモジュール(modAboutCalendar2R)」のソ-スコードです。
上の表にある各プロシージャが並んでいます。祝日改正や会社休日によるソースコードの変更はこのモジュールではなく、 次の「clsAboutCalendar2R」の最後の方の「GP_MakeHoliParameter」プロシージャになります。

'***************************************************************************************************
'   カレンダー関連関数(クラス呼び出し部分)                      modAboutCalendar2R(Module)
'
'   作成者:井上治  URL:https://www.ne.jp/asahi/excel/inoue/ [Excelでお仕事!]
'***************************************************************************************************
'   ※カレンダー関連関数の主要部分はクラス(clsAboutCalendar2R)側に実装されている
'***************************************************************************************************
'変更日付 Rev  変更履歴内容------------------------------------------------------------------------>
'18/09/17(1.70)新規作成
'18/09/23(1.71)クラス初期化判定を行なわないプロシージャを追加(連続呼び出し用)
'***************************************************************************************************
Option Explicit
'===================================================================================================
' 祝日含むカレンダーテーブル用ユーザー定義(公開)
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 clsAboutCalendar2R     ' カレンダー関連関数クラス
Private g_blnInitAboutCalendar As Boolean           ' カレンダー関連関数クラス初期化判定
' [注]VBAではモジュール保持変数の「保持」は保証されない

'***************************************************************************************************
'   ■■■ 公開プロシージャ(Public) ■■■
'***************************************************************************************************
'* 処理名 :GP_InitAboutCalendar
'* 機能  :カレンダー関連関数クラス初期化
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数  :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2018年09月17日
'* 作成者 :井上 治
'* 更新日 :2018年09月23日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:初期化済みの場合はスキップされる
'***************************************************************************************************
Public Sub GP_InitAboutCalendar()
    '-----------------------------------------------------------------------------------------------
    ' 未初期化なら初期化を行なう
    If Not g_blnInitAboutCalendar Then
        ' カレンダー関連関数クラスを初期化(クラス側で祝日パラメータテーブルが作成される)
        Set g_clsAboutCalendar = New clsAboutCalendar2R
        g_blnInitAboutCalendar = True
    End If
End Sub

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

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

'***************************************************************************************************
'* 処理名 :GP_GetCalendarTable3
'* 機能  :カレンダーテーブル作成(当月+前後の3ヶ月用)
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数  :Arg1 = 年(Long)
'*      Arg2 = 月(Long)
'*      Arg3 = カレンダーテーブル(Array:Structure)         ※Ref参照
'*      Arg4 = カレンダーテーブル当月開始INDEX(Long)       ※Ref参照(Option)
'*      Arg5 = カレンダーテーブル当月終了INDEX(Long)       ※Ref参照(Option)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2018年09月17日
'* 作成者 :井上 治
'* 更新日 :2018年09月17日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:
'***************************************************************************************************
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)
    '-----------------------------------------------------------------------------------------------
    ' カレンダー関連関数クラス初期化
    Call GP_InitAboutCalendar
    ' カレンダーテーブル作成(当月+前後の3ヶ月用)
    Call g_clsAboutCalendar.GetCalendarTable3(lngYear, _
                                              lngMonth, _
                                              tblCalendar, _
                                              lngCurrStartIx, _
                                              lngCurrEndIx)
End Sub

'***************************************************************************************************
'* 処理名 :GP_GetCalendarTable3R
'* 機能  :カレンダーテーブル作成(当月+前後の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_GetCalendarTable3R(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

'***************************************************************************************************
'* 処理名 :GP_SumEigyoNissu
'* 機能  :営業日数算出(土日祝日を除外)
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数  :Arg1 = 期間開始日(Date)
'*      Arg2 = 期間終了日(Date)
'*      Arg3 = 営業日数(Long)                              ※Ref参照
'*      Arg4 = 歴日数(Long)                                ※Ref参照(Option)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2018年09月17日
'* 作成者 :井上 治
'* 更新日 :2018年09月17日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:開始日、終了日自体も営業日判断に適用される
'***************************************************************************************************
Public Sub GP_SumEigyoNissu(ByVal dteDateF As Date, _
                            ByVal dteDateT As Date, _
                            ByRef lngCntEigyo As Long, _
                            Optional ByRef lngCntReki As Long = 0)
    '-----------------------------------------------------------------------------------------------
    ' カレンダー関連関数クラス初期化
    Call GP_InitAboutCalendar
    ' 営業日数算出(土日祝日を除外)
    Call g_clsAboutCalendar.SumEigyoNissu(dteDateF, dteDateT, lngCntEigyo, lngCntReki)
End Sub

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

'----------------------------------------<< End of Source >>----------------------------------------

実際にカレンダー作成を行なっている部分をクラス側に移したため、このように非常にシンプルな記述になりました。
モジュール変数を見ても、公開と関係ない祝日パラメータテーブル等がクラス側に移動しており、カレンダー作成処理での理解が必要な範囲がこれだけだと解ります。

クラス(clsAboutCalendar2R)側は全てサブ処理群なので、利用に際して理解する必要はないのですが、 この最後の方に祝日パラメータテーブルを作成するプロシージャがあります。
祝日の変更や会社休日の追加などはこのプロシージャを変更する必要があるため、ここで説明しておきます。
他のプロシージャはここでは省略していますが、基本的には「祝日パラメータシート方式」と同じ記述です。 関心がある方は両方のソースコードを比べてみて下さい。

'***************************************************************************************************
'   カレンダー及び日付処理(祝日含む)関連関数クラス              clsAboutCalendar2R(Class)
'
'   ※本クラスの操作は全てカレンダー関連モジュール(modAboutCalendar2R)で行ないます
'   本モジュールは祝日パラメータテーブルを作成してその祝日情報を元にカレンダーテーブルを作成します
'   ※祝日法改正時は下の方にある「祝日パラメータテーブルの作成(GP_MakeHoliParameter)」の変更が必要です
'
'   作成者:井上治  URL:https://www.ne.jp/asahi/excel/inoue/ [Excelでお仕事!]
'***************************************************************************************************
'変更日付 Rev  変更履歴内容------------------------------------------------------------------------>
'18/02/07(1.00)新規作成
'18/02/08(1.10)カレンダーテーブルに振替区分(0=通常、1=振替休日を行なわない)を追加する対応
'18/02/08(1.10)「カレンダーテーブル作成(当月+前後の3ヶ月用)」を追加
'18/02/10(1.20)クラス化移行のため、本モジュールはユーザー定義のみとする
'18/02/18(1.30)動作改善のため再作成(クラス化は廃止)
'18/02/21(1.40)GetCalendarTable3に当月開始・終了INDEXを返す引数(Option)を追加
'18/02/21(1.40)名称変更(g_typCalendar2⇒g_typAboutCalendar2) ※他との重複対応
'18/02/28(1.50)会社休日適用時に会社休日が振替休日や国民の休日と重なる時は法制休日を優先させる対応
'18/03/07(1.51)1日が日曜日だと週数が2始まりになってしまう件を修正
'18/03/07(1.60)各関数にチェック処理をスキップするオプションを追加(事前チェックが済んでいる前提です)
'18/09/17(1.70)「週数」のカウント誤りを再修正
'18/09/17(1.70)祝日パラメータシートを使わない方式としてクラス化(チェック処理廃止⇒Subプロシージャ化)
'18/09/23(1.71)クラス初期化判定を行なわないプロシージャを追加(連続呼び出し用、クラス側変更無し)
'18/10/15(1.71)コード、コメント整理(バージョン値更新無し)
'18/10/23(1.72)祝日パラメータテーブル要素追加の引数INDEXを廃止する対応(内部Static変数に変更)
'18/12/08(1.73)新天皇即位の日(5/1)、即位礼正殿の儀(10/22)を2019年限定で追加(名称は暫定)
'19/12/22(1.74)春分の日・秋分の日算出の処理タイトルコメントの引数説明誤りを修正(処理変更無し)
'20/12/12(1.75)2021年五輪大会特別措置法による祝日変更対応
'***************************************************************************************************
Option Explicit
'===================================================================================================
'  ↓↓↓ バージョン値、バージョン更新日は本クラスの変更を行なう時に必ず更新すること ↓↓↓
Private Const g_cnsCalendarVersion As String = "1.75"           ' 本クラスのバージョン
Private Const g_cnsCalendarVerUpdDate As Date = #12/12/2019#   ' バージョン更新日
'  ↑↑↑ バージョン値、バージョン更新日は本クラスの変更を行なう時に必ず更新すること ↑↑↑
'===================================================================================================
Private Const g_cnsFuri As String = "(振替休日)"
Private Const g_cnsKyu2 As String = "国民の休日"
Private Const g_cnsKyu3 As String = "(会社休日)"
'---------------------------------------------------------------------------------------------------
' 祝日パラメータテーブル用ユーザー定義
Private Type g_typParamater
    Getsu As Long                                   ' 月
    SyoriKbn As Long                                ' 処理区分(0=固定日、1=HappyMonday、2=会社休日、9=特殊)
    Hiduke As Long                                  ' [固定日]日(Date型ではない)
    FurikaeKbn As Long                              ' [固定日]振替区分(0=通常、1=振替休日を行なわない)
    HmSyusu As Long                                 ' [HM]週数(第n週)
    HmYobi As Long                                  ' [HM]曜日(0=日、1=月、2=火~6=土)
    SyukuNm As String                               ' 祝日名
    StrYear As Long                                 ' 開始年(西暦)
    EndYear As Long                                 ' 終了年(西暦)
End Type
'---------------------------------------------------------------------------------------------------
' 祝日パラメータ月別配置テーブル用ユーザー定義
Private Type g_typParamMMPos
    StrIx As Long                                   ' 当月開始位置INDEX(祝日無しは-1)
    EndIx As Long                                   ' 当月終了位置INDEX(祝日無しは-1)
End Type
'---------------------------------------------------------------------------------------------------
' 振替休日・国民の休日判定対象テーブル用ユーザー定義
Private Type g_typFuriDIx
    CalIx As Long                                   ' カレンダーINDEX
    Syubetsu As Long                                ' 0=振替休日、1=国民の休日
End Type
'===================================================================================================
' 祝日パラメータテーブル(全件)
Private g_tblParamater() As g_typParamater          ' 祝日パラメータテーブル
'---------------------------------------------------------------------------------------------------
' 祝日パラメータ配置テーブル(このテーブルは月をINDEXとするため1オリジン)
Private g_tblParamMMPos(1 To 12) As g_typParamMMPos ' 祝日パラメータ月別配置テーブル

'***************************************************************************************************
'   ■■■ プロパティ(Friend) ■■■
'***************************************************************************************************
'   本クラスのバージョン(String)
'---------------------------------------------------------------------------------------------------
Friend Property Get Version() As String
    Version = g_cnsCalendarVersion
End Property

'===================================================================================================
'   バージョン更新日(Date)
'---------------------------------------------------------------------------------------------------
Friend Property Get VerUpdDate() As Date
    VerUpdDate = g_cnsCalendarVerUpdDate
End Property

                                             ・
                                             ・
                                          《中略》
                                             ・
                                             ・

'***************************************************************************************************
'* 処理名 :GP_MakeHoliParameter
'* 機能  :祝日パラメータテーブルの作成
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数  :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2018年09月17日
'* 作成者 :井上 治
'* 更新日 :2020年12月12日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:本プロシージャは祝日法改正時に変更が必要!!
'***************************************************************************************************
Private Sub GP_MakeHoliParameter()
    '-----------------------------------------------------------------------------------------------
    Dim lngIxTbl As Long                                            ' テーブルINDEX
    ' 祝日パラ月別範囲テーブルを一旦初期化
    For lngIxTbl = 1 To 12
        With g_tblParamMMPos(lngIxTbl)
            .StrIx = -1
            .EndIx = -1
        End With
    Next lngIxTbl
    ReDim g_tblParamater(0)
    '===============================================================================================
    ' ※各月で呼び出している「祝日パラメータテーブル要素追加(GP_ApendHoliParam)」については
    '  この次のプロシージャのタイトルコメントを参照して下さい
    '  DBやExcelシートから祝日パラメータを参照してテーブル作成する機能を代替しています。
    '===============================================================================================
    ' 1月
    '-----------------------------------------------------------------------------------------------
    ' 元旦(1日)
    Call GP_ApendHoliParam(1, 0, 1, 0, 0, 0, "元旦", 0, 9999)
    ' ※引数の説明     ↑ ↑ ↑ ↑ ↑ ↑ ↑   ↑ ↑
    '            │ │ │ │ │ │ │   │ └───⑨終了年
    '            │ │ │ │ │ │ │   └────⑧開始年
    '            │ │ │ │ │ │ └───────⑦祝日名
    '            │ │ │ │ │ └─────── ⑥[HappyMonday]曜日(1=月曜)
    '            │ │ │ │ └────────⑤[HappyMonday]第n週
    '            │ │ │ └──────── ④[固定日]振替有無(1=振休無し)
    '            │ │ └─────────③[固定日]日付(1~31)
    '            │ └───────── ②処理区分(0=固定日、1=HappyMonday、2=会社休日、9=特殊)
    '            └──────────①月(1~12)
    ' 成人の日(1999年までは15日固定)
    Call GP_ApendHoliParam(1, 0, 15, 0, 0, 0, "成人の日", 0, 1999)
    ' 成人の日(2000年以降は第2月曜日(HappyMonday))
    Call GP_ApendHoliParam(1, 1, 0, 0, 2, 1, "成人の日", 2000, 9999)
    '===============================================================================================
    ' 2月
    '-----------------------------------------------------------------------------------------------
    ' 建国記念の日(11日)
    Call GP_ApendHoliParam(2, 0, 11, 0, 0, 0, "建国記念の日", 1967, 9999)
    ' 天皇誕生日(23日、徳仁親王:2020年より)
    Call GP_ApendHoliParam(2, 0, 23, 0, 0, 0, "天皇誕生日", 2020, 9999)
    '===============================================================================================
    ' 3月
    '-----------------------------------------------------------------------------------------------
    ' 春分の日(※特殊計算)
    Call GP_ApendHoliParam(3, 9, 0, 0, 0, 0, "春分の日", 0, 9999)
    '===============================================================================================
    ' 4月
    '-----------------------------------------------------------------------------------------------
    ' 天皇誕生日(29日、昭和天皇~1988年)
    Call GP_ApendHoliParam(4, 0, 29, 0, 0, 0, "天皇誕生日", 0, 1988)
    ' みどりの日(29日、1989~2006年)
    Call GP_ApendHoliParam(4, 0, 29, 0, 0, 0, "みどりの日", 1989, 2006)
    ' 昭和の日(29日、2007年~)
    Call GP_ApendHoliParam(4, 0, 29, 0, 0, 0, "昭和の日", 2007, 9999)
    '===============================================================================================
    ' 5月
    '-----------------------------------------------------------------------------------------------
    ' 新天皇即位の日(1日、2019年のみ、名称は暫定)
    Call GP_ApendHoliParam(5, 0, 1, 0, 0, 0, "新天皇即位の日", 2019, 2019)
    ' 憲法記念日(3日)
    Call GP_ApendHoliParam(5, 0, 3, 0, 0, 0, "憲法記念日", 0, 9999)
    ' 国民の休日(4日、2006年までは翌日が子供の日なので飛び越しの振替休日は無し)
    Call GP_ApendHoliParam(5, 0, 4, 1, 0, 0, "国民の休日", 1986, 2006)
    ' みどりの日(4日、2007年~、日曜日なら5/6に振り替え)
    Call GP_ApendHoliParam(5, 0, 4, 0, 0, 0, "みどりの日", 2007, 9999)
    ' こどもの日(5日)
    Call GP_ApendHoliParam(5, 0, 5, 0, 0, 0, "こどもの日", 0, 9999)
    '===============================================================================================
    ' 6月
    '-----------------------------------------------------------------------------------------------
    ' ※祝日無し
    '===============================================================================================
    ' 7月
    '-----------------------------------------------------------------------------------------------
    ' 海の日(2002年までは20日固定)
    Call GP_ApendHoliParam(7, 0, 20, 0, 0, 0, "海の日", 1996, 2002)
    ' 海の日(2003~2019年は第3月曜日(HappyMonday))
    Call GP_ApendHoliParam(7, 1, 0, 0, 3, 1, "海の日", 2003, 2019)
    ' 海の日(2020年のみ東京五輪特別措置法で23日)
    Call GP_ApendHoliParam(7, 0, 23, 0, 0, 0, "海の日", 2020, 2020)
    ' 海の日(2021年のみ東京五輪特別措置法で22日)
    Call GP_ApendHoliParam(7, 0, 22, 0, 0, 0, "海の日", 2021, 2021)         ' ←2020/12/12追加
    ' 海の日(2021年以降は第3月曜日(HappyMonday))
    Call GP_ApendHoliParam(7, 1, 0, 0, 3, 1, "海の日", 2022, 9999)          ' ←2020/12/12変更
    ' スポーツの日(2020年のみ東京五輪特別措置法で24日、10月の「体育の日」の移動+名称変更)
    Call GP_ApendHoliParam(7, 0, 24, 0, 0, 0, "スポーツの日", 2020, 2020)
    ' スポーツの日(2021年のみ東京五輪特別措置法で24日、10月の「体育の日」の移動+名称変更)
    Call GP_ApendHoliParam(7, 0, 23, 0, 0, 0, "スポーツの日", 2021, 2021)   ' ←2020/12/12追加
    '===============================================================================================
    ' 8月
    '-----------------------------------------------------------------------------------------------
    ' 山の日(11日)
    Call GP_ApendHoliParam(8, 0, 11, 0, 0, 0, "山の日", 2016, 2019)
    ' 山の日(2020年のみ東京五輪特別措置法で10日)
    Call GP_ApendHoliParam(8, 0, 10, 0, 0, 0, "山の日", 2020, 2020)
    ' 山の日(2021年のみ東京五輪特別措置法で8日)
    Call GP_ApendHoliParam(8, 0, 8, 0, 0, 0, "山の日", 2021, 2021)          ' ←2020/12/12追加
    ' 山の日(11日)
    Call GP_ApendHoliParam(8, 0, 11, 0, 0, 0, "山の日", 2022, 9999)         ' ←2020/12/12変更
    '===============================================================================================
    ' 9月
    '-----------------------------------------------------------------------------------------------
    ' 敬老の日(2002年までは15日固定)
    Call GP_ApendHoliParam(9, 0, 15, 0, 0, 0, "敬老の日", 0, 2002)
    ' 敬老の日(2003年以降は第3月曜日(HappyMonday))
    Call GP_ApendHoliParam(9, 1, 0, 0, 3, 1, "敬老の日", 2003, 9999)
    ' 秋分の日(※特殊計算)
    Call GP_ApendHoliParam(9, 9, 0, 0, 0, 0, "秋分の日", 0, 9999)
    '===============================================================================================
    ' 10月
    '-----------------------------------------------------------------------------------------------
    ' 体育の日(1999年までは10日固定)
    Call GP_ApendHoliParam(10, 0, 10, 0, 0, 0, "体育の日", 1966, 1999)
    ' 体育の日(2000年以降は第2月曜日(HappyMonday))
    Call GP_ApendHoliParam(10, 1, 0, 0, 2, 1, "体育の日", 2000, 2019)
    ' スポーツの日(名称変更(旧「体育の日」)、2020,2021年は特別措置法で7月に移動)
    Call GP_ApendHoliParam(10, 1, 0, 0, 2, 1, "スポーツの日", 2022, 9999)   ' ←2020/12/12変更
    ' 即位礼正殿の儀(22日、2019年のみ、名称は暫定)
    Call GP_ApendHoliParam(10, 0, 22, 0, 0, 0, "即位礼正殿の儀", 2019, 2019)
    '===============================================================================================
    ' 11月
    '-----------------------------------------------------------------------------------------------
    ' 文化の日(11日)
    Call GP_ApendHoliParam(11, 0, 3, 0, 0, 0, "文化の日", 0, 9999)
    ' 勤労感謝の日(23日)
    Call GP_ApendHoliParam(11, 0, 23, 0, 0, 0, "勤労感謝の日", 0, 9999)
    '===============================================================================================
    ' 12月
    '-----------------------------------------------------------------------------------------------
    ' 天皇誕生日(23日、平成天皇(明仁親王)~2018年)
    Call GP_ApendHoliParam(12, 0, 23, 0, 0, 0, "天皇誕生日", 1989, 2018)
End Sub

'***************************************************************************************************
'* 処理名 :GP_ApendHoliParam
'* 機能  :祝日パラメータテーブル要素追加
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数  :Arg1 = 月(Long)
'*      Arg2 = 処理区分(Long)              ※0=固定日、1=HappyMonday、2=会社休日、9=特殊
'*      Arg3 = [固定日]日(Long)
'*      Arg4 = [固定日]振替区分(Long)      ※0=通常、1=振替休日を行なわない
'*      Arg5 = [HM]週数(Long)              ※第n週
'*      Arg6 = [HM]曜日(Long)              ※0=日、1=月、2=火~6=土
'*      Arg7 = 祝日名(String)
'*      Arg8 = 開始年(西暦)(Long)
'*      Arg9 = 終了年(西暦)(Long)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2018年09月17日
'* 作成者 :井上 治
'* 更新日 :2018年10月23日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:テーブルINDEXは本処理側で加算されます
'***************************************************************************************************
Private Sub GP_ApendHoliParam(ByVal lngGetsu As Long, _
                              ByVal lngSyoriKbn As Long, _
                              ByVal lngHiduke As Long, _
                              ByVal lngFurikaeKbn As Long, _
                              ByVal lngHmSyusu As Long, _
                              ByVal lngHmYobi As Long, _
                              ByVal strSyukuNm As String, _
                              ByVal lngStrYear As Long, _
                              ByVal lngEndYear As Long)
    '-----------------------------------------------------------------------------------------------
    Static lngIxTbl As Long                                         ' テーブルINDEX
    ReDim Preserve g_tblParamater(lngIxTbl)
    ' 祝日パラ月別範囲テーブルを更新
    With g_tblParamMMPos(lngGetsu)
        ' 開始位置
        If .StrIx < 0 Then .StrIx = lngIxTbl
        .EndIx = lngIxTbl
    End With
    ' 祝日パラメータテーブル要素追加
    With g_tblParamater(lngIxTbl)
        .Getsu = lngGetsu
        .SyoriKbn = lngSyoriKbn
        .Hiduke = lngHiduke
        .FurikaeKbn = lngFurikaeKbn
        .HmSyusu = lngHmSyusu
        .HmYobi = lngHmYobi
        .SyukuNm = strSyukuNm
        .StrYear = lngStrYear
        .EndYear = lngEndYear
    End With
    ' テーブルINDEXを加算
    lngIxTbl = lngIxTbl + 1
End Sub

'----------------------------------------<< End of Source >>----------------------------------------
ここで説明するのは、祝日パラメータテーブルの作成部分です。
このページの前半の「祝日パラメータ」シートから読み込む方法であっても、ここでのソースコード上で作成する方法であっても作成される祝日パラメータテーブルは全く同一です。 また、祝日パラメータテーブルはカレンダー作成の処理において、途中で改変されることがないので、モジュールレベルで保持されている限りは処理の先頭で1回作成すればそれで良いことになります。

ここに提示している2つのプロシージャが実際に祝日パラメータテーブルを作成しているプロシージャで、最後の「祝日パラメータテーブル要素追加(GP_ApendHoliParam)」は 個々の祝日パラメータをテーブル追加するための共通サブ処理なので、実際に理解していただくのは「祝日パラメータテーブルの作成(GP_MakeHoliParameter)」になります。

「祝日パラメータテーブルの作成(GP_MakeHoliParameter)」のソースコードを見ていただければ判るように、 「祝日パラメータテーブル要素追加(GP_ApendHoliParam)」に対して、「祝日パラメータ」シートのA~I列の値を同じように引数に並べているだけです。
ここでは何の判断記述もないので祝日の変更が発生しても、「祝日パラメータ」シートと同じ感覚で修正できると思います。
元はと言えば、VBAに理解の薄い担当者でも祝日改正時の対応ができるようにというのが「祝日パラメータ」シートでの対応だったのですが、 「祝日パラメータ」シートの行数と同じ行数の記述で「祝日パラメータテーブル要素追加(GP_ApendHoliParam)」を呼び出す記述だけなので、 一方で「祝日パラメータ」シート方式の方で動作確認させれば祝日改正の対応もできると思います。
祝日の追加・変更の際は、月の昇順を守って記述して下さい。

会社休日を祝日パラメータに追加する場合は?
会社休日を適用したサンプル「05_AboutCalendar2R(会社休日含例).xlsm」もダウンロードするファイルに同梱させてあります。
会社休日を追加する場合の変更部分は「カレンダー関連関数クラス(clsAboutCalendar2R)」の最後から2番目の 「祝日パラメータテーブルの作成(GP_MakeHoliParameter)」プロシージャです。
サンプルでは年末年始各3日を固定で休日(振替無し)にしています。 その部分(1月と12)を抜粋して紹介します。 1月1日(元旦)は元々祝日なのでこれ以外の5日分を「#######」で囲われた部分で追加しています。

'***************************************************************************************************
'* 処理名 :GP_MakeHoliParameter
'* 機能  :祝日パラメータテーブルの作成
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数  :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2018年09月17日
'* 作成者 :井上 治
'* 更新日 :2018年10月23日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:本プロシージャは祝日法改正時に変更が必要!!
'***************************************************************************************************
Private Sub GP_MakeHoliParameter()

                                             ・
                                             ・
                                          《中略》
                                             ・
                                             ・

    '===============================================================================================
    ' 1月
    '-----------------------------------------------------------------------------------------------
    ' 元旦(1日)
    Call GP_ApendHoliParam(1, 0, 1, 0, 0, 0, "元旦", 0, 9999)
    ' ※引数の説明     ↑ ↑ ↑ ↑ ↑ ↑ ↑   ↑ ↑
    '            │ │ │ │ │ │ │   │ └───⑨終了年
    '            │ │ │ │ │ │ │   └────⑧開始年
    '            │ │ │ │ │ │ └───────⑦祝日名
    '            │ │ │ │ │ └─────── ⑥[HappyMonday]曜日(1=月曜)
    '            │ │ │ │ └────────⑤[HappyMonday]第n週
    '            │ │ │ └──────── ④[固定日]振替有無(1=振休無し)
    '            │ │ └─────────③[固定日]日付(1~31)
    '            │ └───────── ②処理区分(0=固定日、1=HappyMonday、2=会社休日、9=特殊)
    '            └──────────①月(1~12)
    '###############################################################################################
    '   ↓↓↓ ※1/1~1/3、12/29~12/31が会社休日の例 ↓↓↓
    Call GP_ApendHoliParam(1, 2, 2, 1, 0, 0, g_cnsKyu3, 0, 9999) ' 1月2日
    Call GP_ApendHoliParam(1, 2, 3, 1, 0, 0, g_cnsKyu3, 0, 9999) ' 1月3日
    '   ↑↑↑ ※1/1~1/3、12/29~12/31が会社休日の例 ↑↑↑
    '###############################################################################################
    ' 成人の日(1999年までは15日固定)
    Call GP_ApendHoliParam(1, 0, 15, 0, 0, 0, "成人の日", 0, 1999)
    ' 成人の日(2000年以降は第2月曜日(HappyMonday))
    Call GP_ApendHoliParam(1, 1, 0, 0, 2, 1, "成人の日", 2000, 9999)

                                             ・
                                             ・
                                          《中略》
                                             ・
                                             ・

    '===============================================================================================
    ' 12月
    '-----------------------------------------------------------------------------------------------
    ' 天皇誕生日(23日、平成天皇(明仁親王)~2018年)
    Call GP_ApendHoliParam(12, 0, 23, 0, 0, 0, "天皇誕生日", 1989, 2018)
    '###############################################################################################
    '   ↓↓↓ ※1/1~1/3、12/29~12/31が会社休日の例 ↓↓↓
    Call GP_ApendHoliParam(12, 2, 29, 1, 0, 0, g_cnsKyu3, 0, 9999) ' 12月29日
    Call GP_ApendHoliParam(12, 2, 30, 1, 0, 0, g_cnsKyu3, 0, 9999) ' 12月30日
    Call GP_ApendHoliParam(12, 2, 31, 1, 0, 0, g_cnsKyu3, 0, 9999) ' 12月31日
    '   ↑↑↑ ※1/1~1/3、12/29~12/31が会社休日の例 ↑↑↑
    '###############################################################################################
End Sub