对 Outlook 中的已删除项目使用 AdvancedSearch 失败
Using AdvancedSearch fails on deleted items in Outlook
我正在尝试对“已删除邮件”文件夹执行搜索,但我在第 Set Search = ...
行收到以下错误 Run-time error '-2147023281 (8007064f)': The operation failed
。代码 运行s 在收件箱上没有问题,但在任何其他文件夹上都无法 运行。
' Program.bas standard module
Option Explicit
Public Sub FindAndOpenMail()
Dim Query As String
' Construct filter. 0x0037001E represents Subject.
' ci_phrasematch is taken from Filtering Items Using Query Keywords (MS DOCS).
Query = "https://schemas.microsoft.com/mapi/proptag/0x0037001E" & _
" ci_phrasematch 'Inactive'"
Dim Search As Search
Set Search = Application.AdvancedSearch("Deleted Items", Query)
End Sub
AdvancedSearch
需要四个参数。他们每个人都以特定的方式建造。您的代码仅使用两个参数进行尝试,这是错误的。理论上第三个和第四个参数是可选的,但最后一个 是必需的 代码才能正常工作。
为了让它工作它并不像看起来那么简单... AdvancedSearch
在不同的线程中工作并且代码 知道 表示搜索已经完成。
Outlook 公开 AdvancedSearchComplete
已触发且必须使用的事件,以更改布尔变量值,'inform' 代码以继续下一步。
我在评论中问了一个问题,根据你的回答我可以继续一段工作代码。既然你这么试了,看来你对讨论的方法没有研究太多,无意冒犯...
假设您在 Outlook 应用程序中尝试代码并且只需要针对返回错误的代码行的解决方案,则第一个函数参数应构建为:
Dim delIt As Folder, sc As String 'the Scope parameter
Set delIt = Application.Session.GetDefaultFolder(olFolderDeletedItems)
sc = "'" & delIt.FolderPath & "'"
'then call the method as:
Set Search = Application.AdvancedSearch(sc, Query)
指定搜索范围时,您需要用撇号指定每个文件夹路径或名称,例如:
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
搜索的参数,由 AdvancedSearch
方法的 Filter
参数指定,将 return Inbox
和 [=14= 中的所有项目] Subject
phrase-matches 或包含“Office”的文件夹。用户的 Inbox
和 Sent Items
文件夹被指定为搜索范围,并且 SearchSubFolders
属性 设置为 true。但是,只有第一个参数是必需的,其他都是可选的。
我正在尝试对“已删除邮件”文件夹执行搜索,但我在第 Set Search = ...
行收到以下错误 Run-time error '-2147023281 (8007064f)': The operation failed
。代码 运行s 在收件箱上没有问题,但在任何其他文件夹上都无法 运行。
' Program.bas standard module
Option Explicit
Public Sub FindAndOpenMail()
Dim Query As String
' Construct filter. 0x0037001E represents Subject.
' ci_phrasematch is taken from Filtering Items Using Query Keywords (MS DOCS).
Query = "https://schemas.microsoft.com/mapi/proptag/0x0037001E" & _
" ci_phrasematch 'Inactive'"
Dim Search As Search
Set Search = Application.AdvancedSearch("Deleted Items", Query)
End Sub
AdvancedSearch
需要四个参数。他们每个人都以特定的方式建造。您的代码仅使用两个参数进行尝试,这是错误的。理论上第三个和第四个参数是可选的,但最后一个 是必需的 代码才能正常工作。
为了让它工作它并不像看起来那么简单... AdvancedSearch
在不同的线程中工作并且代码 知道 表示搜索已经完成。
Outlook 公开 AdvancedSearchComplete
已触发且必须使用的事件,以更改布尔变量值,'inform' 代码以继续下一步。
我在评论中问了一个问题,根据你的回答我可以继续一段工作代码。既然你这么试了,看来你对讨论的方法没有研究太多,无意冒犯...
假设您在 Outlook 应用程序中尝试代码并且只需要针对返回错误的代码行的解决方案,则第一个函数参数应构建为:
Dim delIt As Folder, sc As String 'the Scope parameter
Set delIt = Application.Session.GetDefaultFolder(olFolderDeletedItems)
sc = "'" & delIt.FolderPath & "'"
'then call the method as:
Set Search = Application.AdvancedSearch(sc, Query)
指定搜索范围时,您需要用撇号指定每个文件夹路径或名称,例如:
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
搜索的参数,由 AdvancedSearch
方法的 Filter
参数指定,将 return Inbox
和 [=14= 中的所有项目] Subject
phrase-matches 或包含“Office”的文件夹。用户的 Inbox
和 Sent Items
文件夹被指定为搜索范围,并且 SearchSubFolders
属性 设置为 true。但是,只有第一个参数是必需的,其他都是可选的。