2016-07-08 128 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