ときにはEXCELに記述した内容をXMLに出力したいこともあります。EXCELファイルのカラムを読み込み、それをXMLファイルの要素や属性に出力するサンプルプログラムを書きました。
XMLに書き込むクラスモジュールは次のように書きました。また、実行のために、VBAのTools->Referencesを開いて「Microsoft XML, v6.0」をチェックをつけておきます。
XmlWriter
Option Explicit ' DOM Private xmlDocument As MSXML2.DOMDocument ' ルート要素のノード Private membersNode As IXMLDOMNode ' コンストラクタ Public Sub Class_Initialize() End Sub ' ファイルの書き込み準備を行う Public Sub Prepare() ' MSXMLオブジェクトを生成 Set xmlDocument = Nothing Set xmlDocument = New MSXML2.DOMDocument ' XML宣言を生成 Dim processingInstruction As IXMLDOMProcessingInstruction Set processingInstruction = xmlDocument.createProcessingInstruction("xml", "version='1.0' encoding='utf-8'") Call xmlDocument.appendChild(processingInstruction) ' 共通要素/属性を生成 Set membersNode = xmlDocument.appendChild(xmlDocument.createElement("members")) End Sub ' member要素をDOMオブジェクトに追加する Public Function AppendMemberElement(ByVal attrId As Integer, ByVal childName As String, ByVal childAge As String) ' memberノード作成 Dim memberNode As IXMLDOMNode Set memberNode = xmlDocument.createElement("member") ' memberノードにid属性を追加 Dim idAttribute As MSXML2.IXMLDOMAttribute Set idAttribute = xmlDocument.createAttribute("id") idAttribute.NodeValue = attrId Call memberNode.Attributes.setNamedItem(idAttribute) ' nameノードを追加 Dim nameNode As IXMLDOMNode Set nameNode = xmlDocument.createElement("name") nameNode.text = childName Call memberNode.appendChild(nameNode) ' ageノードを追加 Dim ageNode As IXMLDOMNode Set ageNode = xmlDocument.createElement("age") ageNode.text = childAge Call memberNode.appendChild(ageNode) ' 作成したエレメントをrootに追加 Call membersNode.appendChild(memberNode) End Function ' XMLファイルを保存する Public Sub Save(filePath As String) xmlDocument.Save (filePath) End Sub ' デストラクタ Public Sub Class_Terminate() If Not xmlDocument Is Nothing Then Set xmlDocument = Nothing If Not membersNode Is Nothing Then Set membersNode = Nothing End Sub
まず、XML書き込み用のDOMDocumentオブジェクトをPrepareで準備します。DOMへの要素の追加はAppendMemberElementで行います。最後に、ファイルへの書き込みはSaveで行います。
要素の作成はcreateElementで行います。対象の要素に子要素を追加する場合はappendChildで行います。属性の作成はcreateAttributeで行い、その要素を対象要素へ追加する場合は、その要素のAttributesが持つsetNamedItemを呼び出します。
XMLWriterを利用して、EXCELのセルから読み込んだMemberの内容をXMLに書き込むモジュールは次のように書きました。
SampleXmlWriterModule
Option Explicit Sub WriteSample() ' 出力ファイル Dim outputFileName As String outputFileName = "C:\sample_output.xml" ' XMLの書き込み準備を行う Dim xw As XmlWriter Set xw = New XmlWriter xw.Prepare ' セルより読み込んだ値をDOMオブジェクトに追加する Dim rowIndex As Long rowIndex = 2 Do While Cells(rowIndex, 1) <> "" Call xw.AppendMemberElement(Cells(rowIndex, 1).Value, Cells(rowIndex, 2).Value, Cells(rowIndex, 3).Value) rowIndex = rowIndex + 1 Loop ' XMLファイルに書き込む xw.Save (outputFileName) Set xw = Nothing End Sub
これで、id、name、ageがXMLの属性、要素として書き込まれました。