• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:XMLをエクセルに取り込むマクロ)

XMLをエクセルに取り込むマクロを作成する方法

このQ&Aのポイント
  • XMLをエクセルに取り込むマクロを作成したいです。
  • エクセル2003にて、XMLをインポートするとタイトルが文字化けしてしまいます。
  • 他の方法でXMLをエクセルに取り込む方法があれば教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.4

「このとき<明細情報>はセットできますが、<ヘッダ情報>はどのようにセットするのでしょうか?」 No2です。<ヘッダ情報>がセットされないのは、 Set nlist = ObjXml.selectNodes("//明細情報/*") で、<明細情報>以下の要素しかnlistに入れてないからです。 <ヘッダ情報>以下をnlistにセットするなら、 Set nlist = ObjXml.selectNodes("//ヘッダ情報/*") としてXpathで選ぶか、又はルートからたどって Set nlist = ObjXml.childNodes(1).childNodes(0).childNodes(0).childNodes(0).childNodes として選ぶか、又はTagName指定で Set nlist = ObjXml.getElementsByTagName("ヘッダ情報") Set nlist = nlist(0).childNodes と選びます。選んだ上で、 For Each node In nlist msgbox node.nodeName & _ node.childNodes(0).childNodes(0).nodeValue Next node として、項目名と内容を取得できます。 「文字コードは勝手に変換してくれてます(本当かな?)」 ヘッダーの項目の数は nlist.Length になります。

torum
質問者

お礼

ありがとうございました。 勉強になりました。 改良したプログラムで何とかなりました。 ただ、また新たな問題が… その内容は"XMLをエクセルに取り込むマクロその2" として新たに投稿したのでよろしければ教えてください

その他の回答 (3)

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.3

>文字コードがUTF-8のため文字化けしてしまいます。 の部分限定だと、ADODB.Streamを介して、UTF-8→Shift JIS等に変換できます。検索していただくとVBAのコードも沢山見つかりますが、一例です。 http://oshiete1.goo.ne.jp/qa1963113.html

  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.2

もうちょっと丁寧に、ちゃんと動くように書き直しました。 Public Const XmlPass = "D:\WORK\test.xml" Sub parseXML() Dim ObjXml As MSXML2.DOMDocument Set ObjXml = CreateObject("MSXML2.DOMDocument") If ObjXml.Load(XmlPass) = False Then Exit Sub End If Dim nlist As MSXML2.IXMLDOMNodeList Dim h_nlist As MSXML2.IXMLDOMNodeList Set nlist = ObjXml.selectNodes("//明細情報/*") Dim node As MSXML2.IXMLDOMNode Dim i As Integer i = 2 For Each node In nlist Set h_nlist = ObjXml.getElementsByTagName("作成日") Cells(i, 1).Value = h_nlist(0).childNodes(0).childNodes(0).nodeValue Set h_nlist = ObjXml.getElementsByTagName("作成時間") Cells(i, 2).Value = h_nlist(0).childNodes(0).childNodes(0).nodeValue Set h_nlist = ObjXml.getElementsByTagName("ページ数") Cells(i, 3).Value = h_nlist(0).childNodes(0).childNodes(0).nodeValue If node.nodeName = "商品名" Then Cells(i, 4).Value = node.childNodes(0).childNodes(0).nodeValue End If If node.nodeName = "価格" Then Cells(i, 5).Value = node.childNodes(0).childNodes(0).nodeValue i = i + 1 End If Next node End Sub

torum
質問者

お礼

回答ありがとうございました。 ただ、申し訳ありませんが大事なことを伝えておりませんでした。 取り込むべきXMLの種類は多数あり、タイトルが作成日,作成時間,ページ数,商品名,価格 とは限らないのです。 なのでやはりXMLをインポート後にタイトルセットでないとダメのようです。 そこで以下を考えました。 ↓ Private Sub parseXML() Dim ObjXml As MSXML2.DOMDocument Set ObjXml = CreateObject("MSXML2.DOMDocument") If ObjXml.Load(XmlPass) = False Then Exit Sub End If Dim nlist As MSXML2.IXMLDOMNodeList Dim h_nlist As MSXML2.IXMLDOMNodeList Set nlist = ObjXml.selectNodes("//明細情報/*") Dim node As MSXML2.IXMLDOMNode Dim strWork As String Dim i As Integer i = 1 For Each node In nlist If i = 1 Then '最初のタイトルを退避 strWork = node.nodeName MsgBox ("最初のタイトル[" & strWork & "]") Else MsgBox ("node.nodeName[" & node.nodeName & "]") If strWork = node.nodeName Then Exit For End If End If ' タイトルセット Cells(1, i).Value = node.nodeName i = i + 1 Next node End Sub このとき<明細情報>はセットできますが、<ヘッダ情報>はどのようにセットするのでしょうか? Cells(1, i).Value = ??? を教えてください。 よろしくお願いします。

  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.1

XMLをシートにインポートせずに、マクロVBAでXMLと処理した方が簡単です。(読み込み元のXML構造が分からないので以下のコードは想像です) まず、VBEの参照設定で「Microsoft XML v6.0」をチェックします。 Public Const XmlPass = "D:\WORK\test.xml" sub parseXML() 'XMLのDOMオブジェクトを準備します。 Dim ObjXml As MSXML2.DOMDocument Set ObjXml = CreateObject("MSXML2.DOMDocument") 'XMLファイルをオブジェクトにロードします。 if(ObjXml.Load(XmlPass) = false ) Then Exit sub Dim nlist As MSXML2.IXMLDOMNodeList 'ノードリストオブジェクトも準備します。 Set nlist = ObjXml.selectNodes("//明細情報/*") 'Xpathで取得するノードを選びます。 Dim node As MSXML2.IXMLDOMNode 'ノードオブジェクトを準備します dim i as Integer i=2 For Each node In nlist '以下のループで中身を取り出します。 if node.childNodes(0).nodeName = "商品名" then _ cells(i,4).value = node.childNodes(0).childNodes(0).childNodes(0).value end if if node.childNodes(0).nodeName = "価格" then _ cells(i,5).value = node.childNodes(0).childNodes(0).childNodes(0).value end if i = i + 1 Next node End Sub

torum
質問者

お礼

大変申し訳ありません。 大事な部分をお伝えしていませんでした。 回答番号2のお礼を参照し、ご回答いただけないでしょうか? よろしくお願いします。

関連するQ&A

専門家に質問してみよう