年間カレンダー作成

VBA応用」の「年間カレンダーの作成2」VB.NETでやってみます。
本題は祝日判定クラスの説明です。   Excelに年間カレンダーを出力させるサンプルですが、Excel出力自体は以前のページで説明しているので、 ここでの説明は祝日を含むカレンダー作成になります。
最初からExcelで動いているものではないので「祝日パラメータ」シートは持てないわけですから、 「年間カレンダー作成(祝日パラメータシートを使わない方法)VB.NET版ということになります。

まずはサンプルをご確認下さい。

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

画像をクリックしてZIPファイルを解凍するとプロジェクトフォルダが現われます。実行ファイル(EXE)はその中の 「\MakeYearyCalendar1\bin\x86\Release」にある「MakeYearyCalendar1.exe」です。
MakeYearyCalendar1.exe」と同じフォルダに「YearyCalendar1.xltx」が必要です。

操作は「年間カレンダーの作成2」と全く同じで「開始年」「終了年」を選択して「作成」ボタンをクリックするだけです。

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

数秒でこのようにExcel上に1年が1シートになってカレンダーが表示されます。

このページでは「カレンダー処理クラス(clsAboutCalendar2R)」について説明します。
ExcelVBAでは「祝日パラメータシート」を用いるものを「clsAboutCalendar2」、 ソースコードで祝日テーブルを作成するものを「clsAboutCalendar2R」としていたので、VB.NET版は末尾に「R」が付いたものとしています。
所属会社では祝日パラメータをデータベーステーブルから読み出すものも作成しており、これについては末尾に「DB」を付けたりしています。

ExcelVBAとは異なり、フォームの表示中はクラスの生死判定が不要なので、クラスの初期化(New)で祝日テーブルを作成し、以後はその祝日テーブルを利用してカレンダーを作成します。

公開プロシージャは以下の6つです。

