VBA – 对多个切换按钮使用一次点击事件

VBA – Using One Click Event for Multiple Toggle Buttons

我在 1 sheet 上有一大堆切换按钮,我希望它们具有相同的 _click 事件。有没有一种方法可以在不为每个按钮编写新的 _click 函数的情况下做到这一点?

谢谢!

简答:没有。

更长的答案:不。 但是您不必copy/paste每个处理程序的整个逻辑。只需将该逻辑提取到它自己的 Private 方法中,然后从处理程序中调用它。

Private Sub RunToggleButtonLogic()
    'do stuff
End Sub

Private Sub ToggleButton1_Click()
    RunToggleButtonLogic
End Sub

Private Sub ToggleButton2_Click()
    RunToggleButtonLogic
End Sub

Private Sub ToggleButton3_Click()
    RunToggleButtonLogic
End Sub

Private Sub ToggleButton4_Click()
    RunToggleButtonLogic
End Sub

Private Sub ToggleButton5_Click()
    RunToggleButtonLogic
End Sub

...

原因是 VBA 是 COM,COM 事件使用接口(如 Java),而不是委托(如 C# 或 VB.NET)- 所以你不能 "assign" 事件的处理程序,它根本无法那样工作。

另一种方法是使用 class 模块来控制控件的事件...

1) 插入一个 class 模块(VBE > 插入 > Class 模块)。

2) 在名称下的属性 window 中,输入 clsToggleButtonGroup。

3) 将以下代码复制并粘贴到 class...

的代码模块中
Option Explicit

Public WithEvents ToggleButton As MSForms.ToggleButton

Private Sub ToggleButton_Click()
    MsgBox ToggleButton.Caption
    'do stuff
    '
    '
End Sub

4) 在常规模块(VBE > 插入 > 模块)中,复制并粘贴以下代码...

Option Explicit

Public colToggleButtons As New Collection

Sub AddToggleButtonsToClass()

    Dim OleObj As OLEObject
    Dim cToggleButton As clsToggleButtonGroup

    For Each OleObj In Worksheets("Sheet1").OLEObjects 'change the sheet name accordingly
        If TypeName(OleObj.Object) = "ToggleButton" Then
            Set cToggleButton = New clsToggleButtonGroup
            Set cToggleButton.ToggleButton = OleObj.Object
            colToggleButtons.Add cToggleButton
        End If
    Next OleObj

End Sub

5) 然后,运行 AddToggleButtonsToClass.