我有一个工作簿,其中的按钮可以通过VBA打开其他工作簿。
我的理解是,当我在其中时,这个初始工作簿(简称为Hub工作簿)既是ThisWorkbook又是ActiveWorkbook。
通过其中一个按钮打开另一个工作簿后,新打开的工作簿将变为ActiveWorkbook。
当我再次单击集线器时,它再次变为ActiveWorkbook。
仅当集线器恢复为活动工作簿的状态时,我才想执行操作。
我尝试通过在工作表上执行操作来执行此操作,但是如果它是唯一的工作表,则不会执行此操作,而我只是从另一个工作簿上单击就可以了。如果我有两个工作表,然后单击返回该工作表,就可以。
Private Sub Worksheet_Activate()
MsgBox "Worksheet Reactivated"
End Sub
我似乎无法按要求运行它,但是我敢肯定必须有某种方法来做到这一点。
任何帮助将不胜感激。
谢谢
答案 0 :(得分:9)
Worksheet
模块(例如Sheet1
)是一种特殊的类模块,它继承了Worksheet
类的成员,并让您可以轻松处理为{ {1}}对象。在运行时,该Worksheet
模块代表了Sheet1
类的非常特定的 instance -因此,您在该模块中实现的任何事件处理程序仅会针对触发的事件进行调用来自那个对象。
因此,Worksheet
后面代码中的Worksheet_Activate
处理程序仅在Sheet1
对象触发其Sheet1
事件时运行。
如果您不关心任何特定或特定的工作表,则需要处理不同级别的事件:Activate
模块是一种特殊类型的类模块,它继承了{{1 }}类,让您可以轻松处理为ThisWorkbook
对象定义的事件。此工作簿对象始终表示承载您所在的VBA项目的特定工作簿,而不代表其他工作簿。
只要任何工作表(无论是Workbook
,Workbook
工作表还是任何其他类型的对象,Workbook
对象都会触发SheetActivate
事件表格)已激活-您可以通过相应处理程序的Worksheet
参数获取已激活的表格。
Chart
对象在成为Sh
时也会触发自己的Workbook
事件。
好像您要处理Activate
事件。试用您可以在ActiveWorkbook
模块中获得的处理程序,看看最适合您的要求。
从Workbook
的代码窗格左上方的组合框中选择ThisWorkbook
,然后从右侧的组合框中选择一个事件,以使VBE自动生成事件处理程序具有正确签名的原型:
如果您需要处理Workbook
范围内的事件,那么事情会涉及到更多点,但是问题的关键是您需要具有一个声明以下内容的类模块(可以是ThisWorkbook
) Application
变量:
ThisWorkbook
现在,左上角的下拉列表将列出WithEvents
,并且选中该选项后,右上角的下拉列表将允许您选择一个Private WithEvents App As Excel.Application
事件来处理...只要您{{1} } App
对象变量到有效的Excel.Application
引用,例如,在Set
处理程序中:
App
例如,现在您可以处理激活任何工作簿时触发的事件。