Outlook VBA中的XML文档

Outlook VBA中的XML文档,vba,outlook,Vba,Outlook,我正在尝试将VB.NET中的内容改编为与outlookvba一起使用 通过纠正VBA的语法,我取得了一些进展,但我不知道如何解决行中的“编译错误:未定义用户定义类型” Dim CurrentXML As XmlDocument 工具>引用包括Microsoft XML v6.0,但在对象浏览器中搜索XmlDocument不会返回任何结果 完整代码如下: Sub Search2() ' https://stackoverflow.com/a/50145011/18573 Dim sFilter

我正在尝试将
VB.NET
中的内容改编为与
outlookvba
一起使用

通过纠正VBA的语法,我取得了一些进展,但我不知道如何解决行中的
“编译错误:未定义用户定义类型”

Dim CurrentXML As XmlDocument
工具>引用包括Microsoft XML v6.0,但在对象浏览器中搜索XmlDocument不会返回任何结果

完整代码如下:

Sub Search2()
' https://stackoverflow.com/a/50145011/18573

Dim sFilter As String
Dim CurrentExplorer As Outlook.Explorer
Set CurrentExplorer = Nothing
Dim CurrentView As Outlook.View
Set CurrentView = Nothing

' ERROR ON THE FOLLOWING LINE
Dim CurrentXML As XmlDocument
Set CurrentXML = New XmlDocument

Dim CurrentFilterNodes, CurrentViewNodes As XmlNodeList
Dim CurrentFilterNode, CurrentParentNode As XmlNode


sFilter = "urn:schemas:httpmail:subject LIKE '%Build Error%'"

CurrentExplorer = TryCast(ExplorerObj, Outlook.Explorer)

If (CurrentExplorer Is Not Nothing) Then
    CurrentView = CurrentExplorer.CurrentView
    If (CurrentView Is Not Nothing) Then

    CurrentXML.LoadXML (CurrentView.xml)
    CurrentFilterNodes = _
        CurrentXML.getElementsByTagName("filter")
    If CurrentFilterNodes.Count > 0 Then
        For y = 0 To CurrentFilterNodes.Count - 1
            CurrentFilterNode = CurrentFilterNodes(y)
            If CurrentFilterNode.HasChildNodes Then
                For i = CurrentFilterNode.ChildNodes.Count - 1 To 0 Step -1
                    CurrentFilterNode.RemoveChild (CurrentFilterNode.ChildNodes(i))
                Next i
            End If
        Next y
        CurrentFilterNode = CurrentFilterNodes(0)
        CurrentFilterNode.appendChild ( _
            CurrentXML.createTextNode(sFilter))
    Else
        CurrentViewNodes = CurrentXML.getElementsByTagName("view")
        If CurrentViewNodes Is Not 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

    Marshal.ReleaseComObject (CurrentView)

End If
End Sub

Outlook的VBA代码应如下所示

选项显式
次级搜索2()
' https://stackoverflow.com/a/50145011/18573
'添加引用Microsoft XML,v6.0
作为字符串的Dim sFilter
Dim oExplorer作为资源管理器
昏暗的景色
Dim-oXML作为DOMDocument60
作为IXMLDOMNodeList的Dim cFilterNodes
作为IXMLDOMNodeList的Dim cViewNodes
作为IXMLDOMNode的筛选器节点的Dim
Dim oParentNode作为IXMLDOMNode
长得一样暗
我想我会坚持多久
sFilter=“urn:schemas:httpmail:subject类似于“%builderror%”
设置oXML=newDOMDocument60
设置oExplorer=ActiveExplorer
如果不是,那么Explorer什么都不是
设置oView=oExplorer.CurrentView
如果不是,oView什么都不是
oXML.LoadXML oView.XML
设置cFilterNodes=oXML.getElementsByTagName(“过滤器”)
如果cFilterNodes.Length>0,则
对于y=0到cFilterNodes.Length-1
过滤器节点集=过滤器节点(y)
如果oFilterNode.HasChildNodes,则
对于i=oFilterNode.ChildNodes.Length-1到0步骤-1
oFilterNode.RemoveChild of ilternode.ChildNodes(i)
下一个
如果结束
下一个
过滤器节点集=过滤器节点(0)
oFilterNode.appendChild oXML.createTextNode(sFilter)
其他的
设置cViewNodes=oXML.getElementsByTagName(“视图”)
如果cViewNodes.Length>0,则
设置oParentNode=cViewNodes(0)
过滤器节点集=oXML.createElement(“过滤器”)
oParentNode.AppendFilterNode的子级
oFilterNode.appendChild oXML.createTextNode(sFilter)
如果结束
如果结束
其他的
设置cViewNodes=oXML.getElementsByTagName(“视图”)
如果cViewNodes.Length>0,则
设置oParentNode=cViewNodes(0)
过滤器节点集=oXML.createElement(“过滤器”)
oParentNode.AppendFilterNode的子级
oFilterNode.appendChild oXML.createTextNode(sFilter)
如果结束
如果结束
oView.XML=oXML.XML
oView.申请
如果结束
端接头

尝试
XmlDocument
->
DOMDocument
XmlNodeList
->
IXMLDOMNodeList
XmlNode
。还要注意在VBA中对
Dim
语句使用逗号。或者不要在这里使用逗号。谢谢@omegastripes,还有关于Dim语句中逗号的额外建议。我不知道这件事,肯定会被它绊倒的。如果您可以将您的评论转换为答案,那么我可以接受。还有许多其他问题,如
TryCast
非空
封送
,以及缺少
设置
关键字。还有什么是
ExplorerObj
?非常感谢您这么做。我不得不将
DOMDocument
更改为
DOMDocument60
。这很容易,但还有另一个问题:在设置cFilterNodes=oXML.getElementsByTagName(“过滤器”)之后,长度为空,因为我没有设置任何过滤器。因此,我按照您的示例添加了一个节点,就像您在没有当前视图时所做的那样。事实上,我不确定CurrentView何时为null,但这并不重要。