Sat*_*in2 3 excel vba excel-vba excel-2013
我有一个工作簿,其中有按钮可以通过VBA打开其他工作簿.
我的理解是这个初始工作簿(我们称之为Hub工作簿),当我进入它时,它是ThisWorkbook和ActiveWorkbook.
通过其中一个按钮打开另一个工作簿后,新打开的工作簿将变为ActiveWorkbook.
当我再次点击Hub时,它再次成为ActiveWorkbook.
只有当Hub重新获得作为活动工作簿的状态时,我才会执行操作.
我已经尝试通过在工作表上执行操作来执行此操作,但如果它是唯一的工作表并且我只是从另一个工作簿中单击它,则不会执行此操作.例如,如果我有两个工作表,请单击返回此工作表.
Private Sub Worksheet_Activate()
MsgBox "Worksheet Reactivated"
End Sub
Run Code Online (Sandbox Code Playgroud)
我似乎无法按照我的要求让它工作,但我确信必须有一些方法来做到这一点.
任何帮助,将不胜感激.
谢谢
Worksheet例如,一个模块Sheet1是一种特殊类型的类模块,它继承了Worksheet类的成员,并允许您轻松处理为Worksheet对象定义的事件.在运行时,该Sheet1模块代表了一种非常具体的实例中的Worksheet类-所以你该模块中实现任何事件处理程序,只曾援引从触发的事件是对象.
因此,Worksheet_Activate代码隐藏中的处理程序Sheet1只会在Sheet1对象触发其Activate事件时运行.
如果您不关心任何特定或特定的工作表,那么您需要处理不同级别的事件:ThisWorkbook模块是一种特殊类型的类模块,它继承了Workbook类的成员,并允许您轻松处理为a定义的事件Workbook宾语.此工作簿对象始终表示承载您所在的VBA项目的特定工作簿,而不是其他工作簿.
甲Workbook对象触发一个SheetActivate每当事件任何片(可能是一个Worksheet,一个Chart片,或任何其它类型的片材的)被激活-你通过得到活化片Sh相应的处理程序的参数.
一个Workbook对象也会Activate在它成为的时候触发它自己的事件ActiveWorkbook.
看起来你想要处理一个Workbook事件.尝试使用ThisWorkbook模块中的处理程序,查看最符合您要求的处理程序.
选择Workbook从在代码窗格左上角的下拉框ThisWorkbook,然后选择从右侧组合框的事件,以获得VBE自动生成的事件处理程序的原型与正确的签名:

如果你需要处理全Application范围的事件,那么事情就会变得更加复杂,但问题的关键在于你需要一个ThisWorkbook声明WithEvents变量的类模块(可能):
Private WithEvents App As Excel.Application
Run Code Online (Sandbox Code Playgroud)
而现在左上角的下拉会列出App,并且当这样选择右上角的下拉列表就会让你选择一个Excel.Application事件来处理......只要你Set这个App对象变量为一个有效的Excel.Application参考,也就是说,在Workbook_Open处理程序:
Private Sub Workbook_Open()
Set App = Me.Application
End Sub
Run Code Online (Sandbox Code Playgroud)
现在,您可以处理在激活任何工作簿时触发的事件.