Application.AdvancedSearch 方法 (Outlook)
根据指定的 DAV 搜索和定位 (DASL) 搜索字符串进行搜索。
语法
expression。 AdvancedSearch
( _Scope_
, _Filter_
, _SearchSubFolders_
, _Tag_
)
expression:表示 Application 对象的变量。
参数
名称 | 必需/可选 | 数据类型 | 说明 |
---|---|---|---|
Scope | 必需 | String | 搜索范围。 例如文件夹路径。 建议将文件夹路径括在单引号内。 否则,如果文件夹路径包含特殊字符(包括 Unicode 字符),搜索可能不会返回正确结果。 若要指定多个文件夹路径,请用单引号引起每个文件夹路径,然后再用逗号隔开这些文件夹路径。 |
Filter | 可选 | Variant | 定义搜索参数的 DASL 搜索筛选器。 |
SearchSubFolders | 可选 | Variant | 确定搜索是否包括文件夹的子文件夹。 |
Tag | 可选 | Variant | 指定作为搜索标识符的名称。 |
返回值
一个表示搜索结果的 Search 对象。
备注
通过调用 AdvancedSearch 方法在连续行代码中,可以同时运行多个搜索。 但是,应该注意: 以编程方式创建大量的搜索文件夹会导致重大同时搜索活动会影响性能的 Outlook 中,在尤其是 Outlook 进行联机 Exchange 模式搜索。
Outlook 对象模型中的 AdvancedSearch 方法和相关功能不会创建将在 Outlook 用户界面中显示的搜索文件夹。 但是,可以使用返回的 Search 对象的 Save 方法创建一个搜索文件夹,该搜索文件夹将显示在 Outlook 用户界面的“搜索文件夹”列表中。
使用 Scope 参数,可以指定同一存储区中的一个或多个文件夹,但不能在多个存储区中指定多个文件夹。 若要在同一个存储为 Scope参数指定多个文件夹,用逗号隔开每个文件夹路径,将每个文件夹路径括在单引号中。 如收件箱或已发送邮件的默认文件夹,可以使用简单的文件夹名称而不是完整的文件夹路径。 例如,以下两行代码表示有效 Scope参数:
Scope = "'Inbox', 'Sent Items'"
Scope = "'" & Application.Session.GetDefaultFolder(olFolderInbox).FolderPath _
& "','" & Application.Session.GetDefaultFolder(olFolderSentMail).FolderPath & "'"
Filter 参数可以是任何有效的 DASL 查询。 有关 DASL 查询的其他信息,请参阅 按命名空间筛选项 和 引用属性。 请注意,不能对高级搜索的 Filter 参数使用 JET 查询。 如果包含在 Scope参数中指定的文件夹的存储区启用了即时搜索,您可以使用即时搜索关键字提高搜索性能。 如果使用即时搜索关键字并不启用了即时搜索,则 Outlook 会返回错误,搜索将失败。
示例
以下Visual Basic for Applications (VBA) 示例在收件箱中搜索主题为 Test 的项目,并显示搜索返回的电子邮件项目的发件人姓名。 搜索完成后, AdvancedSearchComplete 事件过程会将布尔型 blnSearchComp
设置为 True 。 此布尔变量 TestAdvancedSearchComplete()
过程用于确定搜索何时完成。 示例代码必须放在 类模块(如 ThisOutlookSession
)中,并且必须先调用过程, TestAdvancedSearchComplete()
然后 Outlook 才能调用事件过程。
Public blnSearchComp As Boolean
Private Sub Application_AdvancedSearchComplete(ByVal SearchObject As Search)
Debug.Print "The AdvancedSearchComplete Event fired"
If SearchObject.Tag = "Test" Then
m_SearchComplete = True
End If
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, "Test")
While blnSearchComp = False
DoEvents
Wend
Set rsts = sch.Results
For i = 1 To rsts.Count
Debug.Print rsts.Item(i).SenderName
Next
End Sub
下面的 Microsoft Visual Basic for Applications 示例使用 AdvancedSearch 方法来创建新的搜索。 由 AdvancedSearch 方法的 Filter 参数指定的搜索参数将返回“收件箱”和“已发送邮件”文件夹中所有主题短语匹配或包含“Office”的项目。 用户的收件箱和已发送的邮件文件夹被指定为搜索的范围,将 SearchSubFolders 属性设置为 True 。 搜索完成后, GetTable 方法调用 搜索 对象性能的搜索结果的枚举。
Public m_SearchComplete As Boolean
Private Sub Application_AdvancedSearchComplete(ByVal SearchObject As Search)
If SearchObject.Tag = "MySearch" Then
m_SearchComplete = True
End If
End Sub
Sub TestSearchForMultipleFolders()
Dim Scope As String
Dim Filter As String
Dim MySearch As Outlook.Search
Dim MyTable As Outlook.Table
Dim nextRow As Outlook.Row
m_SearchComplete = False
'Establish scope for multiple folders
Scope = "'" & Application.Session.GetDefaultFolder( _
olFolderInbox).FolderPath _
& "','" & Application.Session.GetDefaultFolder( _
olFolderSentMail).FolderPath & "'"
'Establish filter
If Application.Session.DefaultStore.IsInstantSearchEnabled Then
Filter = Chr(34) & "urn:schemas:httpmail:subject" _
& Chr(34) & " ci_phrasematch 'Office'"
Else
Filter = Chr(34) & "urn:schemas:httpmail:subject" _
& Chr(34) & " like '%Office%'"
End If
Set MySearch = Application.AdvancedSearch( _
Scope, Filter, True, "MySearch")
While m_SearchComplete <> True
DoEvents
Wend
Set MyTable = MySearch.GetTable
Do Until MyTable.EndOfTable
Set nextRow = MyTable.GetNextRow()
Debug.Print nextRow("Subject")
Loop
End Sub
另请参阅
支持和反馈
有关于 Office VBA 或本文档的疑问或反馈? 请参阅 Office VBA 支持和反馈,获取有关如何接收支持和提供反馈的指南。