我有一个工作表:
Private Sub Worksheet_Activate()
MsgBox "Ran"
End Sub
我制作的工具栏上有一个按钮。我想要它做的是在当前选定的 WorkSheet 上触发此方法。我想我可以做
Call ActiveWorksheet.Activate
或 Call Worksheet.Activate
但是虽然这些似乎执行没有错误,但没有调用该方法。作为一种解决方法,我考虑添加一个公共(public)
DoActivate
方法,但它似乎有点蹩脚,我可能不得不摆弄CallByName
让它工作(并且开发人员必须记住在每个工作表上实现此方法)。我的 Activate 方法没有通过上面的代码手动调用,或者没有合适的解决方法来获得我正在寻找的东西,是否有原因?
最佳答案
将您的代码移动到名为 OnActivate 的新 Sub
Private Sub Worksheet_Activate()
OnActivate
End Sub
Private Sub OnActivate() 'or Public if you call from another module
MsgBox "Ran"
End Sub
Worksheet_Activate()
可以通过 Worksheet_Activate
从模块内部手动调用事件处理程序像任何其他潜艇一样(尽管这不是 IMO 的好方法)如果您想确保所有工作表具有相同的方法,那么您可以让它们实现一个接口(interface):例如
类(class)模块:
IActivateHandler
Public Sub OnActivate()
End Sub
然后在 Sheet1、2、3 等中:Implements IActivateHandler
Private Sub IActivateHandler_OnActivate()
MeOnActivate
End Sub
Private Sub Worksheet_Activate()
MeOnActivate
End Sub
Private Sub MeOnActivate()
MsgBox "Ran"
End Sub
和按钮:Private Sub Button1_Click()
Dim sheetToCall As IActivateHandler
' Debug.Assert TypeOf ActiveSheet Is IActivateHandler
Set sheetToCall = ActiveSheet 'gets the IActivateHandler of the sheet, ensuring it is defined. Will error if it isn't
sheetToCall.OnActivate 'runs the IActivateHandler_OnActivate() method of sheet1
End Sub
关于excel - 如何在 VBA 中手动触发工作表的激活事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69883396/