XML形式のデータは階層構造を持つため、必要な情報をピンポイントで取り出すには、XPath(XML Path Language)による指定が非常に有効です。
Excel VBAでは、MSXML2.DOMDocument
を使ってXPath式を活用することで、対象ノードを的確に取得し、Excelに書き出す処理を簡潔に実装できます。
この記事では、XPath式を用いて特定の属性や要素を持つノードを検索し、その内容をExcelに出力する方法をご紹介いたします。
目次
想定するXML構造(例:staff_list.xml
)
<staffs>
<staff id="A01">
<name>鈴木一郎</name>
<department>営業部</department>
</staff>
<staff id="A02">
<name>佐藤花子</name>
<department>総務部</department>
</staff>
<staff id="A03">
<name>田中健太</name>
<department>営業部</department>
</staff>
</staffs>
このXMLから、以下の情報を抽出したいとします:
- IDが「A01」の社員の氏名(
<name>
タグ) - 所属が「営業部」のすべての社員の氏名を連結
VBAコード:XPathでノードを抽出してExcelに出力
Sub ExtractFromXMLwithXPath()
Dim xmlDoc As Object
Dim node As Object, nodeList As Object
Dim resultText As String
Set xmlDoc = CreateObject("MSXML2.DOMDocument.6.0")
xmlDoc.async = False
xmlDoc.Load ThisWorkbook.Path & "\staff_list.xml"
' IDがA01の氏名を抽出
Set node = xmlDoc.SelectSingleNode("/staffs/staff[@id='A01']/name")
ThisWorkbook.Worksheets(1).Range("C2").Value = node.Text
' 営業部に所属する全員の氏名を抽出
Set nodeList = xmlDoc.SelectNodes("/staffs/staff[department='営業部']/name")
For Each node In nodeList
resultText = resultText & node.Text & "、"
Next
If Len(resultText) > 0 Then resultText = Left(resultText, Len(resultText) - 1)
ThisWorkbook.Worksheets(1).Range("C3").Value = resultText
End Sub
ポイント解説
項目 | 説明 |
---|---|
SelectSingleNode() | 単一ノードをXPathで検索(属性や階層指定が可能) |
SelectNodes() | 条件に一致するノードを複数取得(ループで処理) |
@id='A01' | 属性 id が “A01” のノードを指定 |
[department='営業部'] | 子要素の値に基づく条件指定 |
node.Text | タグ内のテキストを取得 |
実行結果のイメージ(Excel)
C列 | |
---|---|
C2: | 鈴木一郎 |
C3: | 鈴木一郎、田中健太 |
応用アイディア
SelectNodes("//staff[starts-with(department,'営')]")
のようなXPath関数で曖昧検索も可能です。- XMLの階層が深い場合でも、XPathにより柔軟に絞り込みできます。
- 抽出結果を他シートや別ブックへ転記する処理にも容易に組み込めます。
注意点
- XMLファイルの文字コードがUTF-8やShift-JISで保存されている場合、環境により文字化けする可能性があるため注意が必要です。
- XPath構文は構造に厳密なため、タグ名のスペルミスや階層誤りに注意してください。
まとめ
XPath式を使えば、XMLの複雑な構造の中から必要なデータを的確に抽出し、Excelへ簡潔に転記することができます。
Excel VBAとXMLの連携を活用することで、システムデータや設定ファイルを効率よく活用できるようになります。
業務自動化やマスタ管理の効率化に、ぜひこの方法をご活用ください。