年間カレンダーの作成2

「祝日情報を含めたカレンダーを」というリクエストは大変多いのです。

     GP_GetHoliday_Sub  20192021退
 
 

 
 ()  
 
   2
 

 ()
 
使
 

 
 




年間カレンダー作成のイメージ ()
 
A4
 
 
作成した年間カレンダーのイメージ 20PC  
 
 




「営業日数関連」シート
   
 




「祝日パラメータ」シート
 
 A    
 4  198819892006  2007
 719962002720  200373
 20202021202023()202122()202273
 

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


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


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




「祝日パラメータ」シート
 
 
 
   
 
 
05_AboutCalendar1().xlsm  12/291/3  
 
12/2912/311/21/3  1/2()
 
L1
 調  
 調
 
L1
 





 
オブジェクト 用途等
「祝日パラメータ」シート 上記のワークシートで、実行側ではこのシートは非表示にしておいて構いません。
modAboutCalendar2 月間カレンダーテーブルのユーザー定義や公開プロシージャ(起動部分)が収容されています。
clsAboutCalendar2 祝日パラメータテーブルや公開プロシージャ(実動作部分)を含む全機能が収容されています。
   
 
COBOL0    03130
 
(modAboutCalendar2)4
 
プロシージャID 説明
FP_InitAboutCalendar カレンダー関連関数クラス初期化
[戻値]処理結果(※祝日設定などで不備があると Falseが返る)
[引数]①チェック工程スキップ(Option)
          ②強制再初期化スイッチ(Option)
※クラスが生成され、祝日パラメータテーブルが作成される
※本処理は各カレンダー作成時に初期化済みかの確認で呼び出される他、
    ワークブックを開いた時と祝日パラメータシートからの戻り時にも呼び出すようにしています。
FP_GetCalendarTable1 カレンダーテーブル作成(当月1ヶ月用)
[戻値]処理結果(※祝日設定などで不備があると Falseが返る)
[引数]①年
         ②月
         ③カレンダーテーブルが返される
         ④チェック工程スキップ(Option)
※カレンダー関連関数クラスが初期化済でない時は本処理から初期化される
GP_GetCalendarTable1 カレンダーテーブル作成(当月1ヶ月用)
[戻値]※なし
[引数]①年
         ②月
         ③カレンダーテーブルが返される
※カレンダー関連関数クラスが初期化済であること(本処理内では判定しない)
FP_GetCalendarTable3 カレンダーテーブル作成(当月+前後の3ヶ月用)
[戻値]処理結果(※祝日設定などで不備があると Falseが返る)
[引数]①年
         ②月
         ③カレンダーテーブルが返される
         ④当月開始位置INDEXが返される(Option)
         ⑤当月終了位置INDEXが返される(Option)
         ⑥チェック工程スキップ(Option)
※カレンダー関連関数クラスが初期化済でない時は本処理から初期化される
GP_GetCalendarTable3 カレンダーテーブル作成(当月+前後の3ヶ月用)
[戻値]※なし
[引数]①年
         ②月
         ③カレンダーテーブルが返される
         ④当月開始位置INDEXが返される(Option)
         ⑤当月終了位置INDEXが返される(Option)
※カレンダー関連関数クラスが初期化済であること(本処理内では判定しない)
FP_SumEigyoNissu 営業日数算出(土日祝日を除外)
[戻値]処理結果(※祝日設定などで不備があると Falseが返る)
[引数]①期間開始日
         ②期間終了日
         ③営業日数が返される
         ④歴日数が返される(Option)
         ⑤チェック工程スキップ(Option)
※カレンダー関連関数クラスが初期化済でない時は本処理から初期化される
FP_SumEigyoBi 営業日数経過後営業日算出(土日祝日を除外)
[戻値]処理結果(※祝日設定などで不備があると Falseが返る)
[引数]①起算日
         ②経過営業日数(マイナス可)
         ③算出結果(営業日日付)が返される
         ④チェック工程スキップ(Option)
※カレンダー関連関数クラスが初期化済でない時は本処理から初期化される
   True
 (FP_InitAboutCalendar)Workbook_Open
 
(modAboutCalendar2)
 g_typCalendar2
 
 (clsAboutCalendar2)  (clsAboutCalendar2)

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

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

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

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

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

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

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

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

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

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