我经常在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事件,但你必须每次都正确设置项目,如果我能做到这个问题就不会存在。
显然我不清楚 - 我的用例是当我通过收件箱中的删除键删除邮件时,草稿,等等。
答案 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
,转到我的收件箱并删除了短信 - 正如预期的那样mail
为Nothing
。然后我删除了一封电子邮件,并收到了邮件主题的消息。
当我选择两封电子邮件并点击删除时,每个选定的电子邮件都会触发一次事件,所以我看到了两个消息框 - 它才有效! :)
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也不是最佳的。
希望这有帮助, 最大