提问人:Nick 提问时间:10/31/2023 更新时间:10/31/2023 访问量:44
VBA 在 Excel 中将 XML 读入树视图
VBA Reading XML into Treeview in Excel
问:
我在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
答:
2赞
Tim Williams
10/31/2023
#1
并非所有子节点都属于类型 - 您也有文本节点、注释等。IXMLDOMElement
这是针对 .Net,但您会看到基本思想:
https://learn.microsoft.com/en-us/dotnet/standard/data/xml/types-of-xml-nodes
您需要声明为不太具体的类型(可能xml_child
IXMLDOMNode
)
评论
0赞
Nick
11/1/2023
@Willia 比你蒂姆,我很感激。我按照建议更改了它,似乎它通过了这一点。它现在在下一个语句之前的倒数第二行弹出相同的错误,在 - 有什么想法吗?AddChildrenToTreeView trv, new_node, xml_child
0赞
Tim Williams
11/1/2023
您需要检查循环内部的 of,以确保您只处理 Element 类型的节点。Type
xml_child
0赞
Tim Williams
11/1/2023
If xml_child.nodeType=NODE_ELEMENT Then
或If xml_child.nodeTypeString="element" Then
评论
<Amt Ccy="EUR">2.50</Amt>