XmlDocument in Outlook VBA

倖福魔咒の 提交于 2019-12-11 08:37:10

问题


I am trying to adapt this answer, which I believe is in VB.NET, for use with Outlook VBA.

I made some progress by getting the syntax corrected for VBA, but I do not know how to resolve "Compile error: User-defined type not defined" on the line

Dim CurrentXML As XmlDocument

Tool > References includes Microsoft XML, v6.0 but searching for XmlDocument in Object Browser returns no results.

The complete code is as follows:

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:


The VBA code for Outlook should look like as follows

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


来源:https://stackoverflow.com/questions/51602735/xmldocument-in-outlook-vba

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!