自定义按钮事件处理类

时间:2018-03-23 06:27:10

标签: vba excel-vba access-vba excel

1)我有一个带有一些按钮的表单(在Access中,但我想它也适用于Excel)。

2)我有一个自定义类,可以帮助我调试该表单(以及我可能添加的未来表单)。

该类只是在表单事件触发时记录,例如加载,卸载,脏,退出。

我希望该课程能够在点击按钮时记录。

我知道这可以通过使用标准模块并在那里加载公共集合来完成。或直接使用表单的事件。或者通过存储在表单后面的集合中。

但是,如果可能的话,我想在我的调试类中将 all 封装起来。然后将它添加到我添加的每个新表单的Form_Load事件中的简单两行。

下面的简化尝试仅捕获在类集合中添加的 last 按钮的事件,即。 BUTTON3。

TestButtons(包含Button1,Button2和Button3的表单)

Private Buttons As CButtons

Private Sub Form_Load()
    Set Buttons = New CButtons
    Buttons.LoadButtons Me
End Sub

CButtons(Class):

Public WithEvents btn As Access.CommandButton
Private AllButtons As Collection

Const MODE_DEBUG As Boolean = True

Public Sub LoadButtons(ByRef TheForm As Access.Form)

    Dim ctl As Control

    Set AllButtons = New Collection
    For Each ctl In TheForm.Controls
        If ctl.ControlType = acCommandButton Then
            Set btn = ctl
            btn.OnClick = "[Event Procedure]"
            AllButtons.Add btn
        End If
    Next ctl

End Sub

Private Sub btn_Click()
    If MODE_DEBUG Then debug.print btn.Name & "_Click"
End Sub

想知道是否有人有任何建议,谢谢!

1 个答案:

答案 0 :(得分:1)

您无法处理集合中的事件。最简单的解决方案是使用一个单独的类来处理按钮事件,在多个按钮处理程序中创建这些类的集合,并将处理单个按钮的类中的按钮传递给处理事件上多个类的类。

Class CSingleButton

Public buttonsHandler As CButtons
Public WithEvents btn As Access.CommandButton

Private Sub btn_Click()
    buttonsHandler.HandleClick btn
End Sub

Class CButtons

Private ButtonHandlers As Collection

Const MODE_DEBUG As Boolean = True

Public Sub LoadButtons(ByRef TheForm As Access.Form)

    Dim ctl As Control
    Dim btnHandler As CSingleButton
    Set ButtonHandlers = New Collection
    For Each ctl In TheForm.Controls
        If ctl.ControlType = acCommandButton Then
            Set btnHandler = New CSingleButton
            Set btnHandler.btn = ctl
            Set btnHandler.buttonsHandler = Me
            ctl.OnClick = "[Event Procedure]"
            ButtonHandlers.Add btnHandler
        End If
    Next ctl

End Sub

Public Sub HandleClick(btn As Access.CommandButton)
    If MODE_DEBUG Then debug.print btn.Name & "_Click"
End Sub