对 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”的文件夹。用户的 InboxSent Items 文件夹被指定为搜索范围,并且 SearchSubFolders 属性 设置为 true。但是,只有第一个参数是必需的,其他都是可选的。