プロシージャID 説明
GetCalendarTable1 カレンダーテーブル作成(当月1ヶ月用)
[戻値]なし
[引数]①年((Integer)
         ②月(Integer)
         ③カレンダーテーブル(Array:Structure)が返される
         ④営業日数(Option:Integer)が返される
GetCalendarTable3 カレンダーテーブル作成(当月+前後の3ヶ月用)
[戻値]なし
[引数]①年(Integer)
         ②月(Integer)
         ③当月開始位置INDEX(Integer)が返される
         ④当月終了位置INDEX(Integer)が返される
         ⑤カレンダーテーブル(Array:Structure)が返される
SumEigyoNissu 営業日数算出(土日祝日を除外)
[戻値]営業日数(Integer)
[引数]①期間開始日(Date)
         ②期間終了日(Date)
         ③歴日数(Option:Integer)が返される
SumEigyoBi 営業日数経過後営業日算出(土日祝日を除外)
[戻値]算出結果(営業日日付)
[引数]①起算日
         ②経過営業日数(Integer、マイナス可)
GetNoN_EigyoBi n営業日目の日付の取得
[戻値]算出した日付(Date)
[引数]①第n営業日目日数値(Integer、マイナス不可)
         ②カレンダーテーブル(Array:Structure)
         ③当月開始位置INDEX(Option:Integer)
         ④算出日付位置INDEX(Option:Integer)が返される
DateSerial 年月日より日付を生成(月末日等を自動補正する)
[戻値]算出した日付(Date)
[引数]①年(Integer)
         ②月(Integer)
         ③日(Integer)
カレンダーテ-ブルのユーザー定義「clsTypClassCalendar2」は「Structure」ではなく、クラスとして下記のソースコードの一番最後に記述しています。 また、祝日改訂で「世代」ができることからバージョンが判るようにプロパティを設けています。

「カレンダー処理クラス(clsAboutCalendar2R)」のソースコードです。
ExcelVBAとは異なり各メソッド呼び出しで「クラスが初期化されているか」の判定が不要なので標準モジュールは不要となり、 「カレンダー処理クラス(clsAboutCalendar2R)」のみで運用できます。
祝日の変更や会社休日等の追加については最後から2番目のプロシージャ「GP_MakeHoliParameter」の修正が必要です。

'***************************************************************************************************
'   カレンダー及び日付処理(祝日含む)関連クラス                  clsAboutCalendar2(Class)
'
'   作成者:井上治  URL:https://www.ne.jp/asahi/excel/inoue/ [Excelでお仕事!]
'***************************************************************************************************
'   ※カレンダーテーブル用ユーザー定義「clsTypClassCalendar2」はこのモジュールの一番下にあります
'   ※祝日法改正時は下の方にある「祝日パラメータテーブルの作成(GP_MakeHoliParameter)」の変更が必要です
'***************************************************************************************************
' 変更日付 Rev     変更履歴内容-------------------------------------------------------------------->
' 18/01/31(1.0.1.0)新規作成
' 18/02/07(1.0.2.0)祝日パラメータマスタの対応に仕様変更
' 18/02/07(1.0.2.0)祝日テーブル⇒カレンダーテーブルに用途変更、要素追記作成に変更
' 18/02/08(1.0.2.1)カレンダーテーブルに振替区分を追加する対応
' 18/02/09(1.0.2.2)「営業日数経過後営業日判定」の動作を改善
' 18/02/13(1.0.3.0)「年月日より日付を生成(DateSerial)」を追加
' 18/02/13(1.0.3.0)「前当翌3ヶ月のカレンダーテーブル作成」に当月開始・終了位置を追加
' 18/02/13(1.0.3.0)営業日算出関連に更新モード用プロシージャを追加(OverLoads)
' 18/02/13(1.0.3.0)ユーザー定義名変更(g_typCalendar2⇒g_typClassCalendar2)の対応
' 18/02/14(1.0.3.0)本クラス内での祝日パラメータテーブル作成を廃止(事前作成を前提とする)
' 18/02/15(1.0.3.0)GP_UpdateHolidaySUB1でのループ処理を廃止、振休・国休判定の動作を改善
' 18/02/16(1.0.3.0)祝日パラメータテーブルからの当月分切り出しを廃止して動作を改善
' 18/03/01(1.0.4.0)会社休日適用時に会社休日が振替休日や国民の休日と重なる時は法制休日を優先させる対応
' 18/03/08(1.0.5.0)月先頭が日曜日だと週数が2始まりになってしまう件を修正
' 18/03/30(1.0.6.0)カレンダーテーブル用ユーザー定義を「clsTypClassCalendar2(Class)」に変更
' 18/09/14(1.0.7.0)祝日パラメータテーブル作成をDB参照ではなく独自に行なうように変更
' 18/09/18(1.0.7.1)バージョン値、バージョン更新日を追加(プロパティも追加)
' 18/10/23(1.0.7.2)祝日パラメータテーブル要素追加の引数INDEXを廃止する対応(内部Static変数に変更)
' 18/11/17(1.0.7.3)カレンダーテーブル用ユーザー定義代替クラスをPublicスコープに変更
' 18/12/08(1.0.7.3)新天皇即位の日(5/1)、即位礼正殿の儀(10/22)を2019年限定で追加(名称は暫定)
' 20/12/12(1.0.7.4)2021年五輪大会特別措置法による祝日変更対応
'***************************************************************************************************
Friend Class clsAboutCalendar2R
    '===============================================================================================
    '  ↓↓↓ バージョン値、バージョン更新日は本クラスの変更を行なう時に必ず更新すること ↓↓↓
    Private Const g_cnsVersion As String = "1.0.7.4"                ' 本クラスのバージョン
    Private Const g_cnsVerUpdDate As Date = #12/12/2020#           ' バージョン更新日
    '  ↑↑↑ バージョン値、バージョン更新日は本クラスの変更を行なう時に必ず更新すること ↑↑↑
    '===============================================================================================
    Private Const g_cnsFURI = "(振替休日)"
    Private Const g_cnsKYU2 = "国民の休日"
    Private Const g_cnsKYU3 = "(会社休日)"
    ' 日付NULL時の代替値
    Private Const g_cnsNullDate As Date = Nothing
    '===============================================================================================
    ' 祝日パラメータテーブル用ユーザー定義
    Friend Structure g_typHoliParamater
        Dim Getsu As Integer                ' 月
        Dim SyoriKbn As Integer             ' 処理区分(0=固定日、1=HappyMonday、2=会社休日、9=特殊)
        Dim Hiduke As Integer               ' [固定日]日(Date型ではない)
        Dim FurikaeKbn As Integer           ' [固定日]振替区分(0=通常、1=振替休日を行なわない)
        Dim HmSyusu As Integer              ' [HM]週数(第n週)
        Dim HmYobi As Integer               ' [HM]曜日(0=日、1=月、2=火~6=土)
        Dim SyukuNm As String               ' 祝日名
        Dim StrYear As Integer              ' 開始年(西暦)
        Dim EndYear As Integer              ' 終了年(西暦)
    End Structure
    '-----------------------------------------------------------------------------------------------
    ' 祝日パラ月別範囲テーブル用ユーザー定義
    Friend Structure g_typHoliMonthIndex
        Dim StrIndex As Integer             ' 当月開始位置INDEX(祝日無しは-1)
        Dim EndIndex As Integer             ' 当月終了位置INDEX(祝日無しは-1)
    End Structure
    '===============================================================================================
    ' 祝日パラメータテーブル(clsAboutCalendar2用)
    Private g_tblHoliParamater() As g_typHoliParamater = Nothing    ' 祝日パラメータテーブル
    ' 祝日パラ月別範囲テーブル(参照INDEXは「月(1~12)」)
    Private g_tblHoliMonthIndex(12) As g_typHoliMonthIndex          ' 祝日パラ月別範囲テーブル
    '===============================================================================================
    ' 振替休日・国民の休日判定対象テーブル用ユーザー定義
    Private Structure g_typFuriDIx
        Dim CalIx As Integer                ' カレンダーINDEX
        Dim Syubetsu As Integer             ' 0=振替休日、1=国民の休日
    End Structure

    '***********************************************************************************************
    ' ■■■ 公開プロシージャ ■■■
    '***********************************************************************************************
    '* 処理名 :GetCalendarTable1
    '* 機能  :カレンダーテーブル作成(当月1ヶ月用)
    '-----------------------------------------------------------------------------------------------
    '* 返り値 :(なし)
    '* 引数  :Arg1 = 年(Integer)
    '*      Arg2 = 月(Integer)
    '*      Arg3 = カレンダーテーブル(Array:Structure) ※Ref参照
    '*      Arg4 = 営業日数(Integer)                   ※Ref参照(Option)
    '-----------------------------------------------------------------------------------------------
    '* 作成日 :2018年01月31日
    '* 作成者 :井上 治
    '* 更新日 :2018年03月30日
    '* 更新者 :井上 治
    '* 機能説明:
    '* 注意事項:
    '***********************************************************************************************
    Friend Sub GetCalendarTable1(ByVal intY As Integer, _
                                 ByVal intM As Integer, _
                                 ByRef tblCalendar() As clsTypClassCalendar2, _
                                 Optional ByRef intCntEigyo As Integer = 0)
        '-------------------------------------------------------------------------------------------
        ReDim tblCalendar(-1)
        ' カレンダーテーブル作成(当月分)
        Call GP_GetCalendarTableSub(intY, intM, tblCalendar, intCntEigyo)
    End Sub

    '***********************************************************************************************
    '* 処理名 :GetCalendarTable3
    '* 機能  :前当翌3ヶ月のカレンダーテーブル作成(当月+前後の3ヶ月用)
    '-----------------------------------------------------------------------------------------------
    '* 返り値 :(なし)
    '* 引数  :Arg1 = 年(Integer)
    '*      Arg2 = 月(Integer)
    '*      Arg3 = カレンダー当月開始INDEX(Integer)            ※Ref参照
    '*      Arg4 = カレンダー当月終了INDEX(Integer)            ※Ref参照
    '*      Arg5 = カレンダーテーブル(Array:Structure)         ※Ref参照
    '-----------------------------------------------------------------------------------------------
    '* 作成日 :2018年01月31日
    '* 作成者 :井上 治
    '* 更新日 :2018年03月30日
    '* 更新者 :井上 治
    '* 機能説明:
    '* 注意事項:
    '***********************************************************************************************
    Friend Sub GetCalendarTable3(ByVal intYear As Integer, _
                                 ByVal intMonth As Integer, _
                                 ByRef intCurStrIx As Integer, _
                                 ByRef intCurEndIx As Integer, _
                                 ByRef tblCalendar() As clsTypClassCalendar2)
        '-------------------------------------------------------------------------------------------
        Dim intY As Integer                                         ' 年WORK
        Dim intM As Integer                                         ' 月WORK
        ReDim tblCalendar(-1)
        ' 前月の年月を算出
        If intMonth = 1 Then
            intY = intYear - 1
            intM = 12
        Else
            intY = intYear
            intM = intMonth - 1
        End If
        ' カレンダーテーブル作成(前月分)
        Call GP_GetCalendarTableSub(intY, intM, tblCalendar)
        '-------------------------------------------------------------------------------------------
        ' 当月開始位置を返す
        intCurStrIx = tblCalendar.Length
        '-------------------------------------------------------------------------------------------
        ' カレンダーテーブル作成(当月分)
        Call GP_GetCalendarTableSub(intYear, intMonth, tblCalendar)
        '-------------------------------------------------------------------------------------------
        ' 当月終了位置を返す
        intCurEndIx = tblCalendar.GetUpperBound(0)
        '-------------------------------------------------------------------------------------------
        ' 翌月の年月を算出
        If intMonth = 12 Then
            intY = intYear + 1
            intM = 1
        Else
            intY = intYear
            intM = intMonth + 1
        End If
        ' カレンダーテーブル作成(翌月分)
        Call GP_GetCalendarTableSub(intY, intM, tblCalendar)
    End Sub

    '***********************************************************************************************
    '* 処理名 :SumEigyoNissu
    '* 機能  :営業日数算出(土日祝日を除外)
    '-----------------------------------------------------------------------------------------------
    '* 返り値 :営業日数(Integer)
    '* 引数  :Arg1 = 期間開始日(Date)
    '*      Arg2 = 期間終了日(Date)
    '*      Arg3 = 暦日数(Integer)         ※Ref参照:開始/終了が同日の場合は1となる(Option)
    '-----------------------------------------------------------------------------------------------
    '* 作成日 :2018年01月31日
    '* 作成者 :井上 治
    '* 更新日 :2018年03月30日
    '* 更新者 :井上 治
    '* 機能説明:
    '* 注意事項:開始日、終了日自体も営業日判断に適用される
    '***********************************************************************************************
    Friend Function SumEigyoNissu(ByVal dteDateF As Date, _
                                  ByVal dteDateT As Date, _
                                  Optional ByRef intCntReki As Integer = 0) As Integer
        '-------------------------------------------------------------------------------------------
        Dim intCntEigyo As Integer = 0                              ' 営業日数
        intCntReki = 0                                              ' 歴日数
        ' 時刻の除去
        dteDateF = dteDateF.Date
        dteDateT = dteDateT.Date
        ' 開始日>終了日(逆転)の場合は処理なし
        If dteDateF > dteDateT Then Return intCntEigyo
        '-------------------------------------------------------------------------------------------
        Dim dteTmp As Date = dteDateF                               ' 作業日
        Dim currY As Integer = dteTmp.Year                          ' 現在年
        Dim currM As Integer = dteTmp.Month                         ' 現在月
        '===========================================================================================
        ' 終了日までループ
        Do While dteTmp <= dteDateT
            '---------------------------------------------------------------------------------------
            ' ■月あたり前処理
            Dim prevY As Integer = currY                            ' 直前年
            Dim prevM As Integer = currM                            ' 直前月
            Dim tblCalendar() As clsTypClassCalendar2 = Nothing     ' カレンダーテーブル
            ReDim tblCalendar(-1)
            ' カレンダーテーブル作成(当月1ヶ月用)
            Call GP_GetCalendarTableSub(prevY, prevM, tblCalendar)
            Dim intIxS As Integer = 0                               ' カレンダーテーブルINDEX
            Dim intIxSMax As Integer = tblCalendar.GetUpperBound(0) ' カレンダーテーブルINDEX上限
            '---------------------------------------------------------------------------------------
            ' ■月あたり主処理(月替わりか終了日までループ)
            Do While ((dteTmp <= dteDateT) AndAlso (currY = prevY) AndAlso (currM = prevM))
                '-----------------------------------------
                ' 1日単位処理
                intCntReki += 1                                     ' 歴日数を加算
                Dim swHoli As Boolean = False                       ' 祝日判定
                '-----------------------------------------
                ' カレンダーテーブルをサーチ
                Do While intIxS <= intIxSMax
                    ' 日付発見か
                    If tblCalendar(intIxS).Hiduke = dteTmp Then
                        ' 祝日か判定
                        swHoli = tblCalendar(intIxS).Holi <> 0
                        Exit Do
                    End If
                    ' 次へ
                    intIxS += 1
                Loop
                '-----------------------------------------
                ' 土日祝日でなければ営業日数を加算
                If ((dteTmp.DayOfWeek <> DayOfWeek.Sunday) AndAlso _
                    (dteTmp.DayOfWeek <> DayOfWeek.Saturday) AndAlso _
                    (Not swHoli)) Then
                    intCntEigyo += 1                                ' 営業日数を加算
                End If
                '-----------------------------------------
                ' 翌日を設定
                dteTmp = dteTmp.AddDays(1)
                currY = dteTmp.Year
                currM = dteTmp.Month
            Loop
        Loop
        Return intCntEigyo
    End Function

    '***********************************************************************************************
    '* 処理名 :SumEigyoBi
    '* 機能  :営業日数経過後営業日判定(土日祝日を除外)
    '-----------------------------------------------------------------------------------------------
    '* 返り値 :営業日数経過後営業日(Date)
    '* 引数  :Arg1 = 起算日(Date)
    '*      Arg2 = 経過日数(Integer) ※±可能
    '-----------------------------------------------------------------------------------------------
    '* 作成日 :2018年01月31日
    '* 作成者 :井上 治
    '* 更新日 :2018年03月30日
    '* 更新者 :井上 治
    '* 機能説明:経過日数は翌日(翌営業日)を「1」として算出される(前営業日は「-1」)
    '* 注意事項:経過日数がゼロの場合は起算日をそのまま返す(土日祝判断なし)
    '***********************************************************************************************
    Friend Function SumEigyoBi(ByVal dteDateF As Date, _
                               ByVal intCntKeika As Integer) As Date
        '-------------------------------------------------------------------------------------------
        Dim dteDateT As Date = dteDateF                             ' 営業日数経過後営業日
        ' 経過日数がゼロなら非処理 ⇒ 起算日をそのまま返す
        If intCntKeika = 0 Then Return dteDateT
        '-------------------------------------------------------------------------------------------
        ' 経過日数の絶対値及び符号判定
        Dim intSign As Integer = 1                                  ' ループ時の加算日数
        ' 経過日数がマイナスの場合は「加算日数」に「-1」をセット
        If intCntKeika < 0 Then intSign = -1
        Dim intCntKeikaABS As Integer = intCntKeika * intSign       ' 経過日数の絶対値
        '-------------------------------------------------------------------------------------------
        ' 起算日の翌日(又は前日)の設定(年月) ※起算日自体は判定に加えない
        Dim dteTmp As Date = dteDateF.Date.AddDays(intSign)         ' 作業日
        Dim currY As Integer = dteTmp.Year                          ' 現在年
        Dim currM As Integer = dteTmp.Month                         ' 現在月
        Dim intCntEigyo As Integer = 0                              ' 営業日数
        '===========================================================================================
        ' 経過日数が経過するまでループ
        Do While intCntEigyo < intCntKeikaABS
            '---------------------------------------------------------------------------------------
            ' ■月あたり前処理
            Dim prevY As Integer = currY                            ' 直前年
            Dim prevM As Integer = currM                            ' 直前月
            Dim tblCalendar() As clsTypClassCalendar2 = Nothing     ' カレンダーテーブル
            ReDim tblCalendar(-1)
            ' カレンダーテーブル作成(当月1ヶ月用)
            Call GP_GetCalendarTableSub(prevY, prevM, tblCalendar)
            Dim intIxSMax As Integer = tblCalendar.GetUpperBound(0) ' カレンダーテーブルINDEX上限
            '---------------------------------------------------------------------------------------
            ' 経過日数がプラスか
            If intCntKeika > 0 Then
                '-----------------------------------------------------------------------------------
                Dim intIxS As Integer = 0                           ' カレンダーINDEX(初期値ゼロ)
                '-----------------------------------------------------------------------------------
                ' ■月あたり主処理(月替わりか日数経過までループ) ※プラス時
                Do While ((intCntEigyo < intCntKeikaABS) AndAlso _
                          (currY = prevY) AndAlso (currM = prevM))
                    '-----------------------------------------
                    ' 1日単位処理
                    Dim swHoli As Boolean = False                   ' 祝日判定
                    '-----------------------------------------
                    ' カレンダーテーブルをサーチ(前から)
                    Do While intIxS <= intIxSMax
                        ' 日付発見か
                        If tblCalendar(intIxS).Hiduke = dteTmp Then
                            ' 祝日か判定
                            swHoli = tblCalendar(intIxS).Holi <> 0
                            Exit Do
                        End If
                        ' 次へ
                        intIxS += 1
                    Loop
                    '-----------------------------------------
                    ' 土日祝日でなければ営業日数を加算
                    If ((dteTmp.DayOfWeek <> DayOfWeek.Sunday) AndAlso _
                        (dteTmp.DayOfWeek <> DayOfWeek.Saturday) AndAlso _
                        (Not swHoli)) Then
                        intCntEigyo += 1                            ' 営業日数を加算
                        dteDateT = dteTmp                           ' 現在日をセット
                    End If
                    '-----------------------------------------
                    ' 翌日を設定
                    dteTmp = dteTmp.AddDays(1)
                    currY = dteTmp.Year
                    currM = dteTmp.Month
                Loop
            Else    ' マイナス
                '-----------------------------------------------------------------------------------
                Dim intIxS As Integer = intIxSMax                   ' カレンダーINDEX(初期値上限値)
                '-----------------------------------------------------------------------------------
                ' ■月あたり主処理(月替わりか日数経過までループ) ※マイナス時
                Do While ((intCntEigyo < intCntKeikaABS) AndAlso _
                          (currY = prevY) AndAlso (currM = prevM))
                    '-----------------------------------------
                    ' 1日単位処理
                    Dim swHoli As Boolean = False                   ' 祝日判定
                    '-----------------------------------------
                    ' カレンダーテーブルをサーチ(後ろから)
                    Do While intIxS >= 0
                        ' 日付発見か
                        If tblCalendar(intIxS).Hiduke = dteTmp Then
                            ' 祝日か判定
                            swHoli = tblCalendar(intIxS).Holi <> 0
                            Exit Do
                        End If
                        ' 次へ
                        intIxS -= 1
                    Loop
                    '-----------------------------------------
                    ' 土日祝日でなければ営業日数を加算
                    If ((dteTmp.DayOfWeek <> DayOfWeek.Sunday) AndAlso _
                        (dteTmp.DayOfWeek <> DayOfWeek.Saturday) AndAlso _
                        (Not swHoli)) Then
                        intCntEigyo += 1                            ' 営業日数を加算
                        dteDateT = dteTmp                           ' 現在日をセット
                    End If
                    '-----------------------------------------
                    ' 前日を設定
                    dteTmp = dteTmp.AddDays(-1)
                    currY = dteTmp.Year
                    currM = dteTmp.Month
                Loop
            End If
        Loop
        Return dteDateT
    End Function

    '***********************************************************************************************
    '* 処理名 :GetNoN_EigyoBi
    '* 機能  :第n営業日目の日付の取得
    '-----------------------------------------------------------------------------------------------
    '* 返り値 :当該日付(Date)
    '* 引数  :Arg1 = 第n営業日目日数値(Integer)
    '*      Arg2 = カレンダーテーブル(Array:Structure)
    '*      Arg3 = カレンダー当月開始INDEX(Integer)          ※Option
    '*      Arg4 = 第n営業日目INDEX(Integer)                 ※Ref参照、Option
    '-----------------------------------------------------------------------------------------------
    '* 作成日 :2018年02月14日
    '* 作成者 :井上 治
    '* 更新日 :2018年03月30日
    '* 更新者 :井上 治
    '* 機能説明:当月月初から第n営業日目の日付(及び位置INDEX)を得る
    '* 注意事項:tblCalendarはg_typClassCalendar2であるが、Object型としている
    '***********************************************************************************************
    Friend Function GetNoN_EigyoBi(ByVal intCntEigyoEnd As Integer, _
                                   ByVal tblCalendar() As clsTypClassCalendar2, _
                                   Optional ByVal intCurStrIx As Integer = 0, _
                                   Optional ByRef intIxC As Integer = 0) As Date
        '-------------------------------------------------------------------------------------------
        Dim intCntEigyo As Integer = 0                              ' 営業日数
        GetNoN_EigyoBi = g_cnsNullDate
        ' 当月開始INDEXから探索開始
        intIxC = intCurStrIx
        ' n営業日目まで繰り返す
        Do While intIxC <= tblCalendar.GetUpperBound(0)
            With tblCalendar(intIxC)
                ' 営業日か
                If ((.Yobi <> 0) AndAlso (.Yobi <> 6) AndAlso (.Holi = 0)) Then
                    intCntEigyo += 1
                    ' n営業日目になったら終了
                    If intCntEigyo = intCntEigyoEnd Then
                        GetNoN_EigyoBi = .Hiduke
                        Exit Do
                    End If
                End If
            End With
            ' 次の日へ
            intIxC += 1
        Loop
    End Function

    '***********************************************************************************************
    '* 処理名 :DateSerial
    '* 機能  :年月日より日付を生成
    '-----------------------------------------------------------------------------------------------
    '* 返り値 :当該日付(Date)
    '* 引数  :Arg1 = 年(Integer)
    '*      Arg2 = 月(Integer)
    '*      Arg3 = 日(Integer)
    '-----------------------------------------------------------------------------------------------
    '* 作成日 :2018年02月13日
    '* 作成者 :井上 治
    '* 更新日 :2018年02月13日
    '* 更新者 :井上 治
    '* 機能説明:月末日等を自動補正する
    '* 注意事項:
    '***********************************************************************************************
    Friend Function DateSerial(ByVal intY As Integer, _
                               ByVal intM As Integer, _
                               ByVal intD As Integer) As Date
        '-------------------------------------------------------------------------------------------
        ' 1~12月の範囲外の調整
        Select Case intM
            Case Is < 1
                intY -= 1
                intM = 12
            Case Is > 12
                intY += 1
                intM = 1
        End Select
        '-------------------------------------------------------------------------------------------
        ' 日の範囲外の調整
        Select Case intD
            Case Is < 1
                intD = 1
            Case Is > 28
                ' 当月日数=月末日で判定
                Dim intD2 As Integer = DateTime.DaysInMonth(intY, intM)
                If intD > intD2 Then intD = intD2
        End Select
        ' 当該日付を取得
        Return New Date(intY, intM, intD)
    End Function

    '***********************************************************************************************
    ' ■■■ 初期化 ■■■
    '***********************************************************************************************
    '* 処理名 :New
    '* 機能  :初期化
    '-----------------------------------------------------------------------------------------------
    '* 返り値 :(なし)
    '* 引数  :(なし)
    '-----------------------------------------------------------------------------------------------
    '* 作成日 :2018年09月14日
    '* 作成者 :井上 治
    '* 更新日 :2018年09月14日
    '* 更新者 :井上 治
    '* 機能説明:
    '* 注意事項:
    '***********************************************************************************************
    Public Sub New()
        '-------------------------------------------------------------------------------------------
        ' 祝日パラメータテーブル作成
        Call GP_MakeHoliParameter()
    End Sub

    '***********************************************************************************************
    ' ■■■ サブ処理(Private) ■■■
    '***********************************************************************************************
    '* 処理名 :GP_GetCalendarTableSub
    '* 機能  :カレンダーテーブル作成(当月分)
    '-----------------------------------------------------------------------------------------------
    '* 返り値 :(なし)
    '* 引数  :Arg1 = 年(Integer)
    '*      Arg2 = 月(Integer)
    '*      Arg3 = カレンダーテーブル(Array:Structure) ※Ref参照
    '*      Arg4 = 営業日数(Integer)                   ※Ref参照(Option:当月のみ)
    '-----------------------------------------------------------------------------------------------
    '* 作成日 :2018年02月07日
    '* 作成者 :井上 治
    '* 更新日 :2018年03月30日
    '* 更新者 :井上 治
    '* 機能説明:
    '* 注意事項:
    '***********************************************************************************************
    Private Sub GP_GetCalendarTableSub(ByVal intY As Integer, _
                                       ByVal intM As Integer, _
                                       ByRef tblCalendar() As clsTypClassCalendar2, _
                                       Optional ByRef intCntEigyo As Integer = 0)
        '-------------------------------------------------------------------------------------------
        Dim intIxMax As Integer = tblCalendar.GetUpperBound(0)      ' テーブルINDEX上限
        ' 現在月の先頭位置を退避
        Dim intCalStrIx As Integer = intIxMax + 1                   ' 現在月の先頭位置
        ' カレンダーテーブル作成
        Call GP_GetCalendar(intY, intM, intIxMax, tblCalendar)
        ' 営業日数を一旦月間日数とする
        intCntEigyo = tblCalendar.Length
        '-------------------------------------------------------------------------------------------
        ' 当月に祝日がない時は終了
        If g_tblHoliMonthIndex(intM).EndIndex < 0 Then Exit Sub
        '-------------------------------------------------------------------------------------------
        Dim tblFuriDIx() As g_typFuriDIx                            ' 振替休日判定日INDEXテーブル
        ReDim tblFuriDIx(-1)
        ' カレンダーテーブルに祝日情報を更新(この時点では振替休日の処置はしない)
        Call GP_UpdateHolidayToCalendar(intY, _
                                        intM, _
                                        intCalStrIx, _
                                        intCntEigyo, _
                                        tblFuriDIx, _
                                        tblCalendar)
        '-------------------------------------------------------------------------------------------
        ' 振替休日判定が必要か
        If tblFuriDIx.GetUpperBound(0) >= 0 Then
            ' 営業日数を減算
            intCntEigyo -= tblFuriDIx.Length
            ' 振替休日・国民の休日判定
            Call GP_UpdateFuriKokuminKyu(tblFuriDIx, tblCalendar)
        End If
    End Sub

    '***********************************************************************************************
    '* 処理名 :GP_GetCalendar
    '* 機能  :カレンダーテーブル作成
    '-----------------------------------------------------------------------------------------------
    '* 返り値 :処理成否(Boolean)
    '* 引数  :Arg1 = 年(Integer)
    '*      Arg2 = 月(Integer)
    '*      Arg3 = カレンダーテーブルINDEX上限(Integer)    ※Ref参照
    '*      Arg4 = カレンダーテーブル(Array:Structure)     ※Ref参照
    '-----------------------------------------------------------------------------------------------
    '* 作成日 :2018年02月07日
    '* 作成者 :井上 治
    '* 更新日 :2018年03月30日
    '* 更新者 :井上 治
    '* 機能説明:
    '* 注意事項:
    '***********************************************************************************************
    Private Sub GP_GetCalendar(ByVal intY As Integer, _
                               ByVal intM As Integer, _
                               ByRef intIxMax As Integer, _
                               ByRef tblCalendar() As clsTypClassCalendar2)
        '-------------------------------------------------------------------------------------------
        Dim dteStrDate As Date = New Date(intY, intM, 1)            ' 月初日
        Dim dteEndDate As Date = New Date(intY, intM, Date.DaysInMonth(intY, intM)) ' 月末日
        Dim dteDate As Date = dteStrDate                            ' 作業日付
        Dim intSyusu As Integer = 1                                 ' 週数(1始まり、日曜日発見で1加算)
        Dim intHmSyusu As Integer = 0                               ' HM週数(0始まり、月曜日発見で1加算)
        ' 1日が日曜だと週数が2始まりになってしまう件の対応
        If dteStrDate.DayOfWeek = 0 Then
            intSyusu = 0
        End If
        ' 当月終了日まで繰り返す
        Do While dteDate <= dteEndDate
            ' カレンダーテーブルの要素を追加
            intIxMax += 1
            ReDim Preserve tblCalendar(intIxMax)
            ' クラス初期化
            tblCalendar(intIxMax) = New clsTypClassCalendar2
            With tblCalendar(intIxMax)
                .Hiduke = dteDate                               ' 日付
                .Yobi = dteDate.DayOfWeek                       ' 曜日
                ' 日曜日なら週数加算
                If .Yobi = 0 Then intSyusu += 1
                ' 月曜日ならHM週数を加算
                If .Yobi = 1 Then intHmSyusu += 1
                .Syusu = intSyusu                               ' 週数
                .HmSyusu = intHmSyusu                           ' HM週数
                ' 以下は初期値をセット
                .Holi = 0
                .Name = String.Empty
                .FurikaeKbn = 0
            End With
            ' 次の日へ
            dteDate = dteDate.AddDays(1)
        Loop
    End Sub

    '***********************************************************************************************
    '* 処理名 :GP_UpdateHolidayToCalendar
    '* 機能  :カレンダーテーブルに祝日情報を更新
    '-----------------------------------------------------------------------------------------------
    '* 返り値 :(なし)
    '* 引数  :Arg1 = 年(Integer)
    '*      Arg2 = 月(Integer)
    '*      Arg3 = カレンダーテーブル当月開始位置INDEX(Integer)
    '*      Arg4 = 営業日数(Integer)                               ※Ref参照
    '*      Arg5 = 振替休日判定日INDEXテーブル(Array:Structure)    ※Ref参照
    '*      Arg6 = カレンダーテーブル(Array:Structure)             ※Ref参照
    '-----------------------------------------------------------------------------------------------
    '* 作成日 :2018年02月07日
    '* 作成者 :井上 治
    '* 更新日 :2018年03月30日
    '* 更新者 :井上 治
    '* 機能説明:
    '* 注意事項:この時点では振替休日の処置はしないが、処置要否を振替休日判定日INDEXテーブルにセットする
    '***********************************************************************************************
    Private Sub GP_UpdateHolidayToCalendar(ByVal intY As Integer, _
                                           ByVal intM As Integer, _
                                           ByVal intCalStrIx As Integer, _
                                           ByRef intCntEigyo As Integer, _
                                           ByRef tblFuriDIx() As g_typFuriDIx, _
                                           ByRef tblCalendar() As clsTypClassCalendar2)
        '-------------------------------------------------------------------------------------------
        Dim intIxS_Str As Integer = g_tblHoliMonthIndex(intM).StrIndex  ' 祝日テーブル当月開始位置
        Dim intIxS_End As Integer = g_tblHoliMonthIndex(intM).EndIndex  ' 祝日テーブル当月終了位置
        ' 祝日パラメータテーブルの当月範囲を巡回
        For intIxHoli As Integer = intIxS_Str To intIxS_End
            With g_tblHoliParamater(intIxHoli)
                ' 祝日パラメータの有効年範囲を判定
                If ((.StrYear <= intY) AndAlso (.EndYear >= intY)) Then
                    ' 営業日数を減算
                    intCntEigyo -= 1
                    ' 処理区分の判定
                    Select Case .SyoriKbn
                        Case 0                          ' 固定日
                            ' 祝日情報のカレンダーテーブル更新(サブ処理:日付で判定)
                            Call GP_UpdateHolidaySUB1(.Hiduke, _
                                                      .SyukuNm, _
                                                      1, _
                                                      .FurikaeKbn, _
                                                      intCalStrIx, _
                                                      intIxHoli, _
                                                      tblFuriDIx, _
                                                      tblCalendar)
                        Case 1                          ' HappyMonday
                            ' 祝日情報のカレンダーテーブル更新(サブ処理:週数+曜日で判定)
                            Call GP_UpdateHolidaySUB2(.HmSyusu, _
                                                      .HmYobi, _
                                                      .SyukuNm, _
                                                      1, _
                                                      .FurikaeKbn, _
                                                      intCalStrIx, _
                                                      intIxHoli, _
                                                      tblFuriDIx, _
                                                      tblCalendar)
                        Case 2                          ' 固定日(会社休日)
                            ' 祝日情報のカレンダーテーブル更新(サブ処理:日付で判定)
                            Call GP_UpdateHolidaySUB1(.Hiduke, _
                                                      .SyukuNm, _
                                                      3, _
                                                      .FurikaeKbn, _
                                                      intCalStrIx, _
                                                      intIxHoli, _
                                                      tblFuriDIx, _
                                                      tblCalendar)
                        Case 9                          ' 特殊処理
                            ' 3月か
                            If intM = 3 Then
                                ' 春分の日の算出(簡易計算方式)
                                Call GP_GetSyunbun(intY, _
                                                   intCalStrIx, _
                                                   intIxHoli, _
                                                   tblFuriDIx, _
                                                   tblCalendar)
                            ElseIf intM = 9 Then
                                ' 秋分の日の算出(簡易計算方式)
                                Call GP_GetSyuubun(intY, _
                                                   intCalStrIx, _
                                                   intIxHoli, _
                                                   tblFuriDIx, _
                                                   tblCalendar)
                            Else ' 他月は無視
                            End If
                    End Select
                End If
            End With
        Next intIxHoli
    End Sub

    '***********************************************************************************************
    '* 処理名 :GP_UpdateHolidaySUB1
    '* 機能  :祝日情報のカレンダーテーブル更新(サブ処理:日付で判定)
    '-----------------------------------------------------------------------------------------------
    '* 返り値 :(なし)
    '* 引数  :Arg1 = 日(Integer、1~31)
    '*      Arg2 = 祝日名称(String)
    '*      Arg3 = 祝日判定(0=通常、1=祝日、2=振替休日、3=会社休日)
    '*      Arg4 = 振替区分(0=通常、1=振替休日を行なわない)
    '*      Arg5 = カレンダーテーブル当月開始位置INDEX(Integer)
    '*      Arg6 = 祝日パラメータテーブルINDEX(Integer)
    '*      Arg7 = 振替休日判定日INDEXテーブル(Array:Structure)    ※Ref参照
    '*      Arg8 = カレンダーテーブル(Array:Structure)             ※Ref参照
    '-----------------------------------------------------------------------------------------------
    '* 作成日 :2018年02月07日
    '* 作成者 :井上 治
    '* 更新日 :2018年03月30日
    '* 更新者 :井上 治
    '* 機能説明:
    '* 注意事項:
    '***********************************************************************************************
    Private Sub GP_UpdateHolidaySUB1(ByVal intDay As Integer, _
                                     ByVal strName As String, _
                                     ByVal intHoli As Integer, _
                                     ByVal intFurikaeKbn As Integer, _
                                     ByVal intCalStrIx As Integer, _
                                     ByVal intIxHoli As Integer, _
                                     ByRef tblSyukuDIx() As g_typFuriDIx, _
                                     ByRef tblCalendar() As clsTypClassCalendar2)
        '-------------------------------------------------------------------------------------------
        Dim intIx As Integer = intCalStrIx + intDay - 1             ' 当日テーブルINDEX
        Dim intIxB1 As Integer = intIx - 1                          ' 1日前テーブルINDEX
        Dim intIxB2 As Integer = intIx - 2                          ' 2日前テーブルINDEX
        Dim intIxA1 As Integer = intIx + 1                          ' 1日後テーブルINDEX
        Dim intIxA2 As Integer = intIx + 2                          ' 2日後テーブルINDEX
        Dim intIxMax As Integer = tblCalendar.GetUpperBound(0)      ' カレンダーテーブル上限
        '---------------------------------------------------
        ' 当該日が既に祝日(又は振替休日、国民の休日)だったら「会社休日」は適用しない
        ' ※この判定には「会社休日」の対する振替区分の判断は行なっていません
        If ((intHoli = 3) And (tblCalendar(intIx).Holi <> 0)) Then
            Exit Sub
        End If
        '---------------------------------------------------
        ' カレンダーテーブルから該当日付を探す
        ' 祝日情報を反映
        With tblCalendar(intIx)
            .Holi = intHoli
            .Name = strName
            .FurikaeKbn = intFurikaeKbn
        End With
        ' 振替休日を行なわない時は終了
        If intFurikaeKbn = 1 Then Exit Sub
        '-------------------------------------------------------------------------------------------
        ' 日曜日又は前後判定で「国民の休日」対象なら振替休日判定日INDEXテーブルに追加
        If tblCalendar(intIx).Yobi = 0 Then
            Dim intIxSD As Integer = tblSyukuDIx.Length         ' 振替休日判定日INDEXテーブルINDEX
            ReDim Preserve tblSyukuDIx(intIxSD)
            tblSyukuDIx(intIxSD).CalIx = intIx
            tblSyukuDIx(intIxSD).Syubetsu = 0
        ElseIf ((intIxB2 >= 0) AndAlso _
                (tblCalendar(intIxB2).Holi <> 0) AndAlso _
                (tblCalendar(intIxB1).Holi = 0) AndAlso _
                (tblCalendar(intIxB2).FurikaeKbn = 0)) Then
            ' 2日前が祝日で1日前が祝日でない⇒「国民の休日」対象
            Dim intIxSD As Integer = tblSyukuDIx.Length         ' 振替休日判定日INDEXテーブルINDEX
            ReDim Preserve tblSyukuDIx(intIxSD)
            tblSyukuDIx(intIxSD).CalIx = intIxB2
            tblSyukuDIx(intIxSD).Syubetsu = 1
        ElseIf ((intIxA2 <= intIxMax) AndAlso _
                (tblCalendar(intIxA2).Holi <> 0) AndAlso _
                (tblCalendar(intIxA1).Holi = 0) AndAlso _
                (tblCalendar(intIxA2).FurikaeKbn = 0)) Then
            ' 2日後が祝日で1日後が祝日でない⇒「国民の休日」対象
            Dim intIxSD As Integer = tblSyukuDIx.Length         ' 振替休日判定日INDEXテーブルINDEX
            ReDim Preserve tblSyukuDIx(intIxSD)
            tblSyukuDIx(intIxSD).CalIx = intIx
            tblSyukuDIx(intIxSD).Syubetsu = 1
        ElseIf intIx = intIxMax - 1 Then
            ' 月末日の1日前⇒翌月1日が祝日か判定
            Dim intTblIxHoliN As Integer = intIxHoli + 1        ' 次の祝日パラメータテーブルINDEX
            ' 次の祝日が1日か
            If ((g_tblHoliParamater(intTblIxHoliN).Hiduke = 1) AndAlso _
                (g_tblHoliParamater(intTblIxHoliN).FurikaeKbn = 0)) Then
                Dim intYearN As Integer = tblCalendar(intIx).Hiduke.Year    ' 現在年
                Dim intGetsuN As Integer = tblCalendar(intIx).Hiduke.Month + 1  ' 次の月
                ' 次の月が有効か
                If intGetsuN > 12 Then
                    intYearN += 1
                    intGetsuN = 1
                End If
                With g_tblHoliParamater(intTblIxHoliN)
                    ' 有効な祝日か
                    If ((.Getsu = intGetsuN) AndAlso _
                        (.StrYear <= intYearN) AndAlso _
                        (.EndYear >= intYearN)) Then
                        ' 月末日が「国民の休日」対象
                        Dim intIxSD As Integer = tblSyukuDIx.Length ' 振替休日判定日INDEXテーブルINDEX
                        ReDim Preserve tblSyukuDIx(intIxSD)
                        tblSyukuDIx(intIxSD).CalIx = intIx
                        tblSyukuDIx(intIxSD).Syubetsu = 1
                    End If
                End With
            End If
        End If
    End Sub

    '***********************************************************************************************
    '* 処理名 :GP_UpdateHolidaySUB2
    '* 機能  :祝日情報のカレンダーテーブル更新(サブ処理:週数+曜日で判定)
    '-----------------------------------------------------------------------------------------------
    '* 返り値 :(なし)
    '* 引数  :Arg1 = HM週数(Integer)
    '*      Arg2 = 祝日(Integer)
    '*      Arg3 = 祝日名称(String)
    '*      Arg4 = 祝日判定(0=通常、1=祝日、2=振替休日、3=会社休日)
    '*      Arg5 = 振替区分(0=通常、1=振替休日を行なわない)
    '*      Arg6 = カレンダーテーブル当月開始位置INDEX(Integer)
    '*      Arg7 = 祝日パラメータテーブルINDEX(Integer)
    '*      Arg8 = 振替休日判定日INDEXテーブル(Array:Structure)    ※Ref参照
    '*      Arg9 = カレンダーテーブル(Array:Structure)             ※Ref参照
    '-----------------------------------------------------------------------------------------------
    '* 作成日 :2018年02月07日
    '* 作成者 :井上 治
    '* 更新日 :2018年03月30日
    '* 更新者 :井上 治
    '* 機能説明:
    '* 注意事項:
    '***********************************************************************************************
    Private Sub GP_UpdateHolidaySUB2(ByVal intHmSyusu As Integer, _
                                     ByVal intYobi As Integer, _
                                     ByVal strName As String, _
                                     ByVal intHoli As Integer, _
                                     ByVal intFurikaeKbn As Integer, _
                                     ByVal intCalStrIx As Integer, _
                                     ByVal intIxHoli As Integer, _
                                     ByRef tblSyukuDIx() As g_typFuriDIx, _
                                     ByRef tblCalendar() As clsTypClassCalendar2)
        '-------------------------------------------------------------------------------------------
        Dim intIx As Integer = intCalStrIx                          ' テーブルINDEX
        ' カレンダーテーブルから該当週数+曜日を探す
        Do While intIx <= tblCalendar.GetUpperBound(0)
            ' 週数+曜日発見か
            If ((tblCalendar(intIx).HmSyusu = intHmSyusu) AndAlso _
                (tblCalendar(intIx).Yobi = intYobi)) Then
                ' 祝日情報のカレンダーテーブル更新(サブ処理:日付で判定)
                Call GP_UpdateHolidaySUB1(tblCalendar(intIx).Hiduke.Day, _
                                          strName, _
                                          intHoli, _
                                          intFurikaeKbn, _
                                          intCalStrIx, _
                                          intIxHoli, _
                                          tblSyukuDIx, _
                                          tblCalendar)
                Exit Do
            End If
            ' 次へ
            intIx += 1
        Loop
    End Sub

    '***********************************************************************************************
    '* 処理名 :GP_GetSyunbun
    '* 機能  :春分の日の算出(簡易計算方式)
    '-----------------------------------------------------------------------------------------------
    '* 返り値 :(なし)
    '* 引数  :Arg1 = 年(Integer)
    '*      Arg2 = カレンダーテーブル当月開始位置INDEX(Integer)
    '*      Arg3 = 祝日パラメータテーブルINDEX(Integer)
    '*      Arg4 = 振替休日判定日INDEXテーブル(Array:Structure)    ※Ref参照
    '*      Arg5 = カレンダーテーブル(Array:Structure)             ※Ref参照
    '-----------------------------------------------------------------------------------------------
    '* 作成日 :2018年01月31日
    '* 作成者 :井上 治
    '* 更新日 :2018年03月30日
    '* 更新者 :井上 治
    '* 機能説明:本計算方法は1948~2150年まで算出可能
    '* 注意事項:本処理内では振替休日判定は行なわない
    '***********************************************************************************************
    Private Sub GP_GetSyunbun(ByVal intY As Integer, _
                              ByVal intCalStrIx As Integer, _
                              ByVal intIxHoli As Integer, _
                              ByRef tblSyukuDIx() As g_typFuriDIx, _
                              ByRef tblCalendar() As clsTypClassCalendar2)
        '-------------------------------------------------------------------------------------------
        ' 祝日法施行(1947年)以前,2151年以降(簡易計算不可)は無視
        Dim intY2 As Integer = intY - 1980
        Dim intD As Integer
        Select Case intY
            Case Is <= 1979
                intD = Int(20.8357 + (0.242194 * intY2) - Int(intY2 / 4))
            Case Is <= 2099
                intD = Int(20.8431 + (0.242194 * intY2) - Int(intY2 / 4))
            Case Else
                intD = Int(21.851 + (0.242194 * intY2) - Int(intY2 / 4))
        End Select
        ' 祝日情報のカレンダーテーブル更新(サブ処理:日付で判定)
        Call GP_UpdateHolidaySUB1(intD, _
                                  "春分の日", _
                                  1, _
                                  0, _
                                  intCalStrIx, _
                                  intIxHoli, _
                                  tblSyukuDIx, _
                                  tblCalendar)
    End Sub

    '***********************************************************************************************
    '* 処理名 :GP_GetSyuubun
    '* 機能  :秋分の日の算出(簡易計算方式)
    '-----------------------------------------------------------------------------------------------
    '* 返り値 :(なし)
    '* 引数  :Arg1 = 年(Integer)
    '*      Arg2 = カレンダーテーブル当月開始位置INDEX(Integer)
    '*      Arg3 = 祝日パラメータテーブルINDEX(Integer)
    '*      Arg4 = 振替休日判定日INDEXテーブル(Array:Structure)    ※Ref参照
    '*      Arg5 = カレンダーテーブル(Array:Structure)             ※Ref参照
    '-----------------------------------------------------------------------------------------------
    '* 作成日 :2018年01月31日
    '* 作成者 :井上 治
    '* 更新日 :2018年03月30日
    '* 更新者 :井上 治
    '* 機能説明:本計算方法は1948~2150年まで算出可能
    '* 注意事項:本処理内では振替休日判定は行なわない
    '***********************************************************************************************
    Private Sub GP_GetSyuubun(ByVal intY As Integer, _
                              ByVal intCalStrIx As Integer, _
                              ByVal intIxHoli As Integer, _
                              ByRef tblSyukuDIx() As g_typFuriDIx, _
                              ByRef tblCalendar() As clsTypClassCalendar2)
        '-------------------------------------------------------------------------------------------
        ' 祝日法施行(1947年)以前,2151年以降(簡易計算不可)は無視
        Dim intY2 As Integer = intY - 1980
        Dim intD As Integer
        Select Case intY
            Case Is <= 1979
                intD = Int(23.2588 + (0.242194 * intY2) - Int(intY2 / 4))
            Case Is <= 2099
                intD = Int(23.2488 + (0.242194 * intY2) - Int(intY2 / 4))
            Case Else
                intD = Int(24.2488 + (0.242194 * intY2) - Int(intY2 / 4))
        End Select
        ' 祝日情報のカレンダーテーブル更新(サブ処理:日付で判定)
        Call GP_UpdateHolidaySUB1(intD, _
                                  "秋分の日", _
                                  1, _
                                  0, _
                                  intCalStrIx, _
                                  intIxHoli, _
                                  tblSyukuDIx, _
                                  tblCalendar)
    End Sub

    '***********************************************************************************************
    '* 処理名 :GP_UpdateFuriKokuminKyu
    '* 機能  :振替休日・国民の休日判定
    '-----------------------------------------------------------------------------------------------
    '* 返り値 :(なし)
    '* 引数  :Arg1 = 振替休日判定日INDEXテーブル(Array:Structure)
    '*      Arg2 = カレンダーテーブル(Array:Structure)             ※Ref参照
    '-----------------------------------------------------------------------------------------------
    '* 作成日 :2018年02月07日
    '* 作成者 :井上 治
    '* 更新日 :2018年03月30日
    '* 更新者 :井上 治
    '* 機能説明:
    '* 注意事項:
    '***********************************************************************************************
    Private Sub GP_UpdateFuriKokuminKyu(ByVal tblFuriDIx() As g_typFuriDIx, _
                                        ByRef tblCalendar() As clsTypClassCalendar2)
        '-------------------------------------------------------------------------------------------
        Dim intIxF As Integer = 0                               ' 振替休日判定日テーブルINDEX
        Dim intIxFMax As Integer = tblFuriDIx.GetUpperBound(0)  ' 振替休日判定日テーブルINDEX上限
        Dim intIxCMax As Integer = tblCalendar.GetUpperBound(0) ' カレンダーテーブルINDEX上限
        '-------------------------------------------------------------------------------------------
        Do While intIxF <= intIxFMax
            Dim intIxC As Integer = tblFuriDIx(intIxF).CalIx + 1 ' カレンダーテーブルINDEX
            ' 振替休日か
            If tblFuriDIx(intIxF).Syubetsu = 0 Then
                ' 翌日以降の最初の平日(又は会社休日)を「振替休日」とする
                Do While intIxC <= intIxCMax
                    ' 祝日以外(又は会社休日)を発見
                    If ((tblCalendar(intIxC).Holi = 0) OrElse (tblCalendar(intIxC).Holi = 3)) Then
                        ' 振替休日とする(会社休日は振替休日に置き換える)
                        tblCalendar(intIxC).Holi = 2
                        tblCalendar(intIxC).Name = g_cnsFURI
                        Exit Do
                    ElseIf tblCalendar(intIxC).Name = g_cnsKYU2 Then
                        ' 既に国民の休日がある場合は処置中止(国民の休日のままにする)
                        Exit Do
                    End If
                    ' 次の日へ
                    intIxC += 1
                Loop
            Else    ' 国民の休日
                ' 翌日を「国民の休日」とする
                tblCalendar(intIxC).Holi = 1
                tblCalendar(intIxC).Name = g_cnsKYU2            ' 国民の休日
            End If
            ' 次へ
            intIxF += 1
        Loop
    End Sub

    '***********************************************************************************************
    '* 処理名 :GP_MakeHoliParameter
    '* 機能  :振替休日・国民の休日判定
    '-----------------------------------------------------------------------------------------------
    '* 返り値 :(なし)
    '* 引数  :(なし)
    '-----------------------------------------------------------------------------------------------
    '* 作成日 :2018年09月14日
    '* 作成者 :井上 治
    '* 更新日 :2020年12月12日
    '* 更新者 :井上 治
    '* 機能説明:
    '* 注意事項:本プロシージャは祝日法改正時に変更が必要!!
    '***********************************************************************************************
    Private Sub GP_MakeHoliParameter()
        '-------------------------------------------------------------------------------------------
        ' 祝日パラ月別範囲テーブルを一旦初期化
        For intIx As Integer = 1 To 12
            With g_tblHoliMonthIndex(intIx)
                .StrIndex = -1
                .EndIndex = -1
            End With
        Next intIx
        '-------------------------------------------------------------------------------------------
        ReDim g_tblHoliParamater(-1)
        '===========================================================================================
        ' ※各月で呼び出している「祝日パラメータテーブル要素追加(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)
        '###########################################################################################
        '   ↓↓↓ ※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)
        '===========================================================================================
        ' 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追加
        ' 海の日(2022年以降は第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年のみ東京五輪特別措置法で23日)
        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)
        '###########################################################################################
        '   ↓↓↓ ※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

    '***********************************************************************************************
    '* 処理名 :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月14日
    '* 作成者 :井上 治
    '* 更新日 :2018年10月23日
    '* 更新者 :井上 治
    '* 機能説明:
    '* 注意事項:テーブルINDEXは本処理側で加算されます
    '***********************************************************************************************
    Private Sub GP_ApendHoliParam(ByVal intGetsu As Integer, _
                                  ByVal intSyoriKbn As Integer, _
                                  ByVal intHiduke As Integer, _
                                  ByVal intFurikaeKbn As Integer, _
                                  ByVal intHmSyusu As Integer, _
                                  ByVal intHmYobi As Integer, _
                                  ByVal strSyukuNm As String, _
                                  ByVal intStrYear As Integer, _
                                  ByVal intEndYear As Integer)
        '-------------------------------------------------------------------------------------------
        Static intIxTbl As Integer = 0                              ' テーブルINDEX
        ReDim Preserve g_tblHoliParamater(intIxTbl)
        ' 祝日パラ月別範囲テーブルを更新
        With g_tblHoliMonthIndex(intGetsu)
            ' 開始位置
            If .StrIndex < 0 Then .StrIndex = intIxTbl
            .EndIndex = intIxTbl
        End With
        ' 祝日パラメータテーブル要素追加
        With g_tblHoliParamater(intIxTbl)
            .Getsu = intGetsu
            .SyoriKbn = intSyoriKbn
            .Hiduke = intHiduke
            .FurikaeKbn = intFurikaeKbn
            .HmSyusu = intHmSyusu
            .HmYobi = intHmYobi
            .SyukuNm = strSyukuNm
            .StrYear = intStrYear
            .EndYear = intEndYear
        End With
        ' テーブルINDEXを加算
        intIxTbl += 1
    End Sub

    '***********************************************************************************************
    ' ■■■ プロパティ ■■■
    '***********************************************************************************************
    '   バージョン(String)
    '-----------------------------------------------------------------------------------------------
    Friend ReadOnly Property Version() As String
        Get
            Return g_cnsVersion
        End Get
    End Property

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

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

