Метод Application.AdvancedSearch (Outlook)
Выполняет поиск на основе указанной строки поиска DAV Search and Locating (DASL).
Синтаксис
выражение. AdvancedSearch
( _Scope_
, _Filter_
, _SearchSubFolders_
, _Tag_
)
выражение: переменная, представляющая объект Application.
Параметры
Имя | Обязательный или необязательный | Тип данных | Описание |
---|---|---|---|
Scope | Обязательный | String | Область поиска. Например, путь к папке. Рекомендуется, чтобы путь к папке был заключен в одинарные кавычки. В противном случае поиск может не возвращать правильные результаты, если путь к папке содержит специальные символы, включая символы Юникода. Чтобы указать несколько путей к папкам, заключите каждый путь к папке в одинарные кавычки и разделите пути к папкам с одними кавычками с помощью запятой. |
Фильтр | Необязательный | Variant | Фильтр поиска DASL, определяющий параметры поиска. |
SearchSubFolders | Необязательный | Variant | Определяет, будет ли поиск включать какие-либо вложенные папки папки. |
Tag | Необязательный | Variant | Имя, заданное в качестве идентификатора для поиска. |
Возвращаемое значение
Объект Search , представляющий результаты поиска.
Замечания
Вы можете одновременно выполнить несколько поисковых запросов, вызвав метод AdvancedSearch в последовательных строках кода. Однако следует помнить, что программное создание большого количества папок поиска может привести к значительным одновременным действиям поиска, что повлияет на производительность Outlook, особенно если Outlook ведет поиск в режиме Exchange в интернете.
Метод AdvancedSearch и связанные функции в объектной модели Outlook не создают папку поиска, которая будет отображаться в пользовательском интерфейсе Outlook. Однако можно использовать метод Save возвращаемого объекта Search , чтобы создать папку поиска, которая будет отображаться в списке Папки поиска в пользовательском интерфейсе Outlook.
С помощью параметра Scope можно указать одну или несколько папок в одном хранилище, но нельзя указывать несколько папок в нескольких хранилищах. Чтобы указать несколько папок в одном хранилище для параметра Scope , используйте символ-запятую между каждым путем к папке и заключите каждый путь к папке в один кавычки. Для папок по умолчанию, таких как "Входящие" или "Отправленные", можно использовать простое имя папки вместо полного пути к папке. Например, следующие две строки кода представляют допустимые параметры области :
Scope = "'Inbox', 'Sent Items'"
Scope = "'" & Application.Session.GetDefaultFolder(olFolderInbox).FolderPath _
& "','" & Application.Session.GetDefaultFolder(olFolderSentMail).FolderPath & "'"
Параметр Filter может быть любым допустимым запросом DASL. Дополнительные сведения о запросах DASL см. в статьях Фильтрация элементов и Ссылка на свойства по пространству имен. Обратите внимание, что нельзя использовать запрос JET для параметра Filter расширенного поиска. Если в хранилище, содержащем папку, указанную в параметре Scope , включен мгновенный поиск, можно использовать ключевые слова мгновенного поиска, чтобы повысить производительность поиска. Если вы используете ключевые слова мгновенного поиска и мгновенный поиск не включен, Outlook вернет ошибку, и поиск завершится ошибкой.
Пример
В следующем примере Visual Basic для приложений (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 для приложений использует метод AdvancedSearch для создания нового поиска. Параметры поиска, заданные аргументом Filter метода AdvancedSearch , возвращают все элементы в папках "Входящие" и "Отправленные", где фраза"Тема" соответствует или содержит "Office". Папки "Входящие" и "Отправленные" пользователя указываются в качестве области поиска, а для свойства SearchSubFolders задано значение True. После завершения поиска метод GetTable вызывается в объекте Search для выполнения перечисления результатов поиска.
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 и обратная связь.