如何在Outlook中使用VBA来获取即时搜索到的邮件?

问题描述 投票:0回答:1

我正在使用VBA在Outlook中通过pdf附件的内容来查找邮件。从我了解的情况来看,唯一不打开每封邮件的方法是即时搜索。我找到了我要找的邮件。问题是,我不知道如何处理显示为结果的邮件。我没有找到如何将它们保存到收藏或其他东西的方法。我打破了我的牙齿在这两天了。请大家帮忙。我的搜索代码如下。

Sub Search_Email()
Dim ol As Outlook.Application
Dim ns As Outlook.Namespace
Dim olFolder As Outlook.MAPIFolder
Dim strFilter, txtSearch As String

Set ol = New Outlook.Application
Set ns = ol.GetNamespace("MAPI")
Set olFolder = ns.Folders("RS Cash Application Inbox").Folders("Remittances")

Set ol.ActiveExplorer.CurrentFolder = olFolder

strFilter = "5860626494"

txtSearch = "attachment:" & strFilter

ol.ActiveExplorer.Search txtSearch, olSearchScopeCurrentFolder
End Sub

请看打印屏幕。即时搜索的结果。我需要下载两个显示的邮件的附件。

screenshot

excel vba search outlook
1个回答
1
投票

当调用 Search,查询是在用户界面中运行的,没有程序化的机制来获取搜索结果。同时 Search 方法没有提供一个回调来让开发人员确定搜索何时完成。

相反,我建议使用 高级搜索 的方法 Application 类,该类提供了回调后获取结果的功能。在Outlook中使用AdvancedSearch方法的主要好处是。

  • 搜索是在另一个线程中进行的。你不需要手动运行另一个线程,因为AdvancedSearch方法会在后台自动运行它。
  • 可以在任何位置搜索任何项目类型:邮件,约会,日历,备注等,即超出某个文件夹的范围。该 RestrictFindFindNext 方法可以应用到特定的 Items 集(见 Items 的财产 Folder 类)。)
  • 完全支持DASL查询(自定义属性也可用于搜索)。你可以在 筛选 MSDN中的文章。为了提高搜索性能,如果商店启用了即时搜索,可以使用即时搜索关键字(参见 IsInstantSearchEnabled 属性)。)
  • 您可以在任何时候使用 Stop 方法。

要检索搜索结果,你需要处理搜索类的 AdvancedSearchComplete 事件,该事件用于返回由该事件创建的对象。AdvancedSearch 方法时,才会触发该事件。该事件只有在 AdvancedSearch 方法以程序方式执行。

Public blnSearchComp As Boolean

Private Sub Application_AdvancedSearchComplete(ByVal SearchObject As Search)
  MsgBox "The AdvancedSearchComplete Event fired."
  blnSearchComp = True
End Sub


Sub TestAdvancedSearchComplete()
  Dim sch As Outlook.Search
  Dim rsts As Outlook.Results
  Dim i As Integer
  blnSearchComp = False
  Const strF As String = "urn:schemas:mailheader:subject = 'Test'"
  Const strS As String = "Inbox"

  Set sch = Application.AdvancedSearch(strS, strF)

  While blnSearchComp = False
    DoEvents
  Wend

  Set rsts = sch.Results
  For i = 1 To rsts.Count
     MsgBox rsts.Item(i).SenderName
  Next
End Sub

在使用 Search 在Outlook用户界面上,您可以访问 CurrentView 通过访问相应的属性,在 Explorer 对象。该 View 类提供了 滤波器 属性,它返回一个代表视图过滤器的字符串值。这个属性的值是一个字符串,用DAV搜索和定位(DASL)语法,代表视图的当前过滤器。所以,你可以将它用于 AdvancedSearch 搜索字符串。

© www.soinside.com 2019 - 2024. All rights reserved.