'***************************************************************************************************
'   カレンダーテーブル用ユーザー定義代替クラス(clsTypClassCalendar2)
'***************************************************************************************************
Public Class clsTypClassCalendar2
    '===============================================================================================
    Public Hiduke As Date                   ' 日付
    Public Yobi As Integer                  ' 曜日(0=日、1=月、2=火~6=土)
    Public Syusu As Integer                 ' 週数(1始まりで日曜日発見時に1加算)
    Public HmSyusu As Integer               ' 週数(0=始まりで月曜日発見時に1加算) ※祝日法(HM)対応
    Public Holi As Integer                  ' 祝日判定(0=通常、1=祝日、2=振替休日、3=会社休日)
    Public Name As String                   ' 祝日名称
    Public FurikaeKbn As Integer            ' 振替区分(0=通常、1=振替休日を行なわない)
End Class

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

祝日パラメータ変更の対策
2019、2020、2021年のように祝日の変更が発生した場合の対策として、プログラム変更ではなく、 利用ユーザー(又はシステム管理者)側に設定変更等で対応してもらえないか、 という考え方もあると思います。

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

年間カレンダー作成

ここでは「祝日パラメータ」を設定に保持させて変更できるようにするというサンプルを用意しました。
このような登録状態の一覧表示と登録画面も搭載させています。
このサンプルでは「祝日パラメータ」はプログラム内の設定保持ですが、テキスト形式なので、ネットワークの完備している環境であれば共有サーバ上の環境にファイルとして保持させるような方法、Webサーバ上に保持させて読み取る方法も採れると思います。

