【问题标题】:Outlook VBA - Detect when inbox is empty? Run Macro when inbox is empty?Outlook VBA - 检测收件箱何时为空?收件箱为空时运行宏?
【发布时间】:2016-11-10 17:44:13
【问题描述】:

我有一些用于工作的 Outlook VBA 代码,它会自动为我的团队成员一次分配一封电子邮件以回复我们的客户,并且在执行此操作的同时,它还会扫描并给他们以后收到的任何电子邮件同一个邮箱地址,可以一次性处理客户。

我希望它在他们自己的文件夹变空时运行(即他们已经与一个客户打交道,并且当他们将当前邮件移动到存档时,它会自动运行上述内容以分配另一个,使他们的主收件箱文件夹为空)。

有没有办法做到这一点?我知道我可以将宏设置为每 5 分钟检查一次,但这会大大降低 Outlook 的速度。有什么办法只在用户文件夹被清空时触发宏?

干杯

克里斯

【问题讨论】:

    标签: vba outlook


    【解决方案1】:

    Events 非常适合。

    当按键发生变化时,应用程序会触发事件。这样可以避免使用定时循环。

    您可以使用WithEvents 语句创建一个可以处理事件调用的变量。

    在本例中,变量 f 指向收件箱。每当从此文件夹中删除项目时,就会调用f_BeforeItemMove 过程。它显示剩余的项目数减一。我们减去一个,因为事件是在删除之前触发的(如果您愿意,您可以有机会取消它)。

    因为我们使用的是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 类。如果粘贴到另一个模块中,启动和退出事件将不会触发。

    编辑

    上面的原始解决方案是在从收件箱中删除项目之前触发的。 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

    【讨论】:

    • 感谢您的回复。我已经尝试过了,不幸的是它没有触发任何东西。我已将代码放在 ThisOutlookSession 中,并将其指向我要监视的文件夹,但当我删除或将电子邮件移出收件箱时,它没有做任何事情。
    • 对不起,我应该添加;要使此代码正常工作,您需要手动运行Application_Startup 或关闭并重新打开 Outlook。要手动运行,只需单击子内部并按 F5。为什么?因为 f 对象变量需要通过 SET 语句来创建。一旦完成,它将开始响应事件。
    • 现在我已经重新启动了 Outlook,效果很好。非常感谢。一个问题。我需要在邮件项目被移动之后运行它,而不仅仅是之前,因为我的下一个代码将检查邮箱计数并且仅在它等于 0 时运行。由于它事先运行,它认为盒子里还有一封电子邮件我的下一部分没有运行。
    • 您可以使用 items object 的 ItemRemoved 事件来执行此操作。下次我在笔记本电脑上时,我会用一个例子来更新我的答案。
    • 非常感谢。我会玩一玩,但如果可以的话,那就太好了。
    【解决方案2】:

    您可以捕获 Items.ItemRemove 事件以监控 Items.Count 属性何时计算为 0。在 Application_Startup() 事件期间调用 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

    【讨论】:

      猜你喜欢
      • 2017-02-22
      • 1970-01-01
      • 2020-05-16
      • 2011-01-22
      • 2014-01-11
      • 1970-01-01
      • 1970-01-01
      • 2019-01-26
      • 2011-10-14
      相关资源
      最近更新 更多