(Outlook) 的 Application.AdvancedSearch 方法
會根據指定的 DAV 搜尋及尋找 (DASL) 搜尋字串來執行搜尋。
語法
運算式。 AdvancedSearch
( _Scope_
, _Filter_
, _SearchSubFolders_
, _Tag_
)
expression 代表 Application 物件的變數。
參數
名稱 | 必要/選用 | 資料類型 | 描述 |
---|---|---|---|
Scope | 必要 | 字串 | 搜尋的範圍。 例如,資料夾的資料夾路徑。 建議將資料夾路徑括在單引號內。 否則,如果資料夾路徑包含特殊字元,包括 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。 當搜尋完成時,會在Search物件上呼叫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 支援與意見反應。