VBAでXMLを操作する

ヘッダー広告
スポンサードリンク
最近VBAでAmazon APIを使用した開発を行っておりました。
Amazon APIの出力結果はXML形式なのですが、今回XMLの操作をVBAで行うことに苦戦しましたので、ここにまとめておきます。
Amazon APIの呼び出し方については、後日記事にしますのでお待ちください。

VBAでのXMLファイルの様々な操作


今回操作する対象のXMLファイル


今回は、AmazonマーケットプレイスWebサービス(Amazon MWS)を呼び出し、出力されたXMLを加工するというVBAを作成しました。
出力されたXMLファイルのサンプルは以下になります。

<?xml version="1.0"?>
<GetMyPriceForSKUResponse xmlns="http://mws.amazonservices.com/schema/Products/2011-10-01">
    <GetMyPriceForSKUResult SellerSKU="SKU2468" status="Success">
        <Product xmlns="http://mws.amazonservices.com/schema/Products/2011-10-01"
            xmlns:ns2="http://mws.amazonservices.com/schema/Products/2011-10-01/default.xsd">
            <Identifiers>
                <MarketplaceASIN>
                    <MarketplaceId>ATVPDKIKX0DER</MarketplaceId>
                    <ASIN>1933890517</ASIN>
                </MarketplaceASIN>
                <SKUIdentifier>
                    <MarketplaceId>ATVPDKIKX0DER</MarketplaceId>
                    <SellerId>A1IMEXAMPLEWRC</SellerId>
                    <SellerSKU>SKU2468</SellerSKU>
                </SKUIdentifier>
            </Identifiers>
            <Identifiers>
                <MarketplaceASIN>
                    <MarketplaceId>ATVPDKIKX0DER</MarketplaceId>
                    <ASIN>2044901628</ASIN>
                </MarketplaceASIN>
            </Identifiers>
        </Product>
    </GetMyPriceForSKUResult>
    <ResponseMetadata>
        <RequestId>bc6e4601-3d74-4612-adcf-EXAMPLEf1796</RequestId>
    </ResponseMetadata>
</GetMyPriceForSKUResponse>

参考:AmazonマーケットプレイスWebサービス(Amazon MWS)ドキュメント Amazon MWS ドキュメント » APIリファレンス » 商品 – バージョン2011-10-01 » GetMyPriceForSKU
こちらから一部わかりやすいよう加工させていただいております。
保存場所:D:\test.xml

XMLファイルを操作する


上記のXMLファイルを操作するためには、以下のようなプログラムとなります。

Public Sub GetDataXML()

    Dim TestXML As Object
    Dim ChildNode As Object
    Dim i As Long
        
    Set TestXML = CreateObject("Microsoft.XMLDOM")
    TestXML.async = False
    
    'Loadの引数にURLでもOK
    TestXML.Load "D:\test.xml"

    If (TestXML.parseError.ErrorCode <> 0) Then
        'ロード失敗
        Exit Sub

    End If

    With ThisWorkbook.Worksheets("sheet1")
        
        'タグ内のstatusパラメータを取得
        .Cells(1, 1) = TestXML.SelectSingleNode("GetMyPriceForSKUResponse/GetMyPriceForSKUResult/./@status").Text
        
        'ASINの値を取得
        .Cells(2, 1) = TestXML.SelectSingleNode("GetMyPriceForSKUResponse/GetMyPriceForSKUResult/Product/Identifiers/MarketplaceASIN/ASIN").Text
        
        
        '同一名称の複数タグが存在する場合の取得方法
        '複数存在するタグを指定し、オブジェクトに挿入
        Set ChildNode = TestXML.SelectNodes("GetMyPriceForSKUResponse/GetMyPriceForSKUResult/Product/Identifiers")
        
        For i = 0 To ChildNode.Length - 1
                
            'あとは相対パスで値を取得
            .Cells(3 + i, 1) = i + 1 & "つめのASIN" & ChildNode(i).SelectSingleNode("MarketplaceASIN/ASIN").Text
            
            'もし存在しない可能性のあるタグがある場合には、空かどうか判定分を追加する。
            If ChildNode(i).SelectSingleNode("SKUIdentifier/SellerSKU") Is Nothing Then
            Else
                .Cells(3 + i, 2) = i + 1 & "つめのSellerSKU" & ChildNode(i).SelectSingleNode("SKUIdentifier/SellerSKU").Text
            End If
              
        Next
    
    End With
     
End Sub


出力結果



このようにXMLの結果をEXCELに出力することが出来ます。

本当は、MSXML2.DOMDocument60を使用しようと考えたのですが、全く想定通りにいかず論理エラーとなってしまうので、今回は諦めてMicrosoft.XMLDOMを使用しました。
XML操作に正直かなり苦戦しました。
是非XML操作する際に参考にしていただければと思います。

※サムネイルは、Amazonだけにアマゾンの画像です。
 しょうもなくてすいません。
フッター広告

スポンサードリンク



シェアする

  • このエントリーをはてなブックマークに追加

フォローする