VBAからGDI+を使う資料集
inet上の達人の方々から御教示いただいたコードを少しアレンジさせてもらっています(切り貼りとも言います)。
  1. ホーム
  2. Other
  3. 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