如何将多个项目一次添加到Outlook文件夹时触发事件?

时间:2013-09-24 22:55:47

标签: vba outlook outlook-vba

我经常在VBA和Outlook中使用事件处理程序。其中一个是将任何被删除的项目标记为已读的项目。

Private Sub deletedItems_ItemAdd(ByVal Item As Object)
    Application_Startup
    On Error Resume Next
    Item.UnRead = False

End Sub

通过:

宣布
Private WithEvents deletedItems As Outlook.Items

并在Application_Startup中初始化为:

Dim olNameSpace As Outlook.NameSpace
Set olNameSpace = olApp.GetNamespace("MAPI")
Set deletedItems = olNameSpace.GetDefaultFolder(olFolderDeletedItems).Items

不幸的是,如果我一次删除多个项目,这不会影响所有项目。

我有办法以某种方式劫持这个过程吗?我查看了使用_beforeDelete事件,但你必须每次都正确设置项目,如果我能做到这个问题就不会存在。


显然我不清楚 - 我的用例是当我通过收件箱中的删除键删除邮件时,草稿,等等。

2 个答案:

答案 0 :(得分:4)

你不必。

我很好奇你的问题所以我打开了Outlook并在ThisOutlookSession中编写了这段代码:

Private WithEvents items As Outlook.items

Public Sub SetItems()
    Set items = Application.GetNamespace("MAPI") _
                           .GetDefaultFolder(olFolderDeletedItems) _
                           .items
End Sub

Private Sub items_ItemAdd(ByVal Item As Object)

    Dim mail As MailItem

    On Error Resume Next
        Set mail = Item
        Err.Clear
    On Error GoTo 0

    If Not mail Is Nothing Then
        MsgBox mail.Subject
        mail.UnRead = False
    End If

End Sub

然后我从即时窗格中运行SetItems,转到我的收件箱并删除了短信 - 正如预期的那样mailNothing。然后我删除了一封电子邮件,并收到了邮件主题的消息。

当我选择两封电子邮件并点击删除时,每个选定的电子邮件都会触发一次事件,所以我看到了两个消息框 - 它才有效! :)

Outlook API似乎没有提供一次性处理所有删除的事件。

答案 1 :(得分:0)

我有(几乎)完全相同的代码,它也适用于多个项目 - 只有在睡眠模式Outlook似乎忘记了如何处理已删除的项目...

Option Explicit
Public WithEvents itDeleted As items

Private Sub Application_Startup()
    Set itDeleted = Application.GetNamespace("MAPI").GetDefaultFolder(olFolderDeletedItems).items
End Sub

Private Sub itDeleted_ItemAdd(ByVal Item As Object)
'MsgBox "deleted-sub fired" 'this only for test-purposes
If TypeOf Item Is MailItem Then
  Item.UnRead = False
End If
End Sub

我认为“deletedItems”定义的不同之处在于问题;你没有检查mailitem-property也不是最佳的。

希望这有帮助, 最大