以下是删除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
答案 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方法会明显加快,特别是如果预计只能找到大集合中的少数项目。 子> 的