EXCELのC_Label、ACCESSと仕様が異なります
'-------------------------------------------------------------------
Private WithEvents myLabel As MSForms.Label
Private myParent As C_ObjControl
Private myIndex As Long
'-------------------------------------------------------------------
Private Sub Class_Terminate()
Set myLabel = Nothing
Set myParent = Nothing
End Sub
'--------------------------------------------------------------------
Public Property Let Item(ByRef val As MSForms.Label)
Set myLabel = val
End Property
'--------------------------------------------------------------------
Public Property Get Item() As MSForms.Label
Set Item = myLabel
End Property
'--------------------------------------------------------------------
Public Property Let Parent(ByRef val As Object)
Set myParent = val
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
'--------------------------------------------------------------------
Private Sub myLabel_Click()
Call myParent.onClick(myIndex)
End Sub
'--------------------------------------------------------------------
Private Sub myLabel_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Cancel = True
Call myParent.onDblClick(myIndex)
End Sub
'--------------------------------------------------------------------
Private Sub myLabel_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Call myParent.onMouseMove(myIndex)
End Sub
プリントプレビューをフォームに表示
Option Explicit
'*******************************************************************
Private Type Posi
Top As Double
Left As Double
End Type
Public Event Click(ByVal Index As Long)
Public Event DblClick(ByVal Index As Long)
Public Event MouseMove(ByVal Index As Long)
Private Obj() As C_Label
Private DefPosi() As Posi
Private myItems As Object
Private myParent As Object
Private AllRows As Long
Private AllColumns As Long
Private AllTop As Double
Private AllLeft As Double
Private HIntv As Double
Private VIntv As Double
Private LabCount As Long
Private Size As Long
Private PHeight As Double
Private PWidth As Double
Private offrow As Double
Private offcol As Double
'*******************************************************************
Public Property Let Parent(ByRef val As Object)
Set myParent = val
End Property
'--------------------------------------------------------------------
Public Property Get Items() As Object
Set Items = myItems
End Property
'--------------------------------------------------------------------
Public Property Let Rows(ByVal val As Long)
AllRows = val
AllColumns = 0
End Property
'--------------------------------------------------------------------
Public Property Let Columns(ByVal val As Long)
AllColumns = val
AllRows = 0
End Property
'--------------------------------------------------------------------
Public Property Let Top(ByVal val As Double)
AllTop = val
End Property
'--------------------------------------------------------------------
Public Property Let Count(ByVal val As Double)
LabCount = val
End Property
'--------------------------------------------------------------------
Public Property Let Left(ByVal val As Double)
AllLeft = val
End Property
'--------------------------------------------------------------------
Public Property Let HoriIntv(ByVal val As Double)
HIntv = val
End Property
'--------------------------------------------------------------------
Public Property Let VertIntv(ByVal val As Double)
VIntv = val
End Property
'--------------------------------------------------------------------
Public Property Let Height(ByVal val As Double)
PHeight = val
End Property
'--------------------------------------------------------------------
Public Property Get Height() As Double
Height = PHeight
End Property
'--------------------------------------------------------------------
Public Property Let Width(ByVal val As Double)
PWidth = val
End Property
'--------------------------------------------------------------------
Public Property Get Width() As Double
Width = PWidth
End Property
'--------------------------------------------------------------------
Public Property Let FontSize(ByVal val As Long)
Size = val
End Property
'--------------------------------------------------------------------
Private Sub Class_Initialize()
AllRows = 0
AllColumns = 0
AllTop = 0
AllLeft = 0
HIntv = 0
VIntv = 0
PHeight = 0
PWidth = 0
LabCount = 0
Size = 10
End Sub
'--------------------------------------------------------------------
Private Sub Class_Terminate()
Dim I As Long
For I = 1 To UBound(Obj)
Set Obj(I) = Nothing
Next I
Set myParent = Nothing
Set myItems = Nothing
End Sub
'--------------------------------------------------------------------
Public Sub onClick(ByVal Index As Long)
RaiseEvent Click(Index)
End Sub
'--------------------------------------------------------------------
Public Sub onDblClick(ByVal Index As Long)
RaiseEvent DblClick(Index)
End Sub
'--------------------------------------------------------------------
Public Sub onMouseMove(ByVal Index As Long)
RaiseEvent MouseMove(Index)
End Sub
'--------------------------------------------------------------------
Public Sub Init(ByRef Dic As Object)
Dim Ctrl As Control
Dim I As Long
Dim Key As Variant
If Dic.Count > 0 Then
LabCount = Dic.Count
End If
If LabCount = 0 Then
Exit Sub
End If
Set myItems = New Collection
ReDim Obj(1 To Dic.Count)
ReDim DefPosi(1 To Dic.Count)
With myParent
I = 1
'-----
For Each Key In Dic.keys
'-----コントロールの追加
Set Ctrl = .Controls.Add("Forms.Label.1", Dic(Key))
'-----コントロールの整形
With Ctrl
.Visible = True
'.Enabled = False
.Caption = Dic(Key)
If AllRows > 0 Then
.Top = AllTop + ((I - 1) Mod AllRows) * (PHeight + VIntv)
.Left = AllLeft + ((I - 1) \ AllRows) * (PWidth + HIntv)
End If
If AllColumns > 0 Then
.Top = AllTop + ((I - 1) \ AllColumns) * (PHeight + VIntv)
.Left = AllLeft + ((I - 1) Mod AllColumns) * (PWidth + HIntv)
End If
.Font.Size = Size
.Height = PHeight
.Width = PWidth
.SpecialEffect = fmSpecialEffectRaised
DefPosi(I).Top = .Top
DefPosi(I).Left = .Left
End With
'-----コントロールのイベントクラスの作成
Set Obj(I) = New C_Label
With Obj(I)
.Item = Ctrl
.Index = Key
.Parent = Me
End With
myItems.Add Obj(I)
I = I + 1
Next Key
End With
End Sub
'*******************************************************************
Public Sub OffSet(ByVal offtop As Double, _
ByVal offleft As Double)
Dim I As Long
For I = 1 To UBound(Obj)
With Obj(I).Item
.Top = DefPosi(I).Top + offtop
.Left = DefPosi(I).Left + offleft
End With
Next I
End Sub
フォームの値をテーブルにセット
Option Compare Database
Private Sub buクリア_Click()
Call CtrlClear
End Sub
Private Sub bu移動_Click()
Me.SUB1.SetFocus
DoCmd.GoToRecord , , acNewRec
Me.SUB1.Form.SelHeight = 1
Call CtrlClear
Me.ID.Value = "新規"
End Sub
Private Sub bu検索_Click()
Dim whereSQL As String
For Each Ctrl In Me.Controls
If TypeName(Ctrl) = "TextBox" Then
If Ctrl.Value <> "" Then
If whereSQL = "" Then
whereSQL = " A.[" & Ctrl.Name & "] Like '*" & Ctrl & "*'"
Else
whereSQL = whereSQL & " AND A.[" & Ctrl.Name & "] Like '*" & Ctrl & "*'"
End If
End If
End If
Next Ctrl
Me.SUB1.Form.RecordSource = "SELECT * FROM 連絡先 AS A WHERE" & whereSQL & ";"
End Sub
Private Sub bu更新_Click()
Dim tableSQL As String
Dim valueSQL As String
Dim mySQL As String
Dim Ctrl As Access.Control
Dim I As Long
If Nz(Me.ID, "") = "" Then
Exit Sub
End If
If Me.ID = "新規" Then
Call ADDNEW
Exit Sub
'追加
For Each Ctrl In Me.Controls
If TypeName(Ctrl) = "TextBox" Then
Select Case Ctrl.Name
Case "ID", "添付ファイル"
Case Else
If tableSQL = "" Then
tableSQL = Ctrl.Name
valueSQL = "'" & Ctrl.Value & "'"
Else
tableSQL = tableSQL & ", " & Ctrl.Name
valueSQL = valueSQL & ", '" & Ctrl.Value & "'"
End If
End Select
End If
Next Ctrl
mySQL = "INSERT INTO 連絡先(" & tableSQL & ") VALUES(" & valueSQL & ");"
DoCmd.RunSQL mySQL
Me.SUB1.Requery
Me.ID.Value = DMax("ID", "連絡先")
Else
Call UPDATE
Exit Sub
'更新
For Each Ctrl In Me.Controls
If TypeName(Ctrl) = "TextBox" Then
Select Case Ctrl.Name
Case "ID", "添付ファイル"
Case Else
If tableSQL = "" Then
tableSQL = Ctrl.Name & "='" & Ctrl.Value & "'"
Else
tableSQL = tableSQL & ", " & Ctrl.Name & "='" & Ctrl.Value & "'"
End If
End Select
End If
Next Ctrl
mySQL = "UPDATE 連絡先 SET " & tableSQL & "WHERE 連絡先.[ID]=" & Me.ID & ";"
DoCmd.RunSQL mySQL
Me.SUB1.Requery
End If
End Sub
Private Sub bu閉じる_Click()
DoCmd.Close acForm, Me.Name, acSaveNo
End Sub
Private Sub Form_Load()
Me.SUB1.SourceObject = "検索SUB"
Me.SUB1.Form.RecordSource = "SELECT * FROM 連絡先;"
End Sub
Private Sub CtrlClear()
Dim Ctrl As Access.Control
For Each Ctrl In Me.Controls
If TypeName(Ctrl) = "TextBox" Then
Ctrl.Value = ""
End If
Next Ctrl
End Sub
Private Sub UPDATE()
Dim CN As ADODB.Connection
Dim RS As New ADODB.Recordset
Dim Ctrl As Access.Control
Set CN = CurrentProject.Connection
RS.Open "連絡先", CN, adOpenKeyset, adLockOptimistic, adCmdTableDirect
Let RS.Index = "Ind"
RS.Seek Me.ID, adSeekFirstEQ
For Each Ctrl In Me.Controls
Select Case TypeName(Ctrl)
Case "TextBox"
Select Case Ctrl.Name
Case "ID"
Case Else
RS.Fields(Ctrl.Name) = Ctrl.Value
End Select
Case "Attachment"
End If
Next Ctrl
RS.UPDATE
RS.Close
Set RS = Nothing
CN.Close
Set CN = Nothing
Me.SUB1.Requery
End Sub
Private Sub ADDNEW()
Dim CN As ADODB.Connection
Dim RS As New ADODB.Recordset
Dim Ctrl As Access.Control
Set Con = CurrentProject.Connection
Set Rst = New ADODB.Recordset
Rst.Open "連絡先", Con, adOpenForwardOnly, adLockPessimistic
With Rst
.ADDNEW
For Each Ctrl In Me.Controls
Select Case TypeName(Ctrl)
Case "TextBox"
Select Case Ctrl.Name
Case "ID"
Case Else
RS.Fields(Ctrl.Name) = Ctrl.Value
End Select
Case "Attachment"
End If
Next Ctrl
.UPDATE
End With
Rst.Close
Set Rst = Nothing
Set Con = Nothing
Me.SUB1.Requery
Me.ID.Value = DMax("ID", "連絡先")
End Sub
Private Sub クリア2()
Call ClearControls
End Sub
Private Sub 閉じる2()
DoCmd.Close acForm, "住所録", acSaveNo
End Sub
Sub ClearControls()
Dim Ctl As Control
For Each Ctl In Me.Controls
If Ctl.ControlType = acTextBox Then
Ctl = Null
End If
Next Ctl
End Sub
Private Sub cmd追加2()
'[追加]ボタンクリック時
'フォームのレコードセットの編集を開始
Me.Recordset.Edit
'商品写真フィールドのレコードセットに対する操作
With Me.Recordset!商品写真.Value
.ADDNEW
!FileData.LoadFromFile "c:\Picture\img17.jpg"
.UPDATE
.Close
End With
'添付ファイルコントロールの表示を更新
Me!商品写真.Requery
End Sub
サブフォームのセレクタをクリックして親フォームにレコードの値をセット
Option Compare Database
Private Sub Form_Click()
Dim Ctrl As Access.Control
If Me.SelHeight > 0 Then
For Each Ctrl In Me.Controls
Select Case TypeName(Ctrl)
Case "TextBox"
If Ctrl.Name = "ID" Then
If Nz(Ctrl.Value, "") = "" Then
'Me.Parent.Controls(Ctrl.Name).Value = DMax(Ctrl.Name, "連絡先") + 1
Me.Parent.Controls(Ctrl.Name).Value = "新規"
Else
Me.Parent.Controls(Ctrl.Name).Value = Ctrl.Value
End If
Else
Me.Parent.Controls(Ctrl.Name).Value = Ctrl.Value
End If
End Select
Next Ctrl
End If
End Sub
Access カレンダーFORM
'----------------------------------------------------------------
'カレンダー
'令和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), "成人の日"
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