Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 按主题行和发件人电子邮件地址删除Outlook项目_Vba_Outlook - Fatal编程技术网

Vba 按主题行和发件人电子邮件地址删除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

下面是删除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 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