Access カレンダーFORM
コントローの配置 1段目 年を減算するコマンドボタン[PY] 年を表示するラベル[DYEAR] 年を加算するコマンドボタン[NY] 月を加算するコマンドボタン[PM] 月を表示するラベル[DMONTH] 月を加算するコマンドボタン[NM] 2段目~7段目 日にちを表示するラベル[Dx] xは0から41までの数字 1クリック目でラベルを窪み表示にして、窪み表示をクリックすると カレンダーは非表示になり、呼び出し元でプロパティ[DateNum][WeekNum] からシリアル値、Week値を取得します。 8段目 カレンダーを開いたときのデフォルト値に戻すコマンドボタン[bu初期] カレンダーを非表示して、呼び出し元でプロパティ[DateNum]の0を評価して 処理します。 カレンダーを閉じるコマンドボタン[bu閉じる]
'----------------------------------------------------------------
'カレンダー
'令和3年5月6日
'----------------------------------------------------------------
Option Compare Database
Option Explicit
Private WithEvents myControls As C_Controls
Private Const SHIFT_MASK As Long = 1
Private Const FirstYobi As Long = vbSunday
Private HoldDate As Long
Private HoldYear As Long
Private HoldMonth As Long
Private HoldDay As Long
Private Enum IncType
Forward = 1
Backward = -1
End Enum
Private GetYobi As C_KyuZitu
Private Const IntvDay As String = "d"
Private Const IntvMonth As String = "m"
Private Const IntvYear As String = "yyyy"
Private Const IntvWeek As String = "ww"
Private CurYear As Long
Private CurMonth As Long
Private CurDay As Long
Private DaysAndWeeks() As Long
Private Yobi As Variant
Private SelectDay As String
Public Property Get DateNum() As Long
If CurYear = 0 Then
DateNum = 0
Else
DateNum = DateSerial(CurYear, CurMonth, CurDay)
End If
End Property
Public Property Get WeekNum() As Long
GetYobi.SetNumDate = DateSerial(CurYear, CurMonth, CurDay)
WeekNum = GetYobi.WeekNum
End Property
'----------------------------------------------------------------
'
Private Sub Form_Load()
Dim Ctrl As Access.Control
Dim I As Long
If Nz(Me.OpenArgs, "") = "" Then
HoldDate = Date
Else
If IsDate(Me.OpenArgs) Then
HoldDate = DateSerial(DatePart("YYYY", Me.OpenArgs), _
DatePart("m", Me.OpenArgs), _
DatePart("d", Me.OpenArgs))
Else
HoldDate = Date
End If
End If
HoldYear = Year(HoldDate)
HoldMonth = Month(HoldDate)
HoldDay = Day(HoldDate)
Set GetYobi = New C_KyuZitu
GetYobi.pYear = HoldYear
CurYear = HoldYear
CurMonth = HoldMonth
CurDay = HoldDay
Set myControls = New C_Controls
With myControls
Set .Parent = Me
.Init
End With
Yobi = Array("日", "月", "火", "水", "木", "金", "土")
For I = 0 To 6
Me("Y" & I).Caption = Yobi((FirstYobi - 1 + I) Mod 7)
Select Case I
Case 0
Me("Y" & I).ForeColor = vbRed
Case 6
Me("Y" & I).ForeColor = vbBlue
End Select
Next I
Call SetCurDisp
Call DispDraw
End Sub
'----------------------------------------------------------------
'
Private Sub Form_Close()
End Sub
'----------------------------------------------------------------
'
Private Sub SetCurDisp()
Me.DMONTH.Caption = CurMonth
Me.DYEAR.Caption = CurYear
End Sub
'----------------------------------------------------------------
'
Private Sub DispDraw()
Dim Ctrl As Access.Control
Dim NewSelect As String
Dim OneDayYobi As Long
Dim OneDaySerial As Long
Dim I As Long
GetYobi.pYear = CurYear
'選択月の最初の日のシリアル値
OneDaySerial = DateSerial(CurYear, CurMonth, 1)
'選択月の最初の日の曜日
OneDayYobi = Weekday(OneDaySerial, FirstYobi)
'配列にシリアル値をセット
ReDim DaysAndWeeks(0 To 41)
For I = 0 To UBound(DaysAndWeeks)
DaysAndWeeks(I) = OneDaySerial - (OneDayYobi - 1) + I
Next I
'ラベルのキャプションに日にちをセット
For I = 0 To UBound(DaysAndWeeks)
Me("Day" & I).Caption = Day(DaysAndWeeks(I))
If Me.DMONTH.Caption <> Month(DaysAndWeeks(I)) Then
Me("Day" & I).FontSize = 10
Else
Me("Day" & I).FontSize = 12
End If
If Me("Day" & I).ForeColor <> InteriorColor(DaysAndWeeks(I)) Then
Me("Day" & I).ForeColor = InteriorColor(DaysAndWeeks(I))
End If
If DaysAndWeeks(I) = DateSerial(CurYear, CurMonth, CurDay) Then
NewSelect = "Day" & I
End If
Next I
Call EffectDraw(NewSelect)
End Sub
'----------------------------------------------------------------
'
Private Sub EffectDraw(NewSelect As String)
If Len(SelectDay) > 0 Then
If SelectDay <> NewSelect Then
Me(SelectDay).SpecialEffect = acNormal
End If
End If
SelectDay = NewSelect
Me(SelectDay).SpecialEffect = acEffectSunken
Me.Repaint
End Sub
'----------------------------------------------------------------
'
Private Function InteriorColor(DrawDate As Long) As Long
GetYobi.SetNumDate = DrawDate
Select Case GetYobi.WeekNum
Case 1, 10, 11, 12, 13
InteriorColor = vbRed
Case 7
InteriorColor = vbBlue
Case Else
InteriorColor = vbBlack
End Select
End Function
'----------------------------------------------------------------
'
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
Call ShiftKeys(KeyCode, Shift)
End Sub
'----------------------------------------------------------------
'
Private Sub myControls_Click(myCont As Object)
Select Case myCont.Name
Case "NM"
Me.buDummy.SetFocus
Call NextMonth
Case "NY"
Me.buDummy.SetFocus
Call NextYear
Case "PM"
Me.buDummy.SetFocus
Call PreviousMonth
Case "PY"
Me.buDummy.SetFocus
Call PreviousYear
Case "bu閉じる"
Me.buDummy.SetFocus
Call CloseForm(False)
Case "bu初期"
Me.buDummy.SetFocus
CurYear = HoldYear
CurMonth = HoldMonth
CurDay = HoldDay
Call SetCurDisp
Call DispDraw
Case "bu削除"
Me.buDummy.SetFocus
CurYear = 0
Call CloseForm(True)
Case Else
Select Case True
Case InStr(myCont.Name, "Day") = 1
If myCont.SpecialEffect = acEffectSunken Then
Call CloseForm(True)
Else
If CurMonth <> Month(DaysAndWeeks(Mid(myCont.Name, Len("Day") + 1))) Then
Call ClickDate(myCont.Name)
Call SetCurDisp
Call DispDraw
Else
Call EffectDraw(myCont.Name)
Call ClickDate(myCont.Name)
End If
End If
End Select
End Select
End Sub
'----------------------------------------------------------------
'
Private Sub myControls_DblClick(myCont As Object, Cancel As Integer)
Select Case True
Case InStr(myCont.Name, "Day") = 1
Call EffectDraw(myCont.Name)
Call ClickDate(myCont.Name)
Call CloseForm(True)
End Select
End Sub
'----------------------------------------------------------------
'
Private Sub myControls_KeyDown(myCont As Object, KeyCode As Integer, Shift As Integer)
Select Case myCont.Name
Case "PM", "NM", "PY", "NY", "bu閉じる", "bu初期", "bu削除"
Call ShiftKeys(KeyCode, Shift)
Case Else
Select Case True
Case InStr(myCont.Name, "Day") = 1
Call ShiftKeys(KeyCode, Shift)
End Select
End Select
End Sub
'----------------------------------------------------------------
'
Private Sub ShiftKeys(KeyCode As Integer, Shift As Integer)
Dim ShiftDown As Boolean
ShiftDown = ((Shift And SHIFT_MASK) > 0)
Select Case KeyCode
Case vbKeyEscape
Call CloseForm(Hide:=False)
Case vbKeyReturn
Call CloseForm(Hide:=True)
Case vbKeyHome
If ShiftDown Then
Call MoveToToday(False)
Else
Call MoveToToday(True)
End If
Case vbKeyPageUp
If ShiftDown Then
Call PreviousYear
Else
Call PreviousMonth
End If
Case vbKeyPageDown
If ShiftDown Then
Call NextYear
Else
Call NextMonth
End If
Case vbKeyRight
If ShiftDown Then
Call NextYear
Else
Call NextDay
End If
Case vbKeyLeft
If ShiftDown Then
Call PreviousYear
Else
Call PreviousDay
End If
Case vbKeyUp
If ShiftDown Then
Call PreviousMonth
Else
Call PreviousWeek
End If
Case vbKeyDown
If ShiftDown Then
Call NextMonth
Else
Call NextWeek
End If
End Select
KeyCode = 0
End Sub
'----------------------------------------------------------------
'
Public Sub Today()
Call MoveToToday(UseCurYear:=True)
End Sub
'----------------------------------------------------------------
'
Public Sub NextDay()
Call ChangeDate(IntvDay, IncType.Forward)
End Sub
'----------------------------------------------------------------
'
Public Sub NextMonth()
Call ChangeDate(IntvMonth, IncType.Forward)
End Sub
'----------------------------------------------------------------
'
Public Sub NextYear()
Call ChangeDate(IntvYear, IncType.Forward)
End Sub
'----------------------------------------------------------------
'
Public Sub NextWeek()
Call ChangeDate(IntvWeek, IncType.Forward)
End Sub
'----------------------------------------------------------------
'
Public Sub PreviousDay()
Call ChangeDate(IntvDay, IncType.Backward)
End Sub
'----------------------------------------------------------------
'
Public Sub PreviousMonth()
Call ChangeDate(IntvMonth, IncType.Backward)
End Sub
'----------------------------------------------------------------
'
Public Sub PreviousYear()
Call ChangeDate(IntvYear, IncType.Backward)
End Sub
'----------------------------------------------------------------
'
Public Sub PreviousWeek()
Call ChangeDate(IntvWeek, IncType.Backward)
End Sub
'----------------------------------------------------------------
'
Private Sub MoveToToday(UseCurYear As Boolean)
If UseCurYear Then
CurYear = HoldYear
End If
CurMonth = HoldMonth
CurDay = HoldDay
Call SetCurDisp
Call DispDraw
End Sub
'----------------------------------------------------------------
'
Private Sub ChangeDate(IntvStr As String, IT As IncType)
Dim bufMonth As Integer
Dim bufYear As Integer
Dim bufDay As Integer
Dim NewSelect As String
Dim OLDDate As Long
Dim NewDate As Long
Dim Inc As Long
Dim I As Long
If IT = Forward Then
Inc = 1
Else
Inc = -1
End If
OLDDate = DateSerial(CurYear, CurMonth, CurDay)
NewDate = DateAdd(IntvStr, Inc, OLDDate)
bufMonth = DatePart(IntvMonth, NewDate)
bufYear = DatePart(IntvYear, NewDate)
bufDay = DatePart(IntvDay, NewDate)
If CurMonth = bufMonth And _
CurYear = bufYear Then
CurDay = bufDay
For I = 0 To UBound(DaysAndWeeks)
If DaysAndWeeks(I) = DateSerial(CurYear, CurMonth, CurDay) Then
NewSelect = "Day" & I
End If
Next I
Call EffectDraw(NewSelect)
Else
CurDay = bufDay
CurMonth = bufMonth
CurYear = bufYear
Call SetCurDisp
Call DispDraw
End If
End Sub
'----------------------------------------------------------------
'
Private Sub CloseForm(Hide As Boolean)
If ThisFormSub() Then
Exit Sub
End If
If Hide Then
Me.Visible = False
Else
DoCmd.CLOSE acForm, Me.Name, acSaveNo
End If
End Sub
'----------------------------------------------------------------
'
Private Function ThisFormSub() As Boolean
Dim strName As String
On Error Resume Next
strName = Me.Parent.Name
ThisFormSub = (Err.Number = 0)
Err.Clear
End Function
'----------------------------------------------------------------
'
Private Sub ClickDate(ClickName As String)
Dim Num As Long
Num = Mid(ClickName, Len("Day") + 1)
CurYear = Year(DaysAndWeeks(Num))
CurMonth = Month(DaysAndWeeks(Num))
CurDay = Day(DaysAndWeeks(Num))
End Sub
C_Button
Option Explicit
'********************************************************************
Private WithEvents myButton As Access.CommandButton
Private myParent As C_Controls
Private myIndex As Long
'--------------------------------------------------------------------
'
Public Property Set Item(ByRef Obj As Access.CommandButton)
Set myButton = Obj
End Property
'--------------------------------------------------------------------
'
Public Property Get Item() As Access.CommandButton
Set Item = myButton
End Property
'--------------------------------------------------------------------
'
Public Property Set Parent(ByRef Obj As C_Controls)
Set myParent = Obj
End Property
'--------------------------------------------------------------------
'
Public Property Let Index(ByVal val As Long)
myIndex = val
End Property
'--------------------------------------------------------------------
'
Public Property Get Index() As Long
Index = myIndex
End Property
'--------------------------------------------------------------------
'
Public Property Get Self() As Object
Set Self = Me
End Property
'--------------------------------------------------------------------
'
Public Sub DEL()
Set myButton = Nothing
Set myParent = Nothing
End Sub
'--------------------------------------------------------------------
'
Private Sub Class_Terminate()
Set myButton = Nothing
Set myParent = Nothing
End Sub
'--------------------------------------------------------------------
'
Private Sub myButton_Click()
Call myParent.onClick(myButton)
End Sub
'--------------------------------------------------------------------
'
Private Sub myButton_DblClick(Cancel As Integer)
Call myParent.onDblClick(myButton, Cancel)
End Sub
'--------------------------------------------------------------------
'
Private Sub myButton_KeyDown(KeyCode As Integer, Shift As Integer)
Call myParent.onKeyDown(myButton, KeyCode, Shift)
End Sub
'--------------------------------------------------------------------
'
Private Sub myButton_MouseMove(Button As Integer, _
Shift As Integer, _
X As Single, _
Y As Single)
Call myParent.onMouseMove(myButton, Button, Shift, X, Y)
End Sub
C_CheckBox
Option Explicit
'********************************************************************
Private WithEvents myCheckBox As Access.CheckBox
Private myParent As C_Controls
Private myIndex As Long
'--------------------------------------------------------------------
'
Public Property Set Item(ByRef Obj As Access.CheckBox)
Set myCheckBox = Obj
End Property
'--------------------------------------------------------------------
'
Public Property Get Item() As Access.CheckBox
Set Item = myCheckBox
End Property
'--------------------------------------------------------------------
'
Public Property Set Parent(ByRef Obj As C_Controls)
Set myParent = Obj
End Property
'--------------------------------------------------------------------
'
Public Property Let Index(ByVal val As Long)
myIndex = val
End Property
'--------------------------------------------------------------------
'
Public Property Get Index() As Long
Index = myIndex
End Property
'--------------------------------------------------------------------
'
Public Property Get Self() As Object
Set Self = Me
End Property
'--------------------------------------------------------------------
'
Public Sub DEL()
Set myCheckBox = Nothing
Set myParent = Nothing
End Sub
'--------------------------------------------------------------------
'
Private Sub Class_Terminate()
Set myCheckBox = Nothing
Set myParent = Nothing
End Sub
'--------------------------------------------------------------------
'
Private Sub myCheckBox_Click()
Call myParent.onClick(myCheckBox)
End Sub
'--------------------------------------------------------------------
'
Private Sub myCheckBox_DblClick(Cancel As Integer)
Call myParent.onDblClick(myCheckBox, Cancel)
End Sub
'--------------------------------------------------------------------
'
Private Sub myCheckBox_MouseMove(Button As Integer, _
Shift As Integer, _
X As Single, _
Y As Single)
Call myParent.onMouseMove(myCheckBox, Button, Shift, X, Y)
End Sub
C_ComboBox
Option Explicit
'********************************************************************
Private WithEvents myCheckBox As Access.CheckBox
Private myParent As C_Controls
Private myIndex As Long
'--------------------------------------------------------------------
'
Public Property Set Item(ByRef Obj As Access.CheckBox)
Set myCheckBox = Obj
End Property
'--------------------------------------------------------------------
'
Public Property Get Item() As Access.CheckBox
Set Item = myCheckBox
End Property
'--------------------------------------------------------------------
'
Public Property Set Parent(ByRef Obj As C_Controls)
Set myParent = Obj
End Property
'--------------------------------------------------------------------
'
Public Property Let Index(ByVal val As Long)
myIndex = val
End Property
'--------------------------------------------------------------------
'
Public Property Get Index() As Long
Index = myIndex
End Property
'--------------------------------------------------------------------
'
Public Property Get Self() As Object
Set Self = Me
End Property
'--------------------------------------------------------------------
'
Public Sub DEL()
Set myCheckBox = Nothing
Set myParent = Nothing
End Sub
'--------------------------------------------------------------------
'
Private Sub Class_Terminate()
Set myCheckBox = Nothing
Set myParent = Nothing
End Sub
'--------------------------------------------------------------------
'
Private Sub myCheckBox_Click()
Call myParent.onClick(myCheckBox)
End Sub
'--------------------------------------------------------------------
'
Private Sub myCheckBox_DblClick(Cancel As Integer)
Call myParent.onDblClick(myCheckBox, Cancel)
End Sub
'--------------------------------------------------------------------
'
Private Sub myCheckBox_MouseMove(Button As Integer, _
Shift As Integer, _
X As Single, _
Y As Single)
Call myParent.onMouseMove(myCheckBox, Button, Shift, X, Y)
End Sub
C_Controls
Option Explicit
'*******************************************************************
Public Event Click(myCont As Object)
Public Event Change(myCont As Object)
Public Event DblClick(myCont As Object, _
Cancel As Integer)
Public Event MouseMove(myCont As Object, _
Button As Integer, _
Shift As Integer, _
X As Single, _
Y As Single)
Public Event KeyPress(myCont As Object, _
KeyAscii As Integer)
Public Event KeyDown(myCont As Object, _
KeyCode As Integer, _
Shift As Integer)
Private Labels As Dictionary
Private TextBoxs As Dictionary
Private CheckBoxs As Dictionary
Private ComboBoxs As Dictionary
Private Buttons As Dictionary
Private myParent As Object
'*******************************************************************
'
Public Property Set Parent(ByRef Obj As Object)
Set myParent = Obj
End Property
'*******************************************************************
'
Public Sub onClick(myCont As Object)
RaiseEvent Click(myCont)
End Sub
'*******************************************************************
'
Public Sub onDblClick(myCont As Object, Cancel As Integer)
RaiseEvent DblClick(myCont, Cancel)
End Sub
'*******************************************************************
'
Public Sub onMouseMove(myCont As Object, _
Button As Integer, _
Shift As Integer, _
X As Single, _
Y As Single)
RaiseEvent MouseMove(myCont, Button, Shift, X, Y)
End Sub
'*******************************************************************
'
Public Sub onChange(myCont As Object)
RaiseEvent Change(myCont)
End Sub
'*******************************************************************
'
Public Sub onKeyPress(myCont As Object, _
KeyAscii As Integer)
RaiseEvent KeyPress(myCont, KeyAscii)
End Sub
'--------------------------------------------------------------------
'
Public Sub onKeyDown(myCont As Object, _
KeyCode As Integer, _
Shift As Integer)
RaiseEvent KeyDown(myCont, KeyCode, Shift)
End Sub
'*******************************************************************
'
Public Sub Init()
Dim Ctrl As Control
Dim Obj As Object
If myParent Is Nothing Then
Exit Sub
End If
Set Labels = New Dictionary
Set TextBoxs = New Dictionary
Set CheckBoxs = New Dictionary
Set ComboBoxs = New Dictionary
Set Buttons = New Dictionary
For Each Ctrl In myParent.Controls
Select Case TypeName(Ctrl)
Case "TextBox"
With New C_TextBox
Set .Item = Ctrl
Set .Parent = Me
TextBoxs.Add Ctrl.Name, .Self
End With
Case "Label"
With New C_Label
Set .Item = Ctrl
Set .Parent = Me
Labels.Add Ctrl.Name, .Self
End With
Case "ComboBox"
With New C_ComboBox
Set .Item = Ctrl
Set .Parent = Me
ComboBoxs.Add Ctrl.Name, .Self
End With
Case "CheckBox"
With New C_CheckBox
Set .Item = Ctrl
Set .Parent = Me
CheckBoxs.Add Ctrl.Name, .Self
End With
Case "CommandButton"
With New C_Button
Set .Item = Ctrl
Set .Parent = Me
Buttons.Add Ctrl.Name, .Self
End With
End Select
Next Ctrl
End Sub
'*******************************************************************
'
Public Sub DEL()
Dim Keys As Variant
For Each Keys In TextBoxs
TextBoxs(Keys).DEL
Next Keys
Set TextBoxs = Nothing
For Each Keys In Labels
Labels(Keys).DEL
Next Keys
Set Labels = Nothing
For Each Keys In ComboBoxs
ComboBoxs(Keys).DEL
Next Keys
Set ComboBoxs = Nothing
For Each Keys In CheckBoxs
CheckBoxs(Keys).DEL
Next Keys
Set CheckBoxs = Nothing
For Each Keys In Buttons
Buttons(Keys).DEL
Next Keys
Set Buttons = Nothing
Set myParent = Nothing
End Sub
C_TextBox
Option Explicit
'********************************************************************
Private WithEvents myLabel As Access.Label
Private myParent As C_Controls
Private myIndex As Long
'--------------------------------------------------------------------
'
Public Property Set Item(ByRef Obj As Access.Label)
Set myLabel = Obj
End Property
'--------------------------------------------------------------------
'
Public Property Get Item() As Access.Label
Set Item = myLabel
End Property
'--------------------------------------------------------------------
'
Public Property Set Parent(ByRef Obj As C_Controls)
Set myParent = Obj
End Property
'--------------------------------------------------------------------
'
Public Property Let Index(ByVal val As Long)
myIndex = val
End Property
'--------------------------------------------------------------------
'
Public Property Get Index() As Long
Index = myIndex
End Property
'--------------------------------------------------------------------
'
Public Property Get Self() As Object
Set Self = Me
End Property
'--------------------------------------------------------------------
'
Public Sub DEL()
Set myLabel = Nothing
Set myParent = Nothing
End Sub
'--------------------------------------------------------------------
'
Private Sub Class_Terminate()
Set myLabel = Nothing
Set myParent = Nothing
End Sub
'--------------------------------------------------------------------
'
Private Sub myLabel_Click()
Call myParent.onClick(myLabel)
End Sub
'--------------------------------------------------------------------
'
Private Sub myLabel_DblClick(Cancel As Integer)
Call myParent.onDblClick(myLabel, Cancel)
End Sub
'--------------------------------------------------------------------
'
Private Sub myLabel_MouseMove(Button As Integer, _
Shift As Integer, _
X As Single, _
Y As Single)
Call myParent.onMouseMove(myLabel, Button, Shift, X, Y)
End Sub
C_TextBox
Option Explicit
'********************************************************************
Private WithEvents myTextBox As Access.TextBox
Private myParent As C_Controls
Private myIndex As Long
'--------------------------------------------------------------------
'
Public Property Set Item(ByRef Obj As Access.TextBox)
Set myTextBox = Obj
End Property
'--------------------------------------------------------------------
'
Public Property Get Item() As Access.TextBox
Set Item = myTextBox
End Property
'--------------------------------------------------------------------
'
Public Property Set Parent(ByRef Obj As C_Controls)
Set myParent = Obj
End Property
'--------------------------------------------------------------------
'
Public Property Let Index(ByVal val As Long)
myIndex = val
End Property
'--------------------------------------------------------------------
'
Public Property Get Index() As Long
Index = myIndex
End Property
'--------------------------------------------------------------------
'
Public Property Get Self() As Object
Set Self = Me
End Property
'--------------------------------------------------------------------
'
Public Sub DEL()
Set myTextBox = Nothing
Set myParent = Nothing
End Sub
'--------------------------------------------------------------------
'
Private Sub Class_Terminate()
Set myTextBox = Nothing
Set myParent = Nothing
End Sub
'--------------------------------------------------------------------
'
Private Sub myTextBox_Change()
Call myParent.onChange(myTextBox)
End Sub
'--------------------------------------------------------------------
'
Private Sub myTextBox_DblClick(Cancel As Integer)
Call myParent.onDblClick(myTextBox, Cancel)
End Sub
'--------------------------------------------------------------------
'
Private Sub myTextBox_KeyPress(KeyAscii As Integer)
Call myParent.onKeyPress(myTextBox, KeyAscii)
End Sub
'--------------------------------------------------------------------
'
Private Sub myTextBox_MouseMove(Button As Integer, _
Shift As Integer, _
X As Single, _
Y As Single)
Call myParent.onMouseMove(myTextBox, Button, Shift, X, Y)
End Sub
C_Kyuzituクラス
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) Mod 7), "成人の日"
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) Mod 7), "海の日"
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) Mod 7), "敬老の日"
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) Mod 7), "スポーツの日"
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