この場合のテキスト形式の「祝日パラメータ」はこのような感じです。

....*....1....*....2....*....3....*....4
0100100000009999元旦
0101500000001999成人の日
0110002120009999成人の日
0201100019679999建国記念の日
0202300020209999天皇誕生日
0390000000009999春分の日
0402900000001988天皇誕生日
0402900019892006みどりの日
0402900020079999昭和の日
0500100020192019新天皇即位の日
0500300000009999憲法記念日
0500410019862006国民の休日
0500400020079999みどりの日
0500500000009999こどもの日
0702000019962002海の日
0710003120032019海の日
0702300020202020海の日
0702200020212021海の日
0710003120229999海の日
0702400020202020スポーツの日
0702300020212021スポーツの日
0801100020162019山の日
0801000020202020山の日
0800800020212021山の日
0801100020229999山の日
0901500000002002敬老の日
0910003120039999敬老の日
0990000000009999秋分の日
1001000019661999体育の日
1010002120002019体育の日
1010002120229999スポーツの日
1002200020192019即位礼正殿の儀
1100300000009999文化の日
1102300000009999勤労感謝の日
1202300019892018天皇誕生日
....*....1....*....2....*....3....*....4
この祝日パラメータ各行の内容
  1,2桁目:月(01~12)
    3桁目:処理区分(0=固定日、1=HappyMonday、2=会社休日、9=特殊)
  4,5桁目:[固定日]日付(01~31)
    6桁目:[固定日]振替有無(0=通常、1=振休無し)
    7桁目:[HappyMonday]第n週
    8桁目:[HappyMonday]曜日(1=月曜、月曜日以外不可)
 9-12桁目:開始年(不明は0000)
