代码之家  ›  专栏  ›  技术社区  ›  Miserable Variable

Outlook VBA中的XmlDocument

  •  1
  • Miserable Variable  · 技术社区  · 6 年前

    我在努力适应 this answer ,我相信是 VB.NET ,用于 Outlook VBA .

    我在修改VBA的语法方面取得了一些进展,但我不知道如何解决 "Compile error: User-defined type not defined" 在线

    Dim CurrentXML As XmlDocument
    

    工具引用包括Microsoft XML v6.0,但在对象浏览器中搜索XML文档不会返回任何结果。

    完整代码如下:

    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
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Miserable Variable    6 年前

    Outlook的VBA代码应该如下所示

    Option Explicit
    
    Sub Search2()
    
        ' https://stackoverflow.com/a/50145011/18573
        ' Add reference Microsoft XML, v6.0
    
        Dim sFilter As String
        Dim oExplorer As Explorer
        Dim oView As View
        Dim oXML As DOMDocument60
        Dim cFilterNodes As IXMLDOMNodeList
        Dim cViewNodes As IXMLDOMNodeList
        Dim oFilterNode As IXMLDOMNode
        Dim oParentNode As IXMLDOMNode
        Dim y As Long
        Dim i As Long
    
        sFilter = "urn:schemas:httpmail:subject LIKE '%Build Error%'"
        Set oXML = New DOMDocument60
        Set oExplorer = ActiveExplorer
    
        If Not oExplorer Is Nothing Then
            Set oView = oExplorer.CurrentView
            If Not oView Is Nothing Then
                oXML.LoadXML oView.XML
                Set cFilterNodes = oXML.getElementsByTagName("filter")
                If cFilterNodes.Length > 0 Then
                    For y = 0 To cFilterNodes.Length - 1
                        Set oFilterNode = cFilterNodes(y)
                        If oFilterNode.HasChildNodes Then
                            For i = oFilterNode.ChildNodes.Length - 1 To 0 Step -1
                                oFilterNode.RemoveChild oFilterNode.ChildNodes(i)
                            Next
                        End If
                    Next
                    Set oFilterNode = cFilterNodes(0)
                    oFilterNode.appendChild oXML.createTextNode(sFilter)
                Else
                    Set cViewNodes = oXML.getElementsByTagName("view")
                    If cViewNodes.Length > 0 Then
                        Set oParentNode = cViewNodes(0)
                        Set oFilterNode = oXML.createElement("filter")
                        oParentNode.appendChild oFilterNode
                        oFilterNode.appendChild oXML.createTextNode(sFilter)
                    End If
                End If
            Else
                Set cViewNodes = oXML.getElementsByTagName("view")
                If cViewNodes.Length > 0 Then
                    Set oParentNode = cViewNodes(0)
                    Set oFilterNode = oXML.createElement("filter")
                    oParentNode.appendChild oFilterNode
                    oFilterNode.appendChild oXML.createTextNode(sFilter)
                End If
            End If
            oView.XML = oXML.XML
            oView.Apply
        End If
    
    End Sub