0

我有一些激活/停用方法

Private Sub myOlExp_Activate()
'stuff
End Sub

Private Sub myOlExp_Deactivate()
End Sub

它们通过以下方式连接到 Explorer 对象

Public WithEvents myOlExp As Outlook.Explorer
Set myOlExp = Application.ActiveExplorer (called in the "Application_Startup" method)

但是,当我打开电子邮件或事件或其他内容时,ActiveExplorer 似乎发生了变化,因此调用了 deactivate 事件。

我想将激活/停用事件绑定到 Outlook 可以拥有的所有资源管理器,以便仅在我将应用程序切换到 Outlook 或从 Outlook 切换应用程序时调用激活/停用方法。换句话说,当我从 Excel 切换到 Outlook 时调用该方法,然后在我切换回 Excel 之前在打开电子邮件、安排会议等时不调用 Deactivate 事件。

Application.Explorers

似乎只返回打开的资源管理器(因此当我打开项目/等时,似乎创建了新的资源管理器)。有可能让它工作,但我还没有弄清楚。

本质上,我想要一个独立于我正在查看的 Outlook 项目/窗口的“outlook.activate”和“outlook.deactivate”方法。

4

1 回答 1

0

据我了解,VBA 中无法为所有资源管理器捕获事件。

要解决此问题,您可以处理 Explorers_NewExplorer 事件来跟踪新的 Explorer。

Dim WithEvents exps As Outlook.Explorers
Private Sub Application_Startup()
    Set exps = Application.Explorers
    Set exp = Application.ActiveExplorer
End Sub
Private Sub exps_NewExplorer(ByVal Explorer As Explorer)
    Set exp = Explorer
End Sub

现在的主要问题是跟踪激活。由于您只有一个绑定到事件的对象,我们需要找到一种方法如何将对象分配给新激活的资源管理器。不幸的是,下面的自然尝试不起作用:

Private Sub exp_Deactivate()
    Debug.Print ("Win: " & Application.ActiveWindow.Caption & ", Expl: " & Application.ActiveExplorer.Caption)
    If Application.ActiveWindow.Class = olExplorer Then
         Set exp = Application.ActiveWindow   ' Caveat: This does not work!
    End If
End Sub

由于 Explorer_Deactivate 事件在开关生效之前被触发,即 Application.ActiveWindow 和 Application.ActiveExplorer 都指向被停用的资源管理器,因此无法检测到哪个资源管理器被激活。我们需要知道这一点,因为我们需要将 exp 分配给激活的那个。

如果你有固定数量的资源管理器(实际上你总是有),你可以通过为每个可能的资源管理器声明变量并使用丑陋的开关来解决这个限制(我认为这是一个设计缺陷),例如类似:

Private Sub exp1_Aactivate()
    ... call your sub here ...
End Sub
Private Sub exp2_Activate()
    ... call your sub here ...
End Sub

Private Sub exps_NewExplorer(ByVal Explorer As Explorer)
    Select Case Application.Explorers.Count
        Case 1
            Set expl1 = Explorer
        Case 2
            Set expl2 = Explorer
        ... etc ...

不幸的是,我还没有找到一种方法如何在旧资源管理器触发的任何事件中检测新的活动资源管理器。一种可能(但仍然丑陋)的方式可能是如果您可以触发计时器并且在几毫秒之后 ActiveWindow 可能已经切换。

于 2013-04-27T23:23:15.433 回答