创建一个类来处理访问表单控制事件

Jim*_*ket 5 events ms-access vba class commandbutton

我正在尝试创建一个类来处理 Access 中的多个控制事件。这是为了避免重复键入多行相同的代码。

我已遵循下一页上的答案,但进行了一些调整以使其适合 Access 而不是 Excel。

如何为多个按钮分配一个通用的程序?

我的班级代码如下:

Option Compare Database

Public WithEvents ct As Access.CommandButton 'Changed object type to something recognised by Access

Public Sub ct_Click()
    MsgBox ct.Name & " clicked!"
End Sub
Run Code Online (Sandbox Code Playgroud)

我的表单代码如下:

Option Compare Database
Private listenerCollection As New Collection
Private Sub Form_Load()
Dim ctItem
Dim listener As clListener

For Each ctItem In Me.Controls
    If ctItem.ControlType = acCommandButton Then 'Changed to test whether control is a Command Button
        Set listener = New clListener
        Set listener.ct = ctItem
        listenerCollection.Add listener
    End If
Next

End Sub
Run Code Online (Sandbox Code Playgroud)

我已在注释中指出我对(工作)Excel 代码进行了更改。我认为问题出在类中的对象声明上。注意:在此过程中不会引发任何错误;它根本不会触发该事件。

提前致谢!

编辑:

此后,我将问题范围缩小到“单击”事件中没有“[事件过程]”。如果我手动添加它,该类将按预期工作。显然,我不想手动添加这些 - 它会破坏对象。有什么想法我该怎么做吗?

Bra*_*rad 4

在您的 OnLoad 事件中,您可以添加此行

Dim ctItem
Dim listener As clListener

For Each ctItem In Me.Controls
    If ctItem.ControlType = acCommandButton Then 'Changed to test whether control is a Command Button
        Set listener = New clListener
        Set listener.ct = ctItem
        listener.ct.OnClick = "[Event Procedure]"  '<------- Assigned the event handler
        listenerCollection.Add listener
    End If
Next
Run Code Online (Sandbox Code Playgroud)

尽管我不确定这是否比双击设计器中的 OnClick 并粘贴方法调用的代码更多还是更少。无论如何,这很酷。

编辑: 你可以这样改变你的班级

Public WithEvents ct As Access.CommandButton 'Changed object type to something recognised by Access

Public Function AddControl(ctrl as Access.CommandButton) as Access.CommandButton
    set ct = ctrl
    ct.OnClick = "[Event Procedure]"
    Set AddControl = ct
End Function

Public Sub ct_Click()
    MsgBox ct.Name & " clicked!"
End Sub
Run Code Online (Sandbox Code Playgroud)

然后在你的表单中你可以添加一个像这样的ct

For Each ctItem In Me.Controls
    If ctItem.ControlType = acCommandButton Then 'Changed to test whether control is a Command Button
        Set listener = New clListener
        listener.AddControl ctItem
        listenerCollection.Add listener
    End If
Next
Run Code Online (Sandbox Code Playgroud)

现在事件处理程序已添加到类中。