제가 알기로 VBA에서는 모든 탐색기에 대해 이벤트를 캡처하는 방법이 없습니다.
이 문제를 해결하려면 Explorers_NewExplorer 이벤트를 처리하여 새 탐색기를 추적 할 수 있습니다.
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
이제 주요 문제는 활성화를 추적하는 것입니다. 이벤트에 묶여있는 하나의 객체 만 있기 때문에 우리는 새로 활성화 된 탐색기에 객체를 할당하는 방법을 찾아야합니다. 불행하게도, 아래 자연 시도가 작동하지 않습니다 Explorer_Deactivate 이벤트가 해고
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
으로 스위치가 유효하기 전에, 즉 비활성화되는 탐색기에 두 점 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 ...
불행하게도 나는 아직 어떻게 된 탐색기에서 해고 어떤 경우에도 새로운 활성 탐색기를 탐지하는 방법을 찾아 didnt한다. 가능한 한 (그러나 여전히 못생긴) 방법은 타이머를 작동시키고 몇 ms의 ActiveWindow가 이미 전환 된 후 일 수 있습니다.
내가 설명한 [여기] 문제입니까 (http://stackoverflow.com/questions/11396080/outlook-vba-onactivate-method#comment15025724_11396080)? – JimmyPena