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.
我在 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.