从命名单元格及其值创建 XML 文件
Create XML file from named cells and their values
我想根据宏中的命名单元格及其值创建一个 XML 文件,
最后objective是在命名单元格上循环,从名称中提取信息以创建节点,并通过遵循非常精确的结构从它们的值中提取信息以创建其他节点
作为 VBA 的初学者 Excel
我尝试了这些代码只是为了在 sheet 上创建与单元格名称一样多的节点,但它不起作用
Sub test2xml()
Dim Doc_XML As Object 'Va nous permettre de créer le XML
Dim Root As Object '... de créer la racine du XML
Dim Node As Object '... de créer les noeuds
Dim Name As Object '... de créer les attributs
Dim Chemin As String 'Chemin de sauvegarde
Set Doc_XML = CreateObject("MSXML2.DOMDocument") 'Création du XML
'Ajout des données d'encodage/etc...
Set Node = Doc_XML.createProcessingInstruction("xml", "version=""1.0"" encoding=""utf-8""")
Doc_XML.appendChild Node 'Ajout des données au fichier
Set Node = Nothing 'Remise à zéro du noeud
Set Root = Doc_XML.createElement("Root") 'Création d'une racine
Doc_XML.appendChild Root 'Ajout de la racine au XML
Set Node = Doc_XML.createElement("Child55") 'Création d'un noeud
Root.appendChild Node 'Ajout du noeud à la racine
Node.Text = "Text 1" 'Ajout d'un texte dans le noeud
Set Node = Nothing
Dim Plage As Range
Dim Nm As Name
On Error Resume Next
'Boucle sur les noms du classeur
For Each Nm In ThisWorkbook.Names
Set Plage = Nm.RefersToRange
If Not Plage Is Nothing Then
'Vérifie si le nom appartient à la feuille
If Worksheets("T06").Name = Plage.Worksheet.Name Then _
Node = Doc_XML.createElement("ValeurCellule") 'Création d'un noeud
Root.appendChild Node 'Ajout du noeud à la racine
Node.Text = Nm.Name
Set Node = Nothing
End If
Set Plage = Nothing
Next Nm
'Sauvegarde
Chemin = ThisWorkbook.Path & "\Nom du Fichier.xml" 'Chemin de sauvegarde + Nom du fichier
Doc_XML.Save Chemin
End Sub
创建了XML文件,但只创建了第一个静态节点,
其他动态未创建
提前致谢
XML创作
If the Name object doesn't refer to a range (for example, if it refers to a constant or a formula), this property fails.
我想这些情况不会发生在你的 xml 结构中,所以你必须做一些错误处理。
但是,实际问题不是 RefersToRange 属性,而是一个简单的事实,即您必须 Set
个对象,例如
Set Node = Doc_XML.createElement(Nm.Name)
此外,我假设你想显示
- 单元格名称作为节点名称(例如
<Name1>..</Name1>
,而不是每次<ValeurCellule>...</ValeurCellule>
- 要由引用单元格的内容而不是单元格名称填充的节点内容
...(如果没有,可以使用名称作为节点内容的重复 <ValeurCellule>...</ValeurCellule>
节点轻松改回类似于您的 OP 代码)
附加提示:我建议声明当前和最新版本 6(没有版本号声明默认为版本 3!),即
Set Doc_XML = CreateObject("MSXML2.DOMDocument.6.0")
接近您的代码示例post
Public Sub test2xml()
Dim Doc_XML As Object 'Va nous permettre de créer le XML
Dim Root As Object '... de créer la racine du XML
Dim Node As Object '... de créer les noeuds
Dim Name As Object '... de créer les attributs
Dim Chemin As String 'xml file path
''Stop
Set Doc_XML = CreateObject("MSXML2.DOMDocument.6.0") 'Création du XML <<version 6.0>>
'Ajout des données d'encodage/etc...
Set Node = Doc_XML.createProcessingInstruction("xml", "version=""1.0"" encoding=""utf-8""")
Doc_XML.appendChild Node 'Ajout des données au fichier
'Set Node = Nothing 'Remise à zéro du noeud
Set Root = Doc_XML.createElement("Root") 'Création d'une racine
Doc_XML.appendChild Root 'Ajout de la racine au XML
Set Node = Doc_XML.createElement("Child55") 'Création d'un noeud
Root.appendChild Node 'Ajout du noeud à la racine
Node.Text = "Text 1" 'Ajout d'un texte dans le noeud
Dim Plage As Range
Dim Nm As Name
'Loop through workbook names
For Each Nm In ThisWorkbook.Names
On Error Resume Next
Set Plage = Nm.RefersToRange
' Error handling immediately after the risky property
If Err.Number = 0 Then
Debug.Print Nm & " refers to ~> " & Plage.Value ' display only for testing, omit name + value
Else
Debug.Print Nm & " Error No " & Err.Number & "**refers to constant or formula: " & Evaluate(Nm.RefersTo)
End If
If Not Plage Is Nothing Then
'check if correct worksheet name, then >>Set<< Node
If Worksheets("T06").Name = Plage.Worksheet.Name Then _
Set Node = Doc_XML.createElement(Nm.Name) '<~~ Création d'un noeud with the ~> Cell's Name
Root.appendChild Node 'Ajout du noeud à la racine
Node.Text = Plage.Value 'cell content
End If
Set Plage = Nothing
Next Nm
'Save xml file
Chemin = ThisWorkbook.Path & "\xml\Nom du Fichier.xml" 'Chemin de sauvegarde + Nom du fichier
Doc_XML.Save Chemin 'save xml file
'Debug.Print Doc_XML.XML ' optional display in immediate window
End Sub
我想根据宏中的命名单元格及其值创建一个 XML 文件,
最后objective是在命名单元格上循环,从名称中提取信息以创建节点,并通过遵循非常精确的结构从它们的值中提取信息以创建其他节点
作为 VBA 的初学者 Excel 我尝试了这些代码只是为了在 sheet 上创建与单元格名称一样多的节点,但它不起作用
Sub test2xml()
Dim Doc_XML As Object 'Va nous permettre de créer le XML
Dim Root As Object '... de créer la racine du XML
Dim Node As Object '... de créer les noeuds
Dim Name As Object '... de créer les attributs
Dim Chemin As String 'Chemin de sauvegarde
Set Doc_XML = CreateObject("MSXML2.DOMDocument") 'Création du XML
'Ajout des données d'encodage/etc...
Set Node = Doc_XML.createProcessingInstruction("xml", "version=""1.0"" encoding=""utf-8""")
Doc_XML.appendChild Node 'Ajout des données au fichier
Set Node = Nothing 'Remise à zéro du noeud
Set Root = Doc_XML.createElement("Root") 'Création d'une racine
Doc_XML.appendChild Root 'Ajout de la racine au XML
Set Node = Doc_XML.createElement("Child55") 'Création d'un noeud
Root.appendChild Node 'Ajout du noeud à la racine
Node.Text = "Text 1" 'Ajout d'un texte dans le noeud
Set Node = Nothing
Dim Plage As Range
Dim Nm As Name
On Error Resume Next
'Boucle sur les noms du classeur
For Each Nm In ThisWorkbook.Names
Set Plage = Nm.RefersToRange
If Not Plage Is Nothing Then
'Vérifie si le nom appartient à la feuille
If Worksheets("T06").Name = Plage.Worksheet.Name Then _
Node = Doc_XML.createElement("ValeurCellule") 'Création d'un noeud
Root.appendChild Node 'Ajout du noeud à la racine
Node.Text = Nm.Name
Set Node = Nothing
End If
Set Plage = Nothing
Next Nm
'Sauvegarde
Chemin = ThisWorkbook.Path & "\Nom du Fichier.xml" 'Chemin de sauvegarde + Nom du fichier
Doc_XML.Save Chemin
End Sub
创建了XML文件,但只创建了第一个静态节点, 其他动态未创建
提前致谢
XML创作
If the Name object doesn't refer to a range (for example, if it refers to a constant or a formula), this property fails.
我想这些情况不会发生在你的 xml 结构中,所以你必须做一些错误处理。
但是,实际问题不是 RefersToRange 属性,而是一个简单的事实,即您必须 Set
个对象,例如
Set Node = Doc_XML.createElement(Nm.Name)
此外,我假设你想显示
- 单元格名称作为节点名称(例如
<Name1>..</Name1>
,而不是每次<ValeurCellule>...</ValeurCellule>
- 要由引用单元格的内容而不是单元格名称填充的节点内容
...(如果没有,可以使用名称作为节点内容的重复 <ValeurCellule>...</ValeurCellule>
节点轻松改回类似于您的 OP 代码)
附加提示:我建议声明当前和最新版本 6(没有版本号声明默认为版本 3!),即
Set Doc_XML = CreateObject("MSXML2.DOMDocument.6.0")
接近您的代码示例post
Public Sub test2xml()
Dim Doc_XML As Object 'Va nous permettre de créer le XML
Dim Root As Object '... de créer la racine du XML
Dim Node As Object '... de créer les noeuds
Dim Name As Object '... de créer les attributs
Dim Chemin As String 'xml file path
''Stop
Set Doc_XML = CreateObject("MSXML2.DOMDocument.6.0") 'Création du XML <<version 6.0>>
'Ajout des données d'encodage/etc...
Set Node = Doc_XML.createProcessingInstruction("xml", "version=""1.0"" encoding=""utf-8""")
Doc_XML.appendChild Node 'Ajout des données au fichier
'Set Node = Nothing 'Remise à zéro du noeud
Set Root = Doc_XML.createElement("Root") 'Création d'une racine
Doc_XML.appendChild Root 'Ajout de la racine au XML
Set Node = Doc_XML.createElement("Child55") 'Création d'un noeud
Root.appendChild Node 'Ajout du noeud à la racine
Node.Text = "Text 1" 'Ajout d'un texte dans le noeud
Dim Plage As Range
Dim Nm As Name
'Loop through workbook names
For Each Nm In ThisWorkbook.Names
On Error Resume Next
Set Plage = Nm.RefersToRange
' Error handling immediately after the risky property
If Err.Number = 0 Then
Debug.Print Nm & " refers to ~> " & Plage.Value ' display only for testing, omit name + value
Else
Debug.Print Nm & " Error No " & Err.Number & "**refers to constant or formula: " & Evaluate(Nm.RefersTo)
End If
If Not Plage Is Nothing Then
'check if correct worksheet name, then >>Set<< Node
If Worksheets("T06").Name = Plage.Worksheet.Name Then _
Set Node = Doc_XML.createElement(Nm.Name) '<~~ Création d'un noeud with the ~> Cell's Name
Root.appendChild Node 'Ajout du noeud à la racine
Node.Text = Plage.Value 'cell content
End If
Set Plage = Nothing
Next Nm
'Save xml file
Chemin = ThisWorkbook.Path & "\xml\Nom du Fichier.xml" 'Chemin de sauvegarde + Nom du fichier
Doc_XML.Save Chemin 'save xml file
'Debug.Print Doc_XML.XML ' optional display in immediate window
End Sub