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が変更されたように見えるため、非アクティブ化イベントが呼び出されます。

アクティブ化/非アクティブ化イベントをOutlookが持つことができるすべてのエクスプローラーに関連付けて、アプリケーションをOutlookとの間で切り替えるときにのみアクティブ化/非アクティブ化メソッドが呼び出されるようにします。つまり、ExcelからOutlookに切り替えたときにメソッドを呼び出し、Excelに戻るまで、電子メールを開いたり、会議をスケジュールしたりするときに非アクティブ化イベントを呼び出さないでください。

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

現在の主な問題は、アクティベーションを追跡することです。イベントにバインドされているオブジェクトが 1 つしかないため、オブジェクトを新しくアクティブなエクスプローラーに割り当てる方法を見つける必要があります。残念ながら、以下の自然な試みは機能しません。

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 ...

残念ながら、古いエクスプローラーから起動されたイベントで新しいアクティブなエクスプローラーを検出する方法をまだ見つけていません。1つの可能な(しかしまだ醜い)方法は、タイマーを起動でき、数ミリ秒後にActiveWindowがすでに切り替えられている可能性がある場合です。

于 2013-04-27T23:23:15.433 に答える