- ホーム
- Other
- clickdatasheet
Accessデータシートビューのセルクリックで詳細フォームを表示する
Accessデータシートビューのレコードセレクタ以外のセル?をクリックした時に詳細フォームが表示される様にしてみた
短いコードですが、疑似コントロール配列からの脱却をしてます。
'☆データシートビューのUserFormモジュール
Option Compare Database
Option Explicit
'データシートビューの各セル=テキストボックスを管理する親クラスを設定
'任意のセルがクリックされた時にイベントを起こすためのクラス
'フィールドの数だけクリックイベントを書いても良いのだが汎用化にトライ
Private WithEvents tbHdlCls As textboxHandleClass
Private Sub Form_Load()
Me.DatasheetFontHeight = 9
'データシートビューの各セル=テキストボックスを管理する親クラスを設定
Set tbHdlCls = New textboxHandleClass
Set tbHdlCls.Form = Me
End Sub
'Record Selectorをクリックした時のみ動作(任意のセル中では無効)
Private Sub Form_Click()
openById ID
End Sub
'個々のセルがクリックされた時、親クラス経由でイベント発報
Private Sub tbHdlCls_rowClick()
openById ID
End Sub
Private Sub openById(ID As Variant)
DoCmd.OpenForm "FT_table1", acNormal, , "ID=" & ID, acFormEdit, acWindowNormal
End Sub
'☆親クラス textboxHandleClass:データシートビューの各セル=テキストボックス群を管理する親クラス
'行=TextBox群がクリックされた時のイベント
Public Event rowClick()
'親UserFormを保持
Dim myForm As Object
'詳細セクションのテキストボックスを引き継ぐクラスモジュールのメモリを確保
Dim myControls() As exControlClass
'フォームがセットされているかのフラグ
Dim myFlagFormSet As Boolean
Public Property Get flagFormSet() As Boolean
flagFormSet = myFlagFormSet
End Property
Public Property Set Form(newForm As Object)
Dim myControl As Control
Set myForm = newForm
myFlagFormSet = True
ReDim myControls(0 To 0)
For Each myControl In myForm.Section(0).Controls
If TypeName(myControl) = "TextBox" Then
ReDim Preserve myControls(0 To UBound(myControls) + 1)
Set myControls(UBound(myControls)) = New exControlClass
myControls(UBound(myControls)).setTextBox myControl, UBound(myControls)
Set myControls(UBound(myControls)).parent = Me
End If
Next myControl
End Property
'子クラスモジュールがクリックされた時に呼ばれるプロシージャ
Sub controlslClicked(myObj As exControlClass)
RaiseEvent rowClick
End Sub
'☆子クラス exControlClass:データシートビューの各セル=テキストボックスを保持
Private WithEvents myTextBox As TextBox
Private myIndex As Long 'クリックした列を取得したかった時の名残
Private myParent As Object
Public Sub setTextBox(newTextBox As TextBox, newIndex As Long)
Set myTextBox = newTextBox
'これがミソで、これを入れないとClickイベントがクラスに引き継がれない
myTextBox.OnClick = "[Event Procedure]"
myIndex = newIndex
End Sub
Private Sub myTextBox_Click()
'Meを渡しているのは、クリック列を取得したかった時の名残
Call myParent.controlslClicked(Me)
End Sub
Public Property Set parent(newParent As Object)
Set myParent = newParent
End Property