Excel VBA Outlook - 主题包含未找到回复电子邮件

Excel VBA Outlook - Subject Contains Is Not Finding Reply Emails

如何将以下 Excel VBA 代码发送到 return 所有主题包含 'Timesheet 06/19/20' 的电子邮件?

下面的代码执行 return“Timesheet 06/19/20 - Name (EmpId)”。但是,它不会 RETURN“[外部] 回复:时间表 06/19/20 - 名称 (EmpId)”。我做错了什么?

     Public Function Test()
         Dim Folder As Outlook.Folder, MailItems As Outlook.Items, MailItem As Outlook.MailItem
         Dim Filter As String
    
         Filter = "@SQL=urn:schemas:httpmail:subject" & "" & " ci_phrasematch 'Timesheet 06/19/20'"
         Set Folder = Outlook.Application.GetNamespace("MAPI").GetDefaultFolder(olFolderInbox)
         Set MailItems = Folder.Items.Restrict(Filter)
         For Each MailItem In MailItems
             Debug.Print MailItem.Subject
         Next MailItem
     End Function

请注意,如果我将过滤器更改为搜索“[EXTERNAL] RE: Timesheet 06/19/20”,它会找到电子邮件。显然这对我的解决方案不起作用,因为我需要搜索“Timesheet 06/19/20”以容纳原始邮件、转发邮件和回复邮件。

感谢您的帮助!

不知道为什么,但是一封主题为“无法投递:时间表 06/19/20 - 名称 (EmpId)”的电子邮件引发了错误,导致代码提前退出 for 循环。下面的代码修复了被抛出的错误。

也许有人可以解释为什么上面的主题更喜欢循环的索引计数?

Public Function Test()
    Dim Folder As Outlook.Folder, MailItems As Outlook.Items, MailItem As Outlook.MailItem
    Dim Filter As String, idx As Long
    
    Filter = "@SQL=urn:schemas:httpmail:subject" & "" & " ci_phrasematch 'Timesheet 06/19/20'"
    
    Set Folder = Outlook.Application.GetNamespace("MAPI").GetDefaultFolder(olFolderInbox)
    Set MailItems = Folder.Items.Restrict(Filter)
    For idx = 1 To MailItems.Count
        Debug.Print MailItems(idx).Subject
    Next idx
    
End Function

您需要记住,Items 集合可能包含不同类型的项目,而不仅仅是邮件项目。因此,最好将项目定义为对象并在运行时检查项目的类型,然后再访问任何 属性 或特定于特定项目类型的方法。例如:

Public Function Test()
         Dim Folder As Outlook.Folder, MailItems As Outlook.Items, item As Object
         Dim Filter As String
    
         Filter = "@SQL=urn:schemas:httpmail:subject" & "" & " ci_phrasematch 'Timesheet 06/19/20'"
         Set Folder = Outlook.Application.GetNamespace("MAPI").GetDefaultFolder(olFolderInbox)
         Set MailItems = Folder.Items.Restrict(Filter)
         For Each item In MailItems
             Debug.Print TypeName(item)
         Next item
     End Function

阅读 How To: Use Restrict method to retrieve Outlook mail items from a folder 文章中有关 Restrict 方法的更多信息。