以编程方式打开搜索视图

时间:2018-05-02 16:54:56

标签: vba outlook outlook-vba

我正在寻找一种方法,以编程方式在Outlook中为指定条件打开搜索视图。我看到了其他问题,例如VBA Search in Outlook,但它们是以编程方式检索搜索结果。

我基本上寻找与功能区选项Message / Editing / Related:

相同的功能

当我通过双击邮件打开邮件然后单击“此对话中的邮件” enter image description here

列表视图更改为

enter image description here

我希望能够使用VBA宏做同样的事情但不打开消息并使用不同的搜索条件

1 个答案:

答案 0 :(得分:0)

有两种方法可以在Outlook中显示搜索结果:

  1. Outlook对象模型中的Application类的AdvancedSearch方法允许在Outlook中的多个文件夹中执行搜索。在Outlook中使用AdvancedSearch方法的主要好处是:

    • 搜索在另一个线程中执行。您不需要手动运行另一个线程,因为AdvancedSearch方法会在后台自动运行它。
    • 可以在任何位置搜索任何项目类型:邮件,约会,日历,备注等,即超出某个文件夹的范围。 Restrict和Find / FindNext方法可以应用于特定的Items集合(请参阅Outlook中Folder类的Items属性)。
    • 完全支持DASL查询(自定义属性也可用于搜索)。您可以在MSDN中的Filtering文章中详细了解这一点。要提高搜索性能,如果为商店启用了即时搜索,则可以使用即时搜索关键字(请参阅IsInstantSearchEnabled类的Store属性)。
    • 最后,您可以随时使用Search类的Stop方法停止搜索过程。

    不可否认,Search类允许您将搜索结果保存在搜索文件夹中(实际上,它不包含任何项目,仅包含对范围文件夹中项目的引用)。您只需要在Save事件处理程序中的Search对象上调用AdvanvedSearchComplete方法。

  2. 自定义Outlook中文件夹或资源管理器对象的当前视图。 CurrentView属性返回View类的实例。有关详细信息,请参阅HowTo: Use the View.XML property to filter Outlook items

  3.  Dim sFilter As String
     Dim CurrentExplorer As Outlook.Explorer = Nothing
     Dim CurrentView As Outlook.View = Nothing
     Dim CurrentXML As XmlDocument = New XmlDocument
     Dim CurrentFilterNodes, CurrentViewNodes As XmlNodeList
     Dim CurrentFilterNode, CurrentParentNode As XmlNode
    
     If TextBox1.Text.Length > 0 Then
         If rbtSubject.Checked Then
            sFilter = "urn:schemas:httpmail:subject LIKE '%" + _
            TextBox1.Text.Trim + "%'"
        Else
            sFilter = "urn:schemas:httpmail:textdescription LIKE '%" + _
            TextBox1.Text.Trim + "%'"
        End If
    
        CurrentExplorer = TryCast(ExplorerObj, Outlook.Explorer)
        If (CurrentExplorer IsNot Nothing) Then
            CurrentView = CurrentExplorer.CurrentView
            If (CurrentView IsNot Nothing) Then
                Try
                    CurrentXML.LoadXml(CurrentView.XML)
                    CurrentFilterNodes = _
                        CurrentXML.GetElementsByTagName("filter")
                    If CurrentFilterNodes.Count > 0 Then
                        For y As Integer = 0 _
                            To CurrentFilterNodes.Count - 1
                            CurrentFilterNode = CurrentFilterNodes(y)
                            If CurrentFilterNode.HasChildNodes Then
                                For i As Integer = _
                                CurrentFilterNode.ChildNodes.Count - 1 _
                                    To 0 Step -1
                                    CurrentFilterNode.RemoveChild( _
                                        CurrentFilterNode.ChildNodes(i))
                                Next
                            End If
                        Next
                        CurrentFilterNode = CurrentFilterNodes(0)
                        CurrentFilterNode.AppendChild( _
                            CurrentXML.CreateTextNode(sFilter))
                    Else
                        CurrentViewNodes = CurrentXML. _
                            GetElementsByTagName("view")
                        If CurrentViewNodes IsNot Nothing Then
                            CurrentParentNode = CurrentViewNodes(0)
                            CurrentFilterNode = CurrentXML. _
                                CreateElement("filter")
                            CurrentParentNode.AppendChild( _
                                CurrentFilterNode)
                            CurrentFilterNode.AppendChild( _
                                CurrentXML.CreateTextNode(sFilter))
                        End If
                    End If
                    CurrentView.XML = CurrentXML.InnerXml
                    CurrentView.Apply()
                Finally
                    Marshal.ReleaseComObject(CurrentView)
                End Try
            End If
        End If
    End If