Attribute VB_Name = "Module1" '■ マクロ500連発<第2段> ' ' 開始日から起算した稼動日数を求める ' ' Copyright(C) 2000 Sunago ' '  開始日から起算した稼動日数は分析ツールで提供される ' Workday関数を利用して求めます。このマクロでは国民の祝日を ' 取得するモジュールを使って指定年の祝日を配列として取得し、 ' Workday関数の第3引数(holidays)に設定することで土日だけで ' なく、祝日を除いた20日後の営業日を求めます。 ' ' ※分析ツールのWorkday関数を利用するにはEXCELをインストール ' したフォルダの\Libary\AnaysisフォルダにあるAtpvbaen.xlaを ' 参照設定しておく必要があります(アドインマネージャで組み込 ' まない場合)。 Option Explicit Sub Macro1() Dim ret '使用方法: WorkDay(開始日, 日数, 祭日の配列定数) ret = Workday(Date, 20, fncNationalHoliday(99)) MsgBox Date & "の20日後の営業日は、" & _ Format$(ret, "yyyy/mm/dd") & "になります" End Sub Attribute VB_Name = "Module2" '■ マクロ500連発<第2段> ' ' 開始日から起算した稼動日数を求める ' (国民の祝日を取得するモジュール) ' ' Copyright(C) 2000 Sunago ' 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