我试图编写一个outlook VB宏,以实现以下目标:
新电子邮件到达时触发。
转到收件箱内的文件夹 - temp1。
检查是否有与该主题相匹配的现有电子邮件 这封新电子邮件。
删除旧电子邮件。
代码:
Option Explicit
Private objNS As Outlook.NameSpace
Private WithEvents objItems As Outlook.Items
Private Sub Application_Start()
Dim olApp As Outlook.Application
Dim objWatchFolder As Outlook.Folder
Set olApp = Outlook.Application
Set objNS = Application.GetNamespace("MAPI")
'Set the folder and items to watch:
Set objWatchFolder = objNS.GetDefaultFolder(olFolderInbox).Folders("temp1")
Set objItems = objWatchFolder.Items
Set objWatchFolder = Nothing
End Sub
Private Sub objItems_ItemAdd(ByVal Item As Object)
Dim intCount As Integer
Dim objVariant As Variant
For intCount = objItems.Count To 1 Step -1
Set objVariant = objItems.Item(intCount)
If objVariant.Subject = Item.Subject And objVariant.SentOn < Item.SentOn
Then
objVariant.Delete
Else
End If
Next
End Sub
问题:
宏未被触发。
注意:
寻求专家的帮助!
答案 0 :(得分:0)
(1)您需要处理在收件箱中收到新项目时触发的Application类的NewMailEx
事件。当新邮件到达收件箱时以及客户端规则处理发生之前,NewMailEx
事件将触发。您可以使用EntryIDCollection
数组中返回的条目ID来调用NameSpace.GetItemFromID方法并处理该项目。请谨慎使用此方法,以尽量减少对Outlook性能的影响。但是,根据客户端计算机上的设置,在新邮件到达收件箱后,垃圾邮件过滤和将新邮件从收件箱移动到另一个文件夹的客户端规则等过程可能会异步发生。您不应该假设在这些事件发生后,您将始终获得收件箱中项目数量的一项增加。
(2)看起来您已经知道如何获取收件箱的子文件夹:
Set objWatchFolder = objNS.GetDefaultFolder(olFolderInbox).Folders("temp1")
(3)要查找具有相同主题的项目,您需要使用Items
类的Find / FindNext或Restrict方法,而不是迭代所有项目在文件夹中。请阅读以下文章中有关这些方法的更多信息:
此外,如果您需要在多个文件夹中查找项目,您可能会发现Application类的AdvancedSearch方法很有帮助。在Outlook中使用AdvancedSearch
方法的主要好处是:
AdvancedSearch
方法会在后台自动运行它。Restrict
和Find
/ FindNext
方法可以应用于特定的Items
集合(请参阅Outlook中Folder类的Items
属性)。IsInstantSearchEnabled
属性)。有关详细信息,请参阅Advanced search in Outlook programmatically: C#, VB.NET。
(4)使用Delete
方法删除项目。
答案 1 :(得分:0)
Items.ItemAdd Event (Outlook)描述了如何在Class模块中应用ItemAdd事件。然后,您将在ThisOutlookSession中使用Application_Startup来初始化objItems。
您拥有的是ThisOutlookSession模块的代码。
答案 2 :(得分:-1)
您正在观看temp1文件夹上的ItemAdd事件,而不是收件箱。