4

我经常在 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事件,但您必须每次都正确设置该项目,如果我能做到,这个问题无论如何都不存在。


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

4

2 回答 2

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从即时窗格中运行,进入我的收件箱并删除了一条 SMS 消息 - 正如预期mail的那样Nothing。然后我删除了一封电子邮件,并收到了带有邮件主题的邮件。

当我选择两封电子邮件并点击Delete时,每个选定的电子邮件都会触发一次事件,所以我看到了两个消息框 - 它可以正常工作!:)

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

于 2013-09-26T02:31:47.273 回答
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 也不是最佳的。

希望这会有所帮助,马克斯

于 2013-09-26T13:39:32.610 回答