2016-07-08 60 views
0

我有一些outlook VBA代碼,可以自動爲我們的團隊成員分配一封電子郵件,以便我們的客戶做出迴應,因爲這樣做也可以掃描並向他們發送任何後來從相同的電子郵件地址,因此客戶可以一次處理。Outlook VBA - 收件箱爲空時檢測?當收件箱爲空時運行宏?

我想讓它在自己的文件夾變空時運行(即他們已經處理了一個客戶端,當他們將當前郵件移動到存檔時,它會自動運行以上分配給他們,使他們的主收件箱文件夾空)。

有沒有辦法做到這一點?我知道我可以設置宏來每5分鐘檢查一次,但這會大大減慢Outlook的運行速度。只有當用戶的文件夾被清空時才能觸發宏的任何方式?

乾杯

克里斯

回答

0

Events是爲這個完美的。

當發生密鑰更改時,應用程序觸發事件。這可以讓你避免使用定時循環。

您可以使用WithEvents語句創建一個可以處理事件調用的變量。

在這個例子中,變量f指向收件箱。每當從該文件夾中刪除一個項目時,就會調用f_BeforeItemMove過程。它顯示剩下的項目數,減1。我們減去一個,因爲事件在刪除之前被觸發(如果您願意,這會讓您有機會取消它)。

因爲我們使用的是object variable,所以我們需要創建並銷燬它。當應用程序啓動&退出時會發生這種情況。

Private WithEvents f As Folder   ' Inbox folder, used to monitor events. 


Private Sub Application_Startup() 
' Register for events. 

    Set f = Application.GetNamespace("MAPI").GetDefaultFolder(olFolderInbox) 
End Sub 

Private Sub Application_Quit() 
' Unregister. 

    Set f = Nothing 
End Sub 



Private Sub f_BeforeItemMove(ByVal Item As Object, ByVal MoveTo As MAPIFolder, Cancel As Boolean) 
' Called when an item is moved out of the inbox. 

    ' Display the number of items left, after delete. 
    MsgBox (f.Items.Count - 1) 
End Sub 

必須將此代碼添加到ThisOutlookSession類中。如果粘貼到另一個模塊中,啓動和退出事件不會觸發。

EDIT

原始溶液,上方,是觸發之前項被從收件箱中刪除。 OP想要剛剛解僱的代碼。這個新的解決方案做到了。

Private WithEvents f As Folder   ' Inbox folder, used to monitor events. 
Private WithEvents i As Items   ' Items within folder above 


Private Sub Application_Startup() 
' Register for events. 

    Set f = Application.GetNamespace("MAPI").GetDefaultFolder(olFolderInbox) 
    Set i = f.Items 
End Sub 

Private Sub Application_Quit() 
' Unregister. 

    Set i = Nothing 
    Set f = Nothing 
End Sub 

Private Sub i_ItemRemove() 
' Called each time an item is moved out of the inbox. 
' This can be triggered by moving an item to another folder 
' or deleting it. 

    ' Display the new inbox item count. 
    MsgBox i.Count 
End Sub 

和以前一樣;此代碼應放置在ThisOutlookSession之內。您將需要重新啓動Outlook,或手動執行Application_Startup

+0

感謝您的回覆。我試過這個,不幸的是它不會觸發任何東西。我已將代碼放在ThisOutlookSession中,並將其指向我要監視的文件夾,但當我刪除或移出收件箱中的電子郵件時,它沒有做任何事情。 –

+0

對不起,我應該添加;要獲得此代碼,您需要手動運行Application_Startup或關閉並重新打開Outlook。要手動運行只需點擊子內,然後按F5鍵。爲什麼?因爲需要通過SET語句創建f對象變量。一旦完成,它將開始響應事件。 –

+0

現在,我已重新啓動Outlook,這很好。非常感謝。一個問題,但。我需要在郵件項目移動之後運行它,而不僅僅是之前,因爲我的下一個代碼將檢查郵箱計數,並且只有在它等於0時才運行。由於此操作在手邊運行,因此它認爲郵箱中仍有一封電子郵件我的下一部分沒有運行。 –

0

您可以捕獲Items.ItemRemove事件來監視用於當Items.Count屬性Application_Startup()事件期間的計算結果爲0。呼叫Initialize_handler()方法:

Public WithEvents myOlItems As Outlook.Items 
 
      
 
Public Sub Initialize_handler() 
 
    
 
Set myOlItems = Application.GetNamespace("MAPI").GetDefaultFolder(olFolderInbox).Items 
 
    
 
End Sub   
 
    
 
Private Sub myOlItems_ItemRemove() 
 
    
 
If myOlItems.Count = 0 Then 
 
    'Inbox is empty! 
 
End If 
 
    
 
End Sub