13-16桁目:終了年(不明は9999)
17桁目以降:祝日名
(緑字部分は説明のための記述で実際の設定パラメータ上にはありません。)
上で紹介している「カレンダー処理クラス(clsAboutCalendar2R)」については、 「clsAboutCalendar2VB」という名称に変更し、さらにモジュール部に祝日パラメータの宣言部分を移動させています。
変更箇所のみ掲載します。

'***************************************************************************************************
'   カレンダー及び日付処理(祝日含む)関連モジュール+クラス      modAboutCalendar2VB(Module)
'
'   作成者:井上治  URL:https://www.ne.jp/asahi/excel/inoue/ [Excelでお仕事!]
'***************************************************************************************************
'   ※カレンダーテーブル用ユーザー定義「clsTypClassCalendar2」はこのモジュールの一番下にあります
'   ※祝日パラメータは設定の「HoriParaText」から読み込まれます
'***************************************************************************************************
' 変更日付 Rev     変更履歴内容-------------------------------------------------------------------->
' 18/01/31(1.0.1.0)新規作成
' 18/02/07(1.0.2.0)祝日パラメータマスタの対応に仕様変更
' 18/02/07(1.0.2.0)祝日テーブル⇒カレンダーテーブルに用途変更、要素追記作成に変更
' 18/02/08(1.0.2.1)カレンダーテーブルに振替区分を追加する対応
' 18/02/09(1.0.2.2)「営業日数経過後営業日判定」の動作を改善
' 18/02/13(1.0.3.0)「年月日より日付を生成(DateSerial)」を追加
' 18/02/13(1.0.3.0)「前当翌3ヶ月のカレンダーテーブル作成」に当月開始・終了位置を追加
' 18/02/13(1.0.3.0)営業日算出関連に更新モード用プロシージャを追加(OverLoads)
' 18/02/13(1.0.3.0)ユーザー定義名変更(g_typCalendar2⇒g_typClassCalendar2)の対応
' 18/02/14(1.0.3.0)本クラス内での祝日パラメータテーブル作成を廃止(事前作成を前提とする)
' 18/02/15(1.0.3.0)GP_UpdateHolidaySUB1でのループ処理を廃止、振休・国休判定の動作を改善
' 18/02/16(1.0.3.0)祝日パラメータテーブルからの当月分切り出しを廃止して動作を改善
' 18/03/01(1.0.4.0)会社休日適用時に会社休日が振替休日や国民の休日と重なる時は法制休日を優先させる対応
' 18/03/08(1.0.5.0)月先頭が日曜日だと週数が2始まりになってしまう件を修正
' 18/03/30(1.0.6.0)カレンダーテーブル用ユーザー定義を「clsTypClassCalendar2(Class)」に変更
' 18/09/14(1.0.7.0)祝日パラメータテーブル作成をDB参照ではなく独自に行なうように変更
' 18/09/18(1.0.7.1)バージョン値、バージョン更新日を追加(プロパティも追加)
' 18/10/23(1.0.7.2)祝日パラメータテーブル要素追加の引数INDEXを廃止する対応(内部Static変数に変更)
' 18/11/17(1.0.7.3)カレンダーテーブル用ユーザー定義代替クラスをPublicスコープに変更
' 18/12/08(1.0.7.3)新天皇即位の日(5/1)、即位礼正殿の儀(10/22)を2019年限定で追加(名称は暫定)
' 18/12/16(1.0.8.0)祝日パラメータを設定から読み込む方法に変更、クラスとモジュール部を分離
'***************************************************************************************************
Friend Module modAboutCalendar2VB
    '===============================================================================================
    ' 祝日パラメータテーブル用ユーザー定義
    Friend Structure g_typHoliParamater
        Dim Getsu As Integer                ' 月
        Dim SyoriKbn As Integer             ' 処理区分(0=固定日、1=HappyMonday、2=会社休日、9=特殊)
        Dim Hiduke As Integer               ' [固定日]日(Date型ではない)
        Dim FurikaeKbn As Integer           ' [固定日]振替区分(0=通常、1=振替休日を行なわない)
        Dim HmSyusu As Integer              ' [HM]週数(第n週)
        Dim HmYobi As Integer               ' [HM]曜日(0=日、1=月、2=火~6=土)
        Dim SyukuNm As String               ' 祝日名
        Dim StrYear As Integer              ' 開始年(西暦)
        Dim EndYear As Integer              ' 終了年(西暦)
    End Structure
    ' 祝日パラメータテーブル(clsAboutCalendar2用)
    Friend g_tblHoliParamater() As g_typHoliParamater = Nothing    ' 祝日パラメータテーブル
