我希望在按下任何工作表命令按钮时运行一段代码。我已经看到了类似用户表单的内容,但无法找到可以在(并且限于)工作表按钮上工作的东西。
我已经使用以下代码创建了一个名为clsCmdButton的类模块:
Private WithEvents cmdButton As MSForms.CommandButton
Private Sub cmdButton_Click()
'code i want to run
End Sub
然后我认为我需要循环遍历所有工作表,找到它上面的命令按钮并将每个工作表作为一个新的insance进行初始化。这可以在Workbook_Open事件中完成,但我不知道如何编写它。有人可以帮忙吗?
谢谢!
答案 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事件也意味着如果工作簿中的其他代码出现未处理的错误,它会更频繁地重置。