[英]Worksheet.Activate does not trigger the Worksheet_Activate event
[英]How can I manually trigger the Activate event of a worksheet in VBA?
我有一个工作表:
Private Sub Worksheet_Activate()
MsgBox "Ran"
End Sub
我在我的工具栏上有一个按钮。 我想要它做的是在当前选择的工作表上触发这个方法。
我想我可以执行Call ActiveWorksheet.Activate
或Call Worksheet.Activate
但是虽然这些似乎没有错误地执行,但没有调用该方法。
作为一种解决方法,我考虑添加一个公共DoActivate
方法,但它似乎有点蹩脚,我可能不得不摆弄CallByName
才能使其工作(开发人员必须记住在每个工作表上实现此方法)。
为什么我的 Activate 方法没有通过上面的代码手动调用,或者有合适的解决方法来获得我正在寻找的东西?
您可以通过以下方式调用任何活动工作表的激活事件(不知道其名称):
在ThisWorkbook
代码模块中创建下一个事件。 或者,简单复制以下代码。 请注意此类事件尚不存在:
Public Sub Workbook_SheetActivate(ByVal Sh As Object)
MsgBox Sh.Name & " activated..."
'the necessary code here...
End Sub
然后,通过以下方式从标准模块调用它:
ThisWorkbook.Workbook_SheetActivate ActiveSheet
如果你想排除一些工作表,你可以调整事件代码来做到这一点:
If sh.Name <> "MySheetName" then
MsgBox Sh.Name & " activated..."
'the necessary code here...
End if
如果应排除许多工作表,则应构建工作表名称数组并使用Application.Match
来区分使用其事件的工作表和其他工作表。
将您的代码移动到名为 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 的好方法)
如果你想保证所有的工作表都具有相同的方法,那么你可以让它们实现一个接口:例如
类模块: 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.