End Module

'***************************************************************************************************
'   カレンダー及び日付処理(祝日含む)関連クラス                  clsAboutCalendar2VB(Class)
'***************************************************************************************************
Friend Class clsAboutCalendar2VB
    '===============================================================================================
    '  ↓↓↓ バージョン値、バージョン更新日は本クラスの変更を行なう時に必ず更新すること ↓↓↓
    Private Const g_cnsVersion As String = "1.0.8.0"                ' 本クラスのバージョン
    Private Const g_cnsVerUpdDate As Date = #12/16/2018#           ' バージョン更新日
    '  ↑↑↑ バージョン値、バージョン更新日は本クラスの変更を行なう時に必ず更新すること ↑↑↑
    '===============================================================================================
                             ・
                             ・
                          《中略》
                             ・
                             ・
    '***********************************************************************************************
    '* 処理名 :GP_MakeHoliParameter
    '* 機能  :祝日パラメータテーブル作成
    '-----------------------------------------------------------------------------------------------
    '* 返り値 :(なし)
    '* 引数  :(なし)
    '-----------------------------------------------------------------------------------------------
    '* 作成日 :2018年09月14日
    '* 作成者 :井上 治
    '* 更新日 :2018年12月16日
    '* 更新者 :井上 治
    '* 機能説明:祝日パラメータは設定「HoriParaText」から読み出されます
    '* 注意事項:
    '***********************************************************************************************
    Private Sub GP_MakeHoliParameter()
        '-------------------------------------------------------------------------------------------
        Dim tblHoliPara() As String = My.Settings.HoriParaText.Split(ControlChars.CrLf) ' 祝日パラ
        Dim intIx As Integer = 0                                    ' テーブルINDEX
        ' 祝日パラ月別範囲テーブルを一旦初期化
        For intIx = 1 To 12
            With g_tblHoliMonthIndex(intIx)
                .StrIndex = -1
                .EndIndex = -1
            End With
        Next intIx
        intIx = 0
        '-------------------------------------------------------------------------------------------
        ReDim g_tblHoliParamater(-1)
        '===========================================================================================
        ' 祝日パラメータを順次処理
        Do While intIx <= tblHoliPara.GetUpperBound(0)
            ' 祝日パラメータテーブル要素追加
            Call GP_ApendHoliParam(tblHoliPara(intIx).Trim)
            ' 次へ
            intIx += 1
        Loop
    End Sub

    '***********************************************************************************************
    '* 処理名 :GP_ApendHoliParam
    '* 機能  :祝日パラメータテーブル要素追加
    '-----------------------------------------------------------------------------------------------
    '* 返り値 :(なし)
    '* 引数  :Arg1 = 祝日パラメータレコード(String)
    '-----------------------------------------------------------------------------------------------
    '* 作成日 :2018年09月14日
    '* 作成者 :井上 治
    '* 更新日 :2018年12月16日
    '* 更新者 :井上 治
    '* 機能説明:
    '* 注意事項:テーブルINDEXは本処理側で加算されます
    '***********************************************************************************************
    Private Sub GP_ApendHoliParam(ByVal strHoliPara As String)
        '-------------------------------------------------------------------------------------------
        Static intIxTbl As Integer = 0                              ' テーブルINDEX
        ' ブランク(最終行)は除外
        If strHoliPara.Length = 0 Then Exit Sub
        ' 検証用途を含めて各区分値を一旦変数に取り出す
        Dim intGetsu As Integer = Integer.Parse(strHoliPara.Substring(0, 2)) ' 月
        Dim intSyoriKbn As Integer = Integer.Parse(strHoliPara.Substring(2, 1)) ' 処理区分
        Dim intHiduke As Integer = Integer.Parse(strHoliPara.Substring(3, 2)) ' 日付
        Dim intFurikaeKbn As Integer = Integer.Parse(strHoliPara.Substring(5, 1)) ' 振替区分
        Dim intHmSyusu As Integer = Integer.Parse(strHoliPara.Substring(6, 1)) ' [HM]週数
        Dim intHmYobi As Integer = Integer.Parse(strHoliPara.Substring(7, 1)) ' [HM]曜日
        Dim intStrYear As Integer = Integer.Parse(strHoliPara.Substring(8, 4)) ' 開始年
        Dim intEndYear As Integer = Integer.Parse(strHoliPara.Substring(12, 4)) ' 終了年
        Dim strSyukuNm As String = strHoliPara.Substring(16)        ' 祝日名
        ReDim Preserve g_tblHoliParamater(intIxTbl)
        ' 祝日パラ月別範囲テーブルを更新
        With g_tblHoliMonthIndex(intGetsu)
            ' 開始位置
            If .StrIndex < 0 Then .StrIndex = intIxTbl
            .EndIndex = intIxTbl
        End With
        ' 祝日パラメータテーブル要素追加
        With g_tblHoliParamater(intIxTbl)
            .Getsu = intGetsu
            .SyoriKbn = intSyoriKbn
            .Hiduke = intHiduke
            .FurikaeKbn = intFurikaeKbn
            .HmSyusu = intHmSyusu
            .HmYobi = intHmYobi
            .SyukuNm = strSyukuNm
            .StrYear = intStrYear
            .EndYear = intEndYear
        End With
        ' テーブルINDEXを加算
        intIxTbl += 1
    End Sub

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

ここではその他のソースコード等の紹介は割愛しますが、関心がある方はプロジェクトがダウンロードできるので、ダウンロードさせてご覧下さい。
このサンプルでは他ページで紹介しているDPI制御や、各フォームの出現位置や大きさの再現などの機能も取り入れています。

また、祝日パラメータを社内で一元化させたいという要望も多く寄せられており、VBAの方では「祝日パラメータを社内で一元化したい」でネットワーク上のテキストファイルから祝日パラメータを取り込む方法を紹介しています。
取り込むテキストファイルの内容はこのページで設定から取り込んでいるものと全く同じです。