按主题行和发件人电子邮件地址删除Outlook项目

时间:2016-09-22 04:16:42

标签: vba outlook outlook-vba

以下是删除Outlook电子邮件的宏,但代码在最后一行 "Type Mismatch" 时出现错误 "Next Mails_itm"

Dim Out_App As Outlook.Application
Dim Folders As Outlook.NameSpace
Dim MyFolder As Outlook.MAPIFolder
Dim Mails_itm As MailItem

Set start_fm = Range("a1")
Set Out_App = New Outlook.Application
Set Folders = Out_App.GetNamespace("mapi")
Set MyFolder = Folders.GetDefaultFolder(olFolderInbox)

For Each Mails_itm In MyFolder.Items
    If Mails_itm.Subject = "my_very_specific_subject_line" Then
        Mails_itm.Delete
    End If
Next Mails_itm

2 个答案:

答案 0 :(得分:2)

由于缺少项目对象而导致错误,这些项目对象在开始时被放入循环集合中,并且已在循环内被删除。尝试使用Step -1的循环,以便从最后一项开始删除:

Set myitems = myfolder.Items
For i = myitems.Count To 1 Step -1
    Set mails_itm = myitems(i)
    If mails_itm.Subject = "my_very_specific_subject_line" And _
    mails_itm.Sender = "my_very_specific_from_line" Then
        mails_itm.Delete
    End If
Next i

答案 1 :(得分:2)

您可能希望使用Items.Restrict Method (Outlook)将过滤器应用于Items集合并返回包含匹配过滤器中所有项目的新集合。

实施例

"[Subject] = 'Subject_line' And [SenderEmailAddress] = 'Sender@Email.com'"

设置过滤器
Option Explicit
Public Sub Delete_Emails()
    Dim olApp As Outlook.Application
    Dim olNs As Outlook.Namespace
    Dim Inbox As Outlook.MAPIFolder
    Dim Items As Outlook.Items
    Dim Filter As String
    Dim Msg As String
    Dim i As Long

    Set olApp = CreateObject("Outlook.Application")
    Set olNs = olApp.GetNamespace("MAPI")
    Set Inbox = olNs.GetDefaultFolder(olFolderInbox)

    Filter = "[Subject] = 'Subject_line' And [SenderEmailAddress] = 'from_email'"

    Set Items = Inbox.Items.Restrict(Filter)

    Msg = Items.Count & " items in " & Inbox.Name & ". Delete?"

    If MsgBox(Msg, vbYesNo) = vbYes Then
        For i = Items.Count To 1 Step -1
            Debug.Print Items(i) 'Immediate Window
            Items.remove i
        Next
    End If
End Sub
  

此方法是使用Find方法或FindNext方法迭代集合中特定项目的替代方法。如果存在少量项目,则Find或FindNext方法比过滤更快。如果集合中有大量项目,则Restrict方法会明显加快,特别是如果预计只能找到大集合中的少数项目。