2012-07-09 3 views
0

의 모든 탐험가에 이벤트를 비활성화 방법연결 활성화 및 비활성화/I 일부가 활성화 한 전망

Private Sub myOlExp_Activate() 
'stuff 
End Sub 

Private Sub myOlExp_Deactivate() 
End Sub 

이벤트 또는 뭔가 다른 ActiveExplorer 변경 및 비활성화 이벤트가 호출됩니다.

Outlook에서 응용 프로그램을 전환 할 때 활성화/비활성화 방법 만 호출되도록 Outlook에서 가질 수있는 모든 탐색기에 activate/deactivate 이벤트를 연결하고 싶습니다. 즉, Excel에서 Outlook으로 전환 한 다음, Excel로 다시 전환 할 때까지 전자 메일 열기, 미팅 일정 잡기 등의 이벤트 비활성화를 호출하지 않을 때이 메서드를 호출합니다.

Application.Explorers 

오픈 익스플로러 만 반환하는 것처럼 보입니다. (항목을 열면 새로운 것들이 겉으로는 생성됩니다). 이 기능을 작동시키는 것이 가능할 수도 있지만 알아 내지 못했습니다.

본질적으로, 내가보고있는 Outlook 항목/창과는 독립적 인 "outlook.activate"및 "outlook.deactivate"방법이 필요합니다.

+0

내가 설명한 [여기] 문제입니까 (http://stackoverflow.com/questions/11396080/outlook-vba-onactivate-method#comment15025724_11396080)? – JimmyPena

답변

0

제가 알기로 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가 이미 전환 된 후 일 수 있습니다.