在重新激活工作簿时执行操作
Perform action upon workbook being reactivated
我有一个工作簿,其中包含通过 VBA 打开其他工作簿的按钮。
我的理解是,当我在其中时,这个初始工作簿(我们称它为 Hub 工作簿)既是 ThisWorkbook 又是 ActiveWorkbook。
通过其中一个按钮打开另一个工作簿后,新打开的工作簿将变为 ActiveWorkbook。
当我再次点击 Hub 时,它又变成了 ActiveWorkbook。
我想执行一个操作,只有当 Hub 重新获得活动工作簿的状态时。
我已经尝试通过对工作执行操作来执行此操作sheet,但是如果它是唯一的 sheet 并且我只是从另一个工作簿中单击返回它就不会执行此操作。例如,如果我有两个作品sheet然后单击返回到这个作品sheet。
Private Sub Worksheet_Activate()
MsgBox "Worksheet Reactivated"
End Sub
我似乎无法让它按照我的要求工作,但我确信一定有某种方法可以做到这一点。
如有任何帮助,我们将不胜感激。
谢谢
一个 Worksheet
模块,例如 Sheet1
,是一种特殊类型的 class 模块,它继承了 Worksheet
class 的成员,并让您轻松处理为 Worksheet
对象定义的事件。在 运行 时间,Sheet1
模块代表 Worksheet
class 的一个非常具体的 实例 - 所以您实现的任何事件处理程序在该模块中,仅针对从 that 对象触发的事件调用。
因此,Sheet1
的代码隐藏中的 Worksheet_Activate
处理程序只会在 Sheet1
对象触发其 Activate
事件时 运行。
如果您不关心任何特定或特定的工作sheet,那么您需要在不同级别处理事件:ThisWorkbook
模块是一种特殊类型的class 模块继承了 Workbook
class 的成员,并让您轻松处理为 Workbook
对象定义的事件。此工作簿对象始终表示 承载您所在的 VBA 项目的特定工作簿,而不是其他工作簿。
A Workbook
对象在 任何 sheet 时触发 SheetActivate
事件(无论是 Worksheet
、Chart
sheet,或任何其他类型的 sheet) 被激活 - 您通过相应处理程序的 Sh
参数获得激活的 sheet。
A Workbook
对象在成为 ActiveWorkbook
.
时也会触发自己的 Activate
事件
您似乎想要处理一个 Workbook
事件。试验您可以在 ThisWorkbook
模块中获得的处理程序,看看什么最符合您的要求。
Select Workbook
来自 ThisWorkbook
中代码窗格左上角的组合框,然后 select 来自右侧组合框的事件,让 VBE 自动生成具有正确签名的事件处理程序原型:
如果你需要处理 Application
-wide 事件,事情会变得有点复杂,但关键是你需要有一个 class 模块(可以是 ThisWorkbook
) 声明了一个 WithEvents
变量:
Private WithEvents App As Excel.Application
现在左上角的下拉列表将列出 App
,当它被 select 编辑时,右上角的下拉列表将让您选择一个 Excel.Application
事件来处理...前提是你 Set
这个 App
对象变量到一个有效的 Excel.Application
引用,比如说,在 Workbook_Open
处理程序中:
Private Sub Workbook_Open()
Set App = Me.Application
End Sub
现在您可以处理在 任何 工作簿激活时触发的事件,例如。
我有一个工作簿,其中包含通过 VBA 打开其他工作簿的按钮。
我的理解是,当我在其中时,这个初始工作簿(我们称它为 Hub 工作簿)既是 ThisWorkbook 又是 ActiveWorkbook。
通过其中一个按钮打开另一个工作簿后,新打开的工作簿将变为 ActiveWorkbook。
当我再次点击 Hub 时,它又变成了 ActiveWorkbook。
我想执行一个操作,只有当 Hub 重新获得活动工作簿的状态时。
我已经尝试通过对工作执行操作来执行此操作sheet,但是如果它是唯一的 sheet 并且我只是从另一个工作簿中单击返回它就不会执行此操作。例如,如果我有两个作品sheet然后单击返回到这个作品sheet。
Private Sub Worksheet_Activate()
MsgBox "Worksheet Reactivated"
End Sub
我似乎无法让它按照我的要求工作,但我确信一定有某种方法可以做到这一点。
如有任何帮助,我们将不胜感激。
谢谢
一个 Worksheet
模块,例如 Sheet1
,是一种特殊类型的 class 模块,它继承了 Worksheet
class 的成员,并让您轻松处理为 Worksheet
对象定义的事件。在 运行 时间,Sheet1
模块代表 Worksheet
class 的一个非常具体的 实例 - 所以您实现的任何事件处理程序在该模块中,仅针对从 that 对象触发的事件调用。
因此,Sheet1
的代码隐藏中的 Worksheet_Activate
处理程序只会在 Sheet1
对象触发其 Activate
事件时 运行。
如果您不关心任何特定或特定的工作sheet,那么您需要在不同级别处理事件:ThisWorkbook
模块是一种特殊类型的class 模块继承了 Workbook
class 的成员,并让您轻松处理为 Workbook
对象定义的事件。此工作簿对象始终表示 承载您所在的 VBA 项目的特定工作簿,而不是其他工作簿。
A Workbook
对象在 任何 sheet 时触发 SheetActivate
事件(无论是 Worksheet
、Chart
sheet,或任何其他类型的 sheet) 被激活 - 您通过相应处理程序的 Sh
参数获得激活的 sheet。
A Workbook
对象在成为 ActiveWorkbook
.
Activate
事件
您似乎想要处理一个 Workbook
事件。试验您可以在 ThisWorkbook
模块中获得的处理程序,看看什么最符合您的要求。
Select Workbook
来自 ThisWorkbook
中代码窗格左上角的组合框,然后 select 来自右侧组合框的事件,让 VBE 自动生成具有正确签名的事件处理程序原型:
如果你需要处理 Application
-wide 事件,事情会变得有点复杂,但关键是你需要有一个 class 模块(可以是 ThisWorkbook
) 声明了一个 WithEvents
变量:
Private WithEvents App As Excel.Application
现在左上角的下拉列表将列出 App
,当它被 select 编辑时,右上角的下拉列表将让您选择一个 Excel.Application
事件来处理...前提是你 Set
这个 App
对象变量到一个有效的 Excel.Application
引用,比如说,在 Workbook_Open
处理程序中:
Private Sub Workbook_Open()
Set App = Me.Application
End Sub
现在您可以处理在 任何 工作簿激活时触发的事件,例如。