Attribute VB_Name = "Module1" '■ マクロ500連発<第2段> ' ' 国民の祝日を取得する ' (自作関数呼び出しモジュール) ' '  国民の祝日を取得する自作関数を呼び出すには、 ' 引数に西暦年を指定します。自作関数を呼び出すと ' 戻り値としてバリアント型の配列形式で国民の ' 祝日を取得することができます。 ' ' Copyright(C) 2000 Sunago ' Option Explicit Sub Macro1() Dim sOutput As String Dim a '使用方法: fncNationalHoliday(西暦年) For Each a In fncNationalHoliday(Year(Date)) sOutput = sOutput & Format$(a, "yyyy/mm/dd") & vbCr Next MsgBox sOutput, , Year(Date) & "年の国民の祝日" End Sub Attribute VB_Name = "Module2" '■ マクロ500連発<第2段> ' ' 開始日から起算した稼動日数を求める ' (国民の祝日を取得するモジュール) ' ' Copyright(C) 2000 Sunago ' ' ※自作関数に会社等の休業日を追加するには作業用配列変数(vntHoliday) ' の要素数を増やし、任意の要素に休業日を格納します。 '  例えば、 9/1を休業日にするには、 ' vntHoliday(8) = DateSerial(Nen, 9, 1) の1行を追加し、 ' 要素8以降の番号を振りなおします。 ' Option Explicit '/* 国民の祝日を取得する関数 */ Public Function fncNationalHoliday(Nen As Integer) As Variant Dim vntHoliday() As Variant Dim vntDate As Variant Dim vntWeekday As Variant Dim i As Integer, maxi As Integer ReDim vntHoliday(13) '国民の休日数-1で再定義する If Nen < 100 Then Nen = Nen + 1900 '元日 vntHoliday(0) = DateSerial(Nen, 1, 1) '成人の日 If Nen >= 2000 Then vntDate = CVDate(Nen & "/1/1") vntHoliday(1) = DateAdd("d", 14 - WeekDay(vntDate, vbTuesday), vntDate) Else vntHoliday(1) = DateSerial(Nen, 1, 15) End If '建国記念の日 vntHoliday(2) = DateSerial(Nen, 2, 11) '春分の日※官報等で確認すること If Nen >= 1980 And Nen <= 2099 Then vntHoliday(3) = _ DateSerial(Nen, 3, _ Int(20.8431 + 0.242194 * (Nen - 1980) - _ Int((Nen - 1980) / 4))) ElseIf Nen >= 2100 And Nen <= 2150 Then vntHoliday(3) = _ DateSerial(Nen, 3, _ Int(21.851 + 0.242194 * (Nen - 1980) - _ Int((Nen - 1980) / 4))) End If 'みどりの日 vntHoliday(4) = DateSerial(Nen, 4, 29) '憲法記念日 vntHoliday(5) = DateSerial(Nen, 5, 3) 'こどもの日 vntHoliday(6) = DateSerial(Nen, 5, 5) '海の日 vntHoliday(7) = DateSerial(Nen, 7, 20) '敬老の日 vntHoliday(8) = DateSerial(Nen, 9, 15) '秋分の日※官報等で確認すること If Nen >= 1980 And Nen <= 2099 Then vntHoliday(9) = _ DateSerial(Nen, 9, _ Int(23.2488 + 0.242194 * (Nen - 1980) - _ Int((Nen - 1980) / 4))) ElseIf Nen >= 2100 And Nen <= 2150 Then vntHoliday(9) = _ DateSerial(Nen, 9, _ Int(24.2488 + 0.242194 * (Nen - 1980) - _ Int((Nen - 1980) / 4))) End If '体育の日 If Nen >= 2000 Then vntDate = CVDate(Nen & "/10/1") vntHoliday(10) = DateAdd("d", 14 - WeekDay(vntDate, vbTuesday), vntDate) Else vntHoliday(10) = DateSerial(Nen, 10, 15) End If '文化の日 vntHoliday(11) = DateSerial(Nen, 11, 3) '勤労感謝の日 vntHoliday(12) = DateSerial(Nen, 11, 23) '天皇誕生日 vntHoliday(13) = DateSerial(Nen, 12, 23) '国民の祝日が日曜日である翌日 maxi = UBound(vntHoliday) For i = 0 To maxi If WeekDay(vntHoliday(i)) = vbSunday Then ReDim Preserve vntHoliday(UBound(vntHoliday) + 1) vntHoliday(UBound(vntHoliday)) = DateAdd("d", 1, vntHoliday(i)) End If Next i '前日および翌日が国民の祝日である日の判定 '(日曜日、祝日の振替日を除く) vntWeekday = WeekDay(DateSerial(Nen, 5, 4)) If vntWeekday >= vbTuesday And vntWeekday <= vbSaturday Then ReDim Preserve vntHoliday(UBound(vntHoliday) + 1) vntHoliday(UBound(vntHoliday)) = DateSerial(Nen, 5, 4) End If 'Call Sort(vntHoliday) fncNationalHoliday = vntHoliday End Function