首页 > 解决方案 > 使用双显示器时如何调用“Workbook_WindowActivate”?

问题描述

当我在同一个屏幕中将窗口从工作簿切换到另一个工作簿时,可以成功调用此触发器(和 Workbook_WindowDectivate),但是当我切换到另一个屏幕中的工作簿时,它不起作用。似乎它们属于2个不同的进程,我可以在任务管理器中找到2个Excel.exe。

我的一个工作簿中有很多数据和很多切片器,这使我的工作表运行非常缓慢,但我需要保持全局设置“自动计算”。所以我正在尝试使用宏来禁用它的计算。我在工作时经常在 2 个屏幕中打开多个窗口,所以我的目的是让这个宏在我专注于另一个屏幕中的工作簿时可以被调用。

标签: excelvba

解决方案


假设有两个不同的过程,你不能。

这是 的两个不同实例Excel.Application,每个实例都有自己的Workbooks集合:您可以将一个实例称为“维加斯”,并说“维加斯发生的事情,留在维加斯”

除非...除非您的代码完全拥有该其他实例:

Private WithEvents OtherExcel As Excel.Application

Private Sub Workbook_Open()
    Set OtherExcel = New Excel.Application
    OtherExcel.Visible = True
End Sub

Private Sub OtherExcel_WindowActivate(Wb As Workbook, Wn As Window)

End Sub

Private Sub OtherExcel_WindowDeactivate(Wb As Workbook, Wn As Window)

End Sub

...有一些警告:

  • 它每次都会打开一个新的 Excel 实例
  • 它不会处理第三个实例
  • 如果执行上下文死了,OtherExcel对象就消失了
    • 每当 VBE 决定代码更改需要重新编译时,执行上下文就会终止
    • 或者每当发生未处理的错误时
    • 或者End遇到语句时
  • 如果OtherExcel实例关闭,则对象消失;如果随后启动另一个实例,则该OtherExcel对象仍然消失。

OtherExcel您可以通过公开一个按需重新分配的宏来解决这些限制。“附加”对OtherExcel已经运行的 Excel 的第二个实例的引用可能已经完成(GetObject想到),但可能不可靠或棘手。


推荐阅读