Excel VBAでXMLデータを読み込み、データを瞬時に整理しよう!

Excelは、データ処理と整理の強力なツールとして知られています。この記事では、Excel VBAを使用して、XMLデータを読み込む方法を紹介します。XMLデータは、Webからのデータ取得やデータ交換のために広く使用されており、Excelにそのデータを効率的に統合することは非常に重要です。
また、XMLデータをExcelに読み込むメリットについて説明し、サンプルアプリの使い方を詳しく解説します。さらにVBAコードの処理内容を分かりやすく説明し、すぐに使えるようにサンプルコードを紹介したいと思います。

XMLデータをExcelに読み込むメリット

XMLデータをExcelに読み込むことには多くのメリットがあります。例えば、ウェブからのデータ取得、外部データの統合、またはXML形式で提供されたデータの分析などが考えられます。以下は、Excel VBAを使用したXMLデータの読み込みの主なメリットです。

効率的なデータ整理: XMLデータをExcelに読み込むことで、データを瞬時に整理できます。データのフィルタリング、ソート、およびグラフ化など、Excelの強力な機能を活用できます。
リアルタイムデータ更新: ウェブサイトや外部データベースからのXMLデータを定期的に更新できます。これにより、最新の情報を常に利用できます。
自動化: VBAを使用してXMLデータ読み込みを自動化できるため、手作業の作業を削減できます。

サンプルアプリの使い方

以下は、Excel VBAを使用してXMLデータを読み込むサンプルアプリです。アプリの使い方は非常に簡単です。

  1. シート上に配置された「XMLデータ読込み」ボタンをクリックします。
  2. サンプルアプリはXMLデータフォルダにある「商品データ.xml」ファイルからデータを読み込み、Excelシートにデータを表示します。

サンプルコードの処理内容

以下はVBAコードの処理内容の要約です。
詳細につきましては、次項「サンプルアプリのコード」をご覧ください。
MSXML2.DOMDocument60を使用してXMLデータを読み込み、myDomに格納します。
・ 各XML要素のデータを特定のセルに挿入します。getElementsByTagNameメソッドを使用して、特定のXML要素を選択し、それらをExcelシートの適切なセルに挿入します。

サンプルアプリのコード   アプリの作成手順はこちら

以下がサンプルアプリのコードです。

Option Explicit

Sub XMLデータ読込み()

  '各種変数の定義
  'MSXML2ライブラリーのDOMDocument60型の変数「myDom」を宣言
    Dim myDom As New MSXML2.DOMDocument60
  'IXMLDOMNodeListコレクション型の変数「myNodeList」を宣言
    Dim myNodeList As IXMLDOMNodeList
  'XMLファイルのノードを表すオブジェクトを入れる変数を宣言
    Dim myNode As IXMLDOMNode
    '行カウント変数を宣言
    Dim i As Integer
    'カレントディレクトリ変数を宣言
    Dim current As String
    
   'コンピューターのファイル システムへアクセスするための準備
   'FileSystemObjectを入れるための変数を定義
    Dim objFSO As Object
   'objFSOというオブジェクトにFileSystemObjectを代入
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    
   'カレントディレクトリを取得する
    current = objFSO.GetAbsolutePathName("../")
   'XML形式のファイルがあるパスを指定して、XML形式のファイルのデータを読み込む
    myDom.Load xmlSource:=current & "\デスクトップ\XMLデータ\商品データ.xml"
    
   '読み込んだXMLデータ内で、タグ名が「no」(商品番号)である要素を取得して、IXMLDOMNodeListコレクション型の変数「myNodeList」に代入する
    Set myNodeList = myDom.getElementsByTagName("no")
    
   '5行目からデータをセットする
    i = 5
    
   '変数「myNodeList」に代入したIXMLDOMNodeListコレクション内のIXMLDOMNodeオブジェクトを1つずつ変数「myNode」に代入して、次の処理を実行する。
    For Each myNode In myNodeList

       '変数「myNode」に代入した要素のデータを、i行2列目のセルにセットする。
        Cells(i, 2).Value = myNode.Text

        '次の行に移動させるためにi変数をカウントアップする
        i = i + 1

    Next
  
  
   '読み込んだXMLデータ内で、タグ名が「name」(商品名)である要素を取得して、IXMLDOMNodeListコレクション型の変数「myNodeList」に代入する  
    Set myNodeList = myDom.getElementsByTagName("name")

   '5行目からデータをセットする
    i = 5

   '変数「myNodeList」に代入したIXMLDOMNodeListコレクション内のIXMLDOMNodeオブジェクトを1つずつ変数「myNode」に代入して、次の処理を実行する。
    For Each myNode In myNodeList

       '変数「myNode」に代入した要素のデータを、i行3列目のセルにセットする。
        Cells(i, 3).Value = myNode.Text

       '次の行に移動させるためにi変数をカウントアップする
        i = i + 1

    Next
    

   '読み込んだXMLデータ内で、タグ名が「price」(値段)である要素を取得して、IXMLDOMNodeListコレクション型の変数「myNodeList」に代入する  
    Set myNodeList = myDom.getElementsByTagName("price")

   '5行目からデータをセットする
    i = 5

   '変数「myNodeList」に代入したIXMLDOMNodeListコレクション内のIXMLDOMNodeオブジェクトを1つずつ変数「myNode」に代入して、次の処理を実行する。
    For Each myNode In myNodeList

   '変数「myNode」に代入した要素のデータを、i行4列目のセルにセットする。
        Cells(i, 4).Value = myNode.Text

   '次の行に移動させるためにi変数をカウントアップする
        i = i + 1

    Next
   
End Sub

読込み先のXMLファイルのコード(商品データ.xml)

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<order>
	<commodity>商品一覧</commodity>
	<goods>
		<no>1</no>
		<name>キーボード</name>
		<price>5000</price>
	</goods>
	<goods>
		<no>2</no>
		<name>マウス</name>
		<price>2500</price>
	</goods>
	<goods>
		<no>3</no>
		<name>ディスプレイ</name>
		<price>20000</price>
	</goods>
</order>