我正在寻找一种方法,以编程方式在Outlook中为指定条件打开搜索视图。我看到了其他问题,例如VBA Search in Outlook,但它们是以编程方式检索搜索结果。
我基本上寻找与功能区选项Message / Editing / Related:
相同的功能列表视图更改为
我希望能够使用VBA宏做同样的事情但不打开消息并使用不同的搜索条件
答案 0 :(得分:0)
有两种方法可以在Outlook中显示搜索结果:
Outlook对象模型中的Application类的AdvancedSearch
方法允许在Outlook中的多个文件夹中执行搜索。在Outlook中使用AdvancedSearch
方法的主要好处是:
AdvancedSearch
方法会在后台自动运行它。Find
/ FindNext
方法可以应用于特定的Items集合(请参阅Outlook中Folder类的Items属性)。IsInstantSearchEnabled
类的Store
属性)。不可否认,Search
类允许您将搜索结果保存在搜索文件夹中(实际上,它不包含任何项目,仅包含对范围文件夹中项目的引用)。您只需要在Save
事件处理程序中的Search
对象上调用AdvanvedSearchComplete
方法。
自定义Outlook中文件夹或资源管理器对象的当前视图。 CurrentView属性返回View
类的实例。有关详细信息,请参阅HowTo: Use the View.XML property to filter Outlook items。
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