重新激活工作簿后执行操作

时间:2018-12-19 14:35:30

标签: excel vba excel-vba excel-2013

我有一个工作簿,其中的按钮可以通过VBA打开其他工作簿。

我的理解是,当我在其中时,这个初始工作簿(简称为Hub工作簿)既是ThisWorkbook又是ActiveWorkbook。

通过其中一个按钮打开另一个工作簿后,新打开的工作簿将变为ActiveWorkbook。

当我再次单击集线器时,它再次变为ActiveWorkbook。

仅当集线器恢复为活动工作簿的状态时,我才想执行操作。

我尝试通过在工作表上执行操作来执行此操作,但是如果它是唯一的工作表,则不会执行此操作,而我只是从另一个工作簿上单击就可以了。如果我有两个工作表,然后单击返回该工作表,就可以。

Private Sub Worksheet_Activate()
 MsgBox "Worksheet Reactivated"
End Sub

我似乎无法按要求运行它,但是我敢肯定必须有某种方法来做到这一点。

任何帮助将不胜感激。

谢谢

1 个答案:

答案 0 :(得分:9)

Worksheet模块(例如Sheet1)是一种特殊的类模块,它继承了Worksheet类的成员,并让您可以轻松处理为{ {1}}对象。在运行时,该Worksheet模块代表了Sheet1类的非常特定的 instance -因此,您在该模块中实现的任何事件处理程序仅会针对触发的事件进行调用来自那个对象。

因此,Worksheet后面代码中的Worksheet_Activate处理程序仅在Sheet1对象触发其Sheet1事件时运行。

如果您不关心任何特定或特定的工作表,则需要处理不同级别的事件:Activate模块是一种特殊类型的类模块,它继承了{{1 }}类,让您可以轻松处理为ThisWorkbook对象定义的事件。此工作簿对象始终表示承载您所在的VBA项目的特定工作簿,而不代表其他工作簿。

只要任何工作表(无论是WorkbookWorkbook工作表还是任何其他类型的对象,Workbook对象都会触发SheetActivate事件表格)已激活-您可以通过相应处理程序的Worksheet参数获取已激活的表格。

Chart对象在成为Sh时也会触发自己的Workbook事件。

好像您要处理Activate事件。试用您可以在ActiveWorkbook模块中获得的处理程序,看看最适合您的要求。

Workbook的代码窗格左上方的组合框中选择ThisWorkbook,然后从右侧的组合框中选择一个事件,以使VBE自动生成事件处理程序具有正确签名的原型:

ThisWorkbook code pane dropdowns

如果您需要处理Workbook范围内的事件,那么事情会涉及到更多点,但是问题的关键是您需要具有一个声明以下内容的类模块(可以是ThisWorkbookApplication变量:

ThisWorkbook

现在,左上角的下拉列表将列出WithEvents,并且选中该选项后,右上角的下拉列表将允许您选择一个Private WithEvents App As Excel.Application 事件来处理...只要您{{1} } App对象变量到有效的Excel.Application引用,例如,在Set处理程序中:

App

例如,现在您可以处理激活任何工作簿时触发的事件。