XMLをエクセルで取り込み、表にしたいと考えています。
エクセル2003にて下記のtest.xmlをインポートすると
<?xml version="1.0" encoding="UTF-8" ?>
<McXMLRoot>
<McXMLData>
<McXMLPageData>
<ヘッダ情報>
<作成日>
<value>平成21年 5月28日</value>
</作成日>
<作成時間>
<value>10時55分12秒</value>
</作成時間>
<ページ数>
<value>0001</value>
</ページ数>
</ヘッダ情報>
<明細情報>
<商品名>
<value>パソコン</value>
</商品名>
<価格>
<value>100000</value>
</価格>
</明細情報>
<明細情報>
<商品名>
<value>プリンタ</value>
</商品名>
<価格>
<value>20000</value>
</価格>
</明細情報>
</McXMLPageData>
</McXMLData>
</McXMLRoot>
エクセルでタイトルがvalue,value2…,value5 のように表示されます。
作成日,作成時間,ページ数,商品名,価格
のように表示するためのマクロを作成しようとしているのですが、
Public Const XmlPass = "D:\WORK\test.xml"
Public Sub Auto_Open()
ActiveWorkbook.XmlImport URL:=XmlPass _
, ImportMap:=Nothing, Overwrite:=True, Destination:=Range("$A$1")
End Sub
で取り込んだあと、どのように処理すればよいのでしょうか?
(1)テキストとして読み込む
(2)<value>のすぐ前にあるタイトル部分を検索
(3)タイトル部分を切り出す。
(4)指定のセルにタイトルをセット
とすると、切り出したタイトルの文字コードがUTF-8のため
文字化けしてしまいます。
Private Sub setTitle()
Dim FileNoRead%
Dim wkFree$
Dim result1 As Integer
Dim result2 As Integer
Dim result3 As Integer
Dim Title(300) As String
Dim Soeji As Integer
Dim Kaishi As Integer
Dim SWork As String
Soeji = 0
Kaishi = 1
FileNoRead% = FreeFile
' テキストのオープン
Open XmlPass For Input Access Read As #FileNoRead%
' テキストの読込
Line Input #FileNoRead%, wkFree$ 'ファイルから1行読み込む
' テキストのクローズ
Close #FileNoRead%
Do While True
Soeji = Soeji + 1
result1 = InStr(Kaishi, wkFree$, "<value>") '<value>出現位置
result2 = InStrRev(wkFree$, ">", result1) + 1 'タイトル終了位置
result3 = InStrRev(wkFree$, "<", result2) + 1 'タイトル開始位置
SWork = Mid(wkFree$, result3, (result1 - result2))
Title(Soeji) = SWork
Kaishi = InStr(result1, wkFree$, "</value>") '</value>出現位置
Kaishi = Kaishi + 8
Loop
End Sub
ほかに何かよい方法があったら教えてください。
P.S)作りはじめのため、バグ多数存在します。
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 になります。
ありがとうございました。
勉強になりました。
改良したプログラムで何とかなりました。
ただ、また新たな問題が…
その内容は"XMLをエクセルに取り込むマクロその2"
として新たに投稿したのでよろしければ教えてください
No.3
- 回答日時:
>文字コードがUTF-8のため文字化けしてしまいます。
の部分限定だと、ADODB.Streamを介して、UTF-8→Shift JIS等に変換できます。検索していただくとVBAのコードも沢山見つかりますが、一例です。
http://oshiete1.goo.ne.jp/qa1963113.html
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
回答ありがとうございました。
ただ、申し訳ありませんが大事なことを伝えておりませんでした。
取り込むべき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 = ??? を教えてください。
よろしくお願いします。
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
大変申し訳ありません。
大事な部分をお伝えしていませんでした。
回答番号2のお礼を参照し、ご回答いただけないでしょうか?
よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
都道府県穴埋めゲーム
都道府県の名前を1人1つずつ投稿してください。全ての都道府県が出たら締め切ります!
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
VBA でxmlの全要素・属性の読み込み
Visual Basic(VBA)
-
Excel-VBAでXMLの複数ノードの取り出し
Visual Basic(VBA)
-
ExcelのVBAで、XMLファイルのデータ抽出
Excel(エクセル)
-
-
4
excel vbaでのxml出力がわかりません
Visual Basic(VBA)
-
5
XPathで途中に名前空間が設定されていると狙った要素を指定できない
XML
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
キャバクラや風俗をクレカで支...
-
「内訳」と「明細」の違い
-
【クリーニング店のレシート(明...
-
VISA国内利用vsカンタンケッサイサービス ...
-
シュレッダーの活用方法はある...
-
クレジットカード明細にある「...
-
2枚目の楽天カードVISAの明細を...
-
明細と詳細
-
Accessサブレポートの内容が重...
-
アクセスにtxtファイルの指定行...
-
アクセス 結合プロパティ が...
-
メールレディ携帯2台持ちについ...
-
1ヶ月の出費の記録が取れるよう...
-
クレジットカード不正利用?
-
apple bill ってなんですか? 6...
-
次のような見積書フォームを作...
-
記憶のない請求について
-
ヨドバシでキャンセルしました...
-
楽天カードでガソリン入れたの...
-
毎月の請求
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「内訳」と「明細」の違い
-
キャバクラや風俗をクレカで支...
-
VISA国内利用vsカンタンケッサイサービス ...
-
クレジットカード明細にある「...
-
クレジットカード不正利用?
-
apple bill ってなんですか? 6...
-
Accessサブレポートの内容が重...
-
明細と詳細
-
アクセスにtxtファイルの指定行...
-
「d払いご利用可能額」とご利用...
-
確定申告を自宅のパソコンでし...
-
【クリーニング店のレシート(明...
-
料金について
-
三井住友カードはメールで問い...
-
給与明細を渡してくれない
-
docomo.携帯請求書が急に届かな...
-
XMLをエクセルに取り込むマクロ
-
自己破産申請したら全クレジッ...
-
クレジットカードを見たらヤフ...
-
メールレディ携帯2台持ちについ...
おすすめ情報