使用收件箱循环浏览发件箱,从发件箱中删除主题行相同的邮件

时间:2018-11-17 20:29:32

标签: vba outlook outlook-vba

我试图浏览两个不同的框(收件箱和发件箱),比较主题并在找到匹配项时删除发件箱中的消息。我做错了什么?我是否需要为每个框创建另一个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

2 个答案:

答案 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)

首先,您将ItemOItem调为Outlook.MailItem-您可以在收件箱文件夹中放置其他项目(因此出现类型不匹配错误),例如ReportItemMeetingItem。将这些变量视作通用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>