Excel-VBA捕获所有工作表CommandButton单击事件以运行通用代码

时间:2017-10-11 11:37:40

标签: excel vba excel-vba

我希望在按下任何工作表命令按钮时运行一段代码。我已经看到了类似用户表单的内容,但无法找到可以在(并且限于)工作表按钮上工作的东西。

我已经使用以下代码创建了一个名为clsCmdButton的类模块:

Private WithEvents cmdButton As MSForms.CommandButton

Private Sub cmdButton_Click()
'code i want to run
End Sub

然后我认为我需要循环遍历所有工作表,找到它上面的命令按钮并将每个工作表作为一个新的insance进行初始化。这可以在Workbook_Open事件中完成,但我不知道如何编写它。有人可以帮忙吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

我会像这样修改你的课程:

Private WithEvents m_ctlButton As MSForms.CommandButton

Private Sub Class_Terminate()

    Set m_ctlButton = Nothing

End Sub


Private Sub m_ctlButton_Click()
'code i want to run
End Sub

Public Property Set Button(ctlButton As MSForms.CommandButton)

    Set m_ctlButton = ctlButton

End Property

我们假设这是Class1,因为我懒惰。

现在在新模块中添加:

Option Explicit
Dim colButtons As Collection
Sub hookButtons(ws As Object)
    Dim oBtn As Class1
    Dim obj As OLEObject
    Set colButtons = New Collection
    For Each obj In ws.OLEObjects
        If TypeOf obj.Object Is MSForms.CommandButton Then
            Set oBtn = New Class1
            Set oBtn.Button = obj.Object
            colButtons.Add oBtn
        End If
    Next
End Sub

最后,在ThisWorkbook模块中,添加:

Private Sub Workbook_Open()
    hookButtons ActiveSheet
End Sub

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    hookButtons Sh
End Sub

由于您无法在未激活其工作表的情况下单击按钮,因此在任何给定时间仅挂钩活动工作表的按钮似乎更容易。使用sheetActivate事件也意味着如果工作簿中的其他代码出现未处理的错误,它会更频繁地重置。