COPY
Option Compare Database
Option Explicit
Private Enum YobiType
Shuku = 10
Kokumin = 11
Hurikae = 12
Kanrei = 13
End Enum
Private memShukuzitu As Dictionary
Private memKokumin As Dictionary
Private memHurikae As Dictionary
Private memKanrei As Dictionary
Private memYear As Long
Private memMonth As Long
Private memDay As Long
Private memFormat As String
Public Property Let pYear(val As Long)
Call KyuzituSet(val)
End Property
Public Property Get pYear() As Long
pYear = memYear
End Property
Public Property Let SetStrDate(val As String)
If IsDate(val) Then
Call KyuzituSet(CLng(DatePart("yyyy", val)))
memMonth = CLng(DatePart("m", val))
memDay = CLng(DatePart("d", val))
Else
Call KyuzituSet(1900)
memMonth = 1
memDay = 1
End If
End Property
Public Property Let SetNumDate(val As Long)
Call KyuzituSet(Year(val))
memMonth = Month(val)
memDay = Day(val)
End Property
Public Property Let FormatFormat(val As String)
memFormat = val
End Property
Public Property Get GetStrDate() As String
GetStrDate = Format(DateSerial(memYear, memMonth, memDay), memFormat)
End Property
Public Property Get WeekNum() As Long
WeekNum = Yobi
End Property
Public Property Get DateNum() As Long
DateNum = DateSerial(memYear, memMonth, memDay)
End Property
Private Sub Class_Initialize()
Call KyuzituSet(Year(Date))
memMonth = Month(Date)
memDay = Day(Date)
End Sub
Private Sub Class_Terminate()
Set memShukuzitu = Nothing
Set memKokumin = Nothing
Set memHurikae = Nothing
Set memKanrei = Nothing
End Sub
Private Function Yobi() As Long
If memShukuzitu.Exists(DateNum) Then
Yobi = YobiType.Shuku
Exit Function
End If
If memKokumin.Exists(DateNum) Then
Yobi = YobiType.Kokumin
Exit Function
End If
If memHurikae.Exists(DateNum) Then
Yobi = YobiType.Kanrei
Exit Function
End If
If memKanrei.Exists(DateNum) Then
Yobi = YobiType.Kanrei
Exit Function
End If
Yobi = Weekday(DateNum, vbSunday)
End Function
'---------------------------------------
Private Sub KyuzituSet(NewYear As Long)
If memYear <> NewYear Then
memYear = NewYear
Call makeShukuzitu
Call makeKokumin
Call makeHurikae
Call makeKanrei
End If
End Sub
'---------------------------------------ロング値で与えられた日付の休日判定を行ないます。
Private Sub makeShukuzitu()
Dim iDay As Long
Set memShukuzitu = Nothing
Set memShukuzitu = New Dictionary
'----------元日
If DateSerial(memYear, 1, 1) > DateSerial(1948, 7, 19) Then
memShukuzitu.Add DateSerial(memYear, 1, 1), "元旦"
End If
'----------成人の日 1月15日 → 1月の第2月曜
If memYear > 1949 And memYear < 2000 Then
memShukuzitu.Add DateSerial(memYear, 1, 15), "成人の日"
ElseIf memYear > 1999 Then
memShukuzitu.Add DateSerial(memYear, 1, 14) - Weekday(DateSerial(memYear, 1, 14), vbTuesday), "成人の日"
End If
'----------建国記念の日
If DateSerial(memYear, 2, 11) > DateSerial(1948, 7, 19) Then
memShukuzitu.Add DateSerial(memYear, 2, 11), "建国記念の日"
End If
'----------天皇誕生日
If memYear > 2019 Then
memShukuzitu.Add DateSerial(memYear, 2, 23), "天皇誕生日"
End If
'----------春分の日
'int(19.8277+0.242194*(年-1980)-int((年-1983)/4)) ----------1851-1899年通用
'int(20.8357+0.242194*(年-1980)-int((年-1983)/4)) ----------1900-1979年通用
'int(20.8431+0.242194*(年-1980)-int((年-1980)/4)) ----------1980-2099年通用
'int(21.8510+0.242194*(年-1980)-int((年-1980)/4)) ----------2100-2150年通用
Select Case memYear
Case Is < 2100
iDay = Int(20.8431 + 0.242194 * (memYear - 1980) - Int((memYear - 1980) / 4))
Case Is >= 2100
iDay = Int(20.851 + 0.242194 * (memYear - 1980) - Int((memYear - 1980) / 4))
End Select
If DateSerial(memYear, 3, iDay) > DateSerial(1948, 7, 19) Then
memShukuzitu.Add DateSerial(memYear, 3, iDay), "春分の日"
End If
'----------天皇誕生日→みどりの日→昭和の日
If DateSerial(memYear, 4, 29) > DateSerial(1948, 7, 19) Then
memShukuzitu.Add DateSerial(memYear, 4, 29), "昭和の日"
End If
'----------即位の礼
If memYear = 2019 Then
memShukuzitu.Add DateSerial(memYear, 5, 1), "即位の礼"
End If
'----------憲法記念日
If DateSerial(memYear, 5, 3) > DateSerial(1948, 7, 19) Then
memShukuzitu.Add DateSerial(memYear, 5, 3), "憲法記念日"
End If
'----------みどりの日
If memYear > 2006 Then
memShukuzitu.Add DateSerial(memYear, 5, 4), "みどりの日"
End If
'----------こどもの日
If DateSerial(memYear, 5, 5) > DateSerial(1948, 7, 19) Then
memShukuzitu.Add DateSerial(memYear, 5, 5), "こどもの日"
End If
'----------海の日 7月20日 → 7月の第3月曜日
If memYear > 1995 And memYear < 2003 Then
memShukuzitu.Add DateSerial(memYear, 7, 20), "海の日"
ElseIf memYear > 2002 Then
If memYear = 2020 Then
'オリンピックイヤー
memShukuzitu.Add DateSerial(memYear, 7, 23), "海の日"
ElseIf memYear = 2021 Then
'オリンピックイヤー
memShukuzitu.Add DateSerial(memYear, 7, 22), "海の日"
Else
memShukuzitu.Add DateSerial(memYear, 7, 21) - Weekday(DateSerial(memYear, 7, 21), vbTuesday), "海の日"
End If
End If
'----------山の日"
If memYear > 2015 Then
If memYear = 2020 Then
'オリンピックイヤー
memShukuzitu.Add DateSerial(memYear, 8, 10), "山の日"
ElseIf memYear = 2021 Then
'オリンピックイヤー
memShukuzitu.Add DateSerial(memYear, 8, 8), "山の日"
Else
memShukuzitu.Add DateSerial(memYear, 8, 11), "山の日"
End If
End If
'----------敬老の日 9月15日 → 9月の第3月曜日
If memYear > 1965 And memYear < 2003 Then
memShukuzitu.Add DateSerial(memYear, 9, 15), "敬老の日"
ElseIf memYear > 2002 Then
memShukuzitu.Add DateSerial(memYear, 9, 21) - Weekday(DateSerial(memYear, 9, 21), vbTuesday), "敬老の日"
End If
'----------秋分の日
'int(22.2588+0.242194*(年-1980)-int((年-1983)/4)) ----------1851-1899年通用
'int(23.2588+0.242194*(年-1980)-int((年-1983)/4)) ----------1900-1979年通用
'int(23.2488+0.242194*(年-1980)-int((年-1980)/4)) ----------1980-2099年通用
'int(24.2488+0.242194*(年-1980)-int((年-1980)/4)) ----------2100-2150年通用
Select Case memYear
Case Is < 2100
iDay = Int(23.2488 + 0.242194 * (memYear - 1980) - Int((memYear - 1980) / 4))
Case Is >= 2100
iDay = Int(24.2488 + 0.242194 * (memYear - 1980) - Int((memYear - 1980) / 4))
End Select
If DateSerial(memYear, 9, iDay) > DateSerial(1948, 7, 19) Then
memShukuzitu.Add DateSerial(memYear, 9, iDay), "秋分の日"
End If
'----------体育の日 → スポーツの日 10月10日 → 10月の第二月曜日
If memYear > 1965 And memYear < 2000 Then
memShukuzitu.Add DateSerial(memYear, 10, 10), "体育の日"
ElseIf memYear > 1999 Then
If memYear = 2020 Then
'オリンピックイヤー
memShukuzitu.Add DateSerial(memYear, 7, 24), "スポーツの日"
ElseIf memYear = 2021 Then
'オリンピックイヤー
memShukuzitu.Add DateSerial(memYear, 7, 23), "スポーツの日"
Else
memShukuzitu.Add DateSerial(memYear, 10, 14) - Weekday(DateSerial(memYear, 10, 14), vbTuesday), "スポーツの日"
End If
End If
'----------即位礼正殿の儀
If memYear = 2019 Then
memShukuzitu.Add DateSerial(memYear, 10, 22), "即位礼正殿の儀"
End If
'----------文化の日
If DateSerial(memYear, 11, 3) > DateSerial(1948, 7, 19) Then
memShukuzitu.Add DateSerial(memYear, 11, 3), "文化の日"
End If
'----------勤労感謝の日
If DateSerial(memYear, 11, 23) > DateSerial(1948, 7, 19) Then
memShukuzitu.Add DateSerial(memYear, 11, 23), "勤労感謝の日"
End If
'----------天皇誕生日
If memYear > 1988 And memYear < 2019 Then
memShukuzitu.Add DateSerial(memYear, 12, 23), "天皇誕生日"
End If
End Sub
Private Sub makeKokumin()
Dim D() As Long
Dim Keys As Variant
Dim iCount As Long
Dim I As Long
Dim J As Long
Dim Target As Long
If memShukuzitu.Count = 0 Then
Exit Sub
End If
If memYear < 1988 Then
Exit Sub
End If
Set memKokumin = Nothing
Set memKokumin = New Dictionary
'-------------------------------国民の休日の判定
ReDim D(memShukuzitu.Count - 1)
For Each Keys In memShukuzitu
D(iCount) = Keys
iCount = iCount + 1
Next
For I = 0 To UBound(D)
For J = 0 To UBound(D)
'-----------------------該当の組み合わせがある場合
If D(J) - D(I) = 2 Then
Target = (D(J) + D(I)) / 2
If Not memShukuzitu.Exists(Target) Then
memKokumin.Add Target, "休日"
End If
End If
Next J
Next I
End Sub
Private Sub makeHurikae()
Dim iDay As Long
Dim fDay As Long
Dim boHurikae As Boolean
If memShukuzitu.Count = 0 Then
Exit Sub
End If
If memYear < 1973 Then
Exit Sub
End If
Set memHurikae = Nothing
Set memHurikae = New Dictionary
For iDay = DateSerial(memYear, 1, 1) To DateSerial(memYear, 12, 31)
'---------------------------日曜日であること
If Weekday(iDay) = 1 Then
'-------------------祝日であること
If memShukuzitu.Exists(iDay) Then
boHurikae = True
fDay = iDay
End If
End If
'---------------------------フラッグを立てた後、最初の祝日でない日を振替日とする
If boHurikae = True Then
If iDay > fDay Then
'-------------------祝休日に該当しない場合、振替日にする
If Not memShukuzitu.Exists(iDay) Then
memHurikae.Add iDay, "振替"
boHurikae = False
End If
End If
End If
Next iDay
End Sub
Private Sub makeKanrei()
Set memKanrei = Nothing
Set memKanrei = New Dictionary
'-----------------------------------慣例になっている休日
With memKanrei
.Add DateSerial(memYear, 1, 1), "慣例"
.Add DateSerial(memYear, 1, 2), "慣例"
.Add DateSerial(memYear, 1, 3), "慣例"
.Add DateSerial(memYear, 12, 31), "慣例"
End With
End Sub