読者です 読者をやめる 読者になる 読者になる

発熱するマイナー魂

隠れた名作の発掘が生きがい。サブカル作品の感想とIT技術メモ中心のブログです。

【VBA】EXCELファイルの内容をXMLファイルに書き込む


スポンサードリンク

ときにはEXCELに記述した内容をXMLに出力したいこともあります。EXCELファイルのカラムを読み込み、それをXMLファイルの要素や属性に出力するサンプルプログラムを書きました。


f:id:yosinoo:20150903224455j:plain


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の属性、要素として書き込まれました。


関連:
【VBA】XMLファイルの内容をEXCELファイルに読み込む