我正在尝试创建一个类,它将处理 Access 中的多个控制事件。这是为了避免重复输入多行相同的代码。
我遵循了位于下一页的答案,但进行了一些调整以使其更适合 Access 而不是 Excel。
How to assign a common procedure for multiple buttons?
我的类(class)代码如下:
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
我的表单代码如下:
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
我在评论中注意到我对(工作)Excel 代码进行了更改。我认为问题出在类中的对象声明上。注意:在此过程中不会抛出任何错误;它根本不会触发事件。
提前致谢!
编辑:
我已经将问题缩小到“点击”事件中没有“[事件过程]”。如果我手动添加它,类会按预期工作。显然,我不想手动添加这些 - 它会破坏对象。任何想法我会怎么做?
最佳答案
在您的 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
尽管我不确定这是否比在设计器中双击 OnClick 并粘贴到方法调用中的代码更少。不管怎样都爽。
编辑:
你可以像这样改变你的类(class)
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
然后在您的表单中,您可以添加这样的 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
现在事件处理程序被添加到类中。
关于class - 创建一个类来处理 Access 表单控件事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23522230/