如何在 Outlook Application_Startup 事件处理程序和所有文件夹同步后执行 VBA?

How to execute VBA after Outlook Application_Startup event handler and after all folders sync?

我正在尝试 运行 一个宏,它可以在 Outlook 启动时将今天之前收到的电子邮件移动到文件柜文件夹。问题是 Application_Startup 事件处理程序发生在 Outlook 完全加载和文件夹同步之前。因此,当我早上打开 Outlook 时,昨晚收到的所有电子邮件都没有移到文件柜中。

为了解决这个问题,我创建了一个自定义 class 来实例化一个 Outlook.syncObject,它会同步所有文件夹并在同步完成时提供一个事件处理程序。我在 Application_Startup 事件处理程序中从这个 class 创建一个对象。但是,此同步似乎并没有真正检索到任何电子邮件,而且 似乎 在 Outlook 加载之前完成。

似乎能够在 Outlook 完成 所有 启动过程后执行代码将是一个常见的功能请求。感谢您的帮助。

此示例代码仅向我显示收件箱中有多少未读电子邮件。如果我关闭 Outlook,给自己发一封电子邮件,然后打开 Outlook,我需要加载 Outlook 并进行完全同步,然后才能生成包含收件箱中未读电子邮件数量的消息框。

Oulook Application_Startup 事件处理程序:

Dim mySyncInstance As New mySync

Private Sub Application_Startup()
    mySyncInstance.Initialize_handler
End Sub

自定义 mySync Class 代码:

Dim WithEvents mySync As Outlook.syncObject

Sub Initialize_handler()
 Set mySync = Application.Session.SyncObjects.item(1)
 mySync.Start
End Sub

Private Sub mySync_SyncEnd()
 MsgBox Application.GetNamespace("MAPI").GetDefaultFolder(olFolderInbox).items.Restrict("[UnRead] = True").Count & _
    " Emails are unread in the main inbox."
End Sub

为什么不对收件箱文件夹使用 Items.ItemAdd 事件?

I'm trying to run a macro that moves emails received before today to a cabinet folder whenever Outlooks starts.

您可以考虑处理应用程序 class 的 NewMailEx 事件,该事件在收件箱中收到新项目时触发。因此,您可以获取邮件项目并决定是否需要将其移动到子文件夹中。对于 Microsoft Outlook 处理的每个接收项目,此事件都会触发一次。该项目可以是多种不同项目类型中的一种,例如 MailItem、MeetingItem 或 SharingItem。 EntryIDsCollection 字符串包含对应于该项目的条目 ID。

您还可以创建规则并分配 VBA 宏子。邮件项对象的传入实例将作为参数传递。例如:

public sub test(mail as MailItem)
  ' do whatever you need
end sub

作为一种替代方法,您可以处理 Items class 的 ItemAdd 事件,当一个或多个项目添加到指定集合时会触发该事件。当大量项目一次添加到文件夹(超过 16 个)时,此事件不会 运行。