VBA 在 Excel 中将 XML 读入树视图

VBA Reading XML into Treeview in Excel

提问人:Nick 提问时间:10/31/2023 更新时间:10/31/2023 访问量:44

问:

我在Excel中有一个带有Treeview控件的小窗体。参考包括 OLE 自动化、Microsoft Forms 2.0、Microsoft Windows 公共控件 6.0 (SP6) 和 Microsoft XML v6.0 我调用 LoadTreeViewFromXmlFile,在 UserForm_Initialize() 上给出有效的路径和文件名,如下所示:


    Call LoadTreeViewFromXmlFile("C:\Users\...\my.xml", TreeView1)

但我在 Sub AddChildrenToTreeView 中收到错误 13 类型不匹配,更具体地说是在 For Each 循环中。不明白为什么。有人可以建议我吗?提前非常感谢你。

Private Sub LoadTreeViewFromXmlFile(ByVal file_name As String, ByVal trv As TreeView)

    Dim xml_doc As DOMDocument60

    ' Load the XML file into the DOMDocument.
    Set xml_doc = New DOMDocument60
    xml_doc.Load file_name

    ' Add the root node's children to the TreeView.
    TreeView1.Nodes.Clear
    AddChildrenToTreeView trv, Nothing, _
        xml_doc.DocumentElement

End Sub

' Add this XML node's children to the indicated TreeView
' node.
Private Sub AddChildrenToTreeView(ByVal trv As TreeView, ByVal treeview_parent As Node, ByVal xml_node As IXMLDOMElement)
    
    Dim xml_child As IXMLDOMElement
    Dim new_node As Node
    
    ' Examine each XML child. Error 13 Type mismatch - why?
    For Each xml_child In xml_node.ChildNodes
        ' Add the child to the TreeView.
        If treeview_parent Is Nothing Then
            Set new_node = trv.Nodes.Add(, , , _
                xml_child.nodeName)
        Else
            Set new_node = trv.Nodes.Add(treeview_parent, _
                tvwChild, , xml_child.nodeName)
        End If
        new_node.EnsureVisible

        ' Add the child's children.
        AddChildrenToTreeView trv, new_node, xml_child
    Next xml_child
    
End Sub
Excel VBA XML 分析 树视图

评论

0赞 Nick 10/31/2023
我的XML具有具有属性的节点,例如,但我还不知道如何在TreeView中表示它们。任何想法都会受到高度赞赏。现在,我只想在我的表单中加载树视图,但由于该错误,我无法加载。谢谢。<Amt Ccy="EUR">2.50</Amt>

答:

2赞 Tim Williams 10/31/2023 #1

并非所有子节点都属于类型 - 您也有文本节点、注释等。IXMLDOMElement

这是针对 .Net,但您会看到基本思想:
https://learn.microsoft.com/en-us/dotnet/standard/data/xml/types-of-xml-nodes

您需要声明为不太具体的类型(可能xml_childIXMLDOMNode)

评论

0赞 Nick 11/1/2023
@Willia 比你蒂姆,我很感激。我按照建议更改了它,似乎它通过了这一点。它现在在下一个语句之前的倒数第二行弹出相同的错误,在 - 有什么想法吗?AddChildrenToTreeView trv, new_node, xml_child
0赞 Tim Williams 11/1/2023
您需要检查循环内部的 of,以确保您只处理 Element 类型的节点。Typexml_child
0赞 Tim Williams 11/1/2023
If xml_child.nodeType=NODE_ELEMENT ThenIf xml_child.nodeTypeString="element" Then