我试图浏览两个不同的框(收件箱和发件箱),比较主题并在找到匹配项时删除发件箱中的消息。我做错了什么?我是否需要为每个框创建另一个Folder对象? 编辑我收到“运行时错误13;键入不匹配”
Sub DEID()
Dim objNS As Outlook.NameSpace
Dim objFolder As Outlook.MAPIFolder
Set objNS = GetNamespace("MAPI")
Set objFolder = objNS.Folders.GetFirst
Set objIFolder = objFolder.Folders("Inbox")
Set objOFolder = objFolder.Folders("Outbox")
Dim Item, OItem As Outlook.MailItem
For Each Item In objIFolder.Items
Set ISub = Right(CStr(Item.Subject), Len(Item.Subject) - 6)
Set ISub = CStr(ISub)
For Each OItem In objOFolder.Items
Set OSub = Right(CStr(OItem.Subject), Len(OItem.Subject) - 6)
Set ISub = CStr(OSub)
If StrComp(ISub = OSub, 1) = 0 Then
OItem.Delete
End If
Next OItem
Next Item
End Sub
答案 0 :(得分:0)
让我大吃一惊的是,您正在对值类型(主题,它是字符串)使用set
命令,该命令不是必需的,并且会导致错误。
Dim Item, OItem As Outlook.MailItem
Dim ISub, OSub As String
For Each Item In objIFolder.Items
ISub = Right(CStr(Item.Subject), Len(Item.Subject) - 6)
ISub = CStr(ISub)
For Each OItem In objOFolder.Items
OSub = Right(CStr(OItem.Subject), Len(OItem.Subject) - 6)
ISub = CStr(OSub)
If StrComp(ISub = OSub, 1) = 0 Then
OItem.Delete
End If
Next OItem
Next Item
另一个观察结果...这行:
ISub = CStr(OSub)
在我看来,这将迫使下一个条件始终为真。除非我误会,否则这似乎是个错误。
我也认为不需要进行String转换,因为subject已经是一个字符串。
这将是我的最终版本:
Dim objNS As Outlook.NameSpace
Dim objFolder As Outlook.MAPIFolder
Set objNS = GetNamespace("MAPI")
Set objFolder = objNS.Folders.GetFirst
Set objIFolder = objFolder.Folders("Inbox")
Set objOFolder = objFolder.Folders("Outbox")
Dim Item, OItem As Outlook.MailItem
Dim ISub, OSub As String
For Each Item In objIFolder.Items
ISub = Right(Item.Subject, Len(Item.Subject) - 6)
For Each OItem In objOFolder.Items
OSub = Right(OItem.Subject, Len(OItem.Subject) - 6)
If ISub = OSub Then
OItem.Delete
End If
Next OItem
Next Item
答案 1 :(得分:0)
首先,您将Item
和OItem
调为Outlook.MailItem
-您可以在收件箱文件夹中放置其他项目(因此出现类型不匹配错误),例如ReportItem
或MeetingItem
。将这些变量视作通用Object
。
第二,您正在循环浏览集合中的项目。不要这样做-使用下循环(for i = Items.Count to 1 step -1
)。
第三,不要循环浏览文件夹中的所有项目-效率极低,让Outlook完成工作-供内部使用的Items.Find / FindNext或Items.Restrict
并使用@SQL="http://schemas.microsoft.com/mapi/proptag/0x0E1D001F" like '%some value%'
这样的查询
对于外部循环,同样,dd不循环,使用MAPIFolder.GetTable()
/ Table.Columns.Add / Table.GetArray
/等在一次调用中检索所有主题-参见https://docs.microsoft.com/en-us/dotnet/api/microsoft.office.interop.outlook.table?view=outlook-pia < / p>