繁体   English   中英

如何在 VBA 中手动触发工作表的 Activate 事件?

[英]How can I manually trigger the Activate event of a worksheet in VBA?

我有一个工作表:

Private Sub Worksheet_Activate()
    MsgBox "Ran"
End Sub

我在我的工具栏上有一个按钮。 我想要它做的是在当前选择的工作表上触发这个方法。

我想我可以执行Call ActiveWorksheet.ActivateCall 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM