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

时间:2015-04-09 14:36:01

标签: vba outlook outlook-vba

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

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

似乎能够在Outlook完成全部之后执行代码,它的启动过程将是一个常见的功能请求。谢谢你的帮助。

此示例代码只显示我的收件箱中有多少未读电子邮件。如果我关闭Outlook,给自己发送电子邮件,然后打开Outlook,我需要加载Outlook并在生成包含收件箱中未读电子邮件数量的邮箱之前进行完全同步。

Oulook Application_Startup事件处理程序:

Dim mySyncInstance As New mySync

Private Sub Application_Startup()
    mySyncInstance.Initialize_handler
End Sub

自定义mySync类代码:

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

  

我试图运行一个宏,在Outlook启动时将今天之前收到的电子邮件移动到cabinet文件夹。

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

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

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

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