Vba 按主题行和发件人电子邮件地址删除Outlook项目
下面是删除outlook电子邮件的宏,但是代码在最后一行“下一封邮件”给出了错误“类型不匹配”Vba 按主题行和发件人电子邮件地址删除Outlook项目,vba,outlook,Vba,Outlook,下面是删除outlook电子邮件的宏,但是代码在最后一行“下一封邮件”给出了错误“类型不匹配” 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 Fol
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
由于缺少在开始时放入循环集合并已在循环中删除的项对象,因此发生错误。尝试在
步骤-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
您可能希望使用将对Items集合应用筛选器并返回包含match筛选器中所有项的新集合的
范例
通过[Subject]=“Subject\u line”和[SenderEmailAddress]=“设置过滤器”Sender@Email.com“
此方法是使用方法或方法在集合中的特定项上迭代的替代方法。如果项目数量较少,则Find或FindNext方法比筛选方法更快。如果集合中有大量项,则Restrict方法的速度要快得多,特别是如果预期在大型集合中只找到少数项时
从集合中删除一个对象。还需要添加条件以从字段中进行检查。@RajatSharma检查答案,我按要求添加了发件人检查。我提到的代码工作正常,但现在不是。我没有改变任何事情。你知道为什么会这样吗?@RajatSharma请编辑你的问题。添加您运行的修改过的代码。显示错误行和说明。@omegastripes:循环遍历文件夹中的所有项目是非常糟糕的-永远不要这样做。使用Items.Find/FindNext或Items.Restrict。因为您建议使用
。删除方法而不是OP的。删除方法,所以最好描述一下两者之间的差异。@0m3r非常感谢您。是否有当天过滤的文档?
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