Option Explicit '============================================= ' 日付に対応した祝日や曜日を返す関数 ' HOLIDAY(DATE(yyyy,mm,dd)[,オプション]) ' ' オプション = 0〜3 ' 0 祝日判定(TRUE/FALSE) ' 1 祝日名表示(曜日名なし) ' 2 祝日名表示(曜日名あり) ' 3 省略祝日名表示 '============================================= Function HOLIDAY(日付 As Date, Optional オプション As Integer = 1) Dim HDayName(16) As String Dim HDayList(16) As Date Dim TempDate As Date Dim iYear As Integer Dim i As Integer
If 日付 = 0 Then HOLIDAY = CVErr(xlErrValue) Exit Function End If iYear = Year(日付)
'祝日の設定 HDayName(0) = "元日" HDayList(0) = DateSerial(iYear, 1, 1) HDayName(1) = "成人の日" If iYear >= 2000 Then TempDate = DateSerial(iYear, 1, 6) HDayList(1) = DateSerial(iYear, 1, 15 - Weekday(TempDate)) Else HDayList(1) = DateSerial(iYear, 1, 15) End If HDayName(2) = "建国記念の日" HDayList(2) = DateSerial(iYear, 2, 11) HDayName(3) = "春分の日" HDayList(3) = DateSerial(iYear, 3, Fix(20.8431 _ + 0.242194 * (iYear - 1980) - Fix((iYear - 1980) / 4))) HDayName(4) = IIf(iYear >= 2007, "昭和の日", IIf(iYear >= 1989, "みどりの日", "天皇誕生日")) HDayList(4) = DateSerial(iYear, 4, 29) HDayName(5) = "メーデー" HDayList(5) = DateSerial(iYear, 5, 1) HDayName(6) = "憲法記念日" HDayList(6) = DateSerial(iYear, 5, 3) HDayName(7) = IIf(iYear >= 2007, "みどりの日", IIf(iYear >= 1985, "国民の休日", "")) TempDate = DateSerial(iYear, 5, 4) HDayList(7) = IIf(Weekday(TempDate) <= 2, 0, TempDate) HDayName(8) = "こどもの日" HDayList(8) = DateSerial(iYear, 5, 5) HDayName(9) = "海の日" If iYear >= 2003 Then TempDate = DateSerial(iYear, 7, 6) HDayList(9) = DateSerial(iYear, 7, 22 - Weekday(TempDate)) ElseIf iYear >= 1996 Then HDayList(9) = DateSerial(iYear, 7, 20) Else HDayList(9) = 0 End If HDayName(10) = "敬老の日" If iYear >= 2003 Then TempDate = DateSerial(iYear, 9, 6) HDayList(10) = DateSerial(iYear, 9, 22 - Weekday(TempDate)) Else HDayList(10) = DateSerial(iYear, 9, 15) End If HDayName(12) = "秋分の日" HDayList(12) = DateSerial(iYear, 9, Fix(23.2488 _ + 0.242194 * (iYear - 1980) - Fix((iYear - 1980) / 4))) HDayName(11) = "国民の休日" HDayList(11) = IIf(iYear >= 2003 And _ HDayList(12) - HDayList(10) = 2, HDayList(10) + 1, 0) HDayName(13) = "体育の日" If iYear >= 2000 Then TempDate = DateSerial(iYear, 10, 6) HDayList(13) = DateSerial(iYear, 10, 15 - Weekday(TempDate)) Else HDayList(13) = DateSerial(iYear, 10, 10) End If HDayName(14) = "文化の日" HDayList(14) = DateSerial(iYear, 11, 3) HDayName(15) = "勤労感謝の日" HDayList(15) = DateSerial(iYear, 11, 23) HDayName(16) = "天皇誕生日" HDayList(16) = IIf(iYear >= 1989, DateSerial(iYear, 12, 23), 0) '祝日の判断 For i = 0 To 16 If 日付 = HDayList(i) Then Select Case オプション Case 0 HOLIDAY = True Case 1, 2 HOLIDAY = HDayName(i) Case 3 HOLIDAY = "祝" End Select Exit Function End If Next i '振替休日の判断 If Weekday(日付) = vbMonday Then For i = 0 To 16 If 日付 - 1 = HDayList(i) Then Select Case オプション Case 0 HOLIDAY = True Case 1, 2 HOLIDAY = "振替休日" Case 3 HOLIDAY = "振" End Select Exit Function End If Next i End If '祝日が見つからなかったときの処理 Select Case オプション Case 0 HOLIDAY = False Case 1 HOLIDAY = "" Case 2 HOLIDAY = WeekdayName(Weekday(日付)) Case 3 HOLIDAY = WeekdayName(Weekday(日付), True) End Select End Function