質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

1回答

3167閲覧

XMLファイルからすべてのP要素を取得

kodai1119

総合スコア1

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2020/10/14 04:33

XMLファイルからすべてのP要素を取得するコードが作れなくて困っています。

本当は特定のデータが欲しいのですが、諸事情により本来必要なデータ位置の特定の方法が難しいため、
一旦すべてのP要素を取得して後で指定の列を残して他を削除するという方法を取ろうと思っています。

ただ、XMLファイルからすべてのP要素を取得するコードが作れなくて困っています。

Ubound(tmp)の数が増えていかない=Splitの使い方の問題だと思いますが、
今の私の知識では理解が足りません。

どなたかアドバイスいただけますと助かります。
よろしくお願いします。


Sub xml_parse(ByVal xmlpath As String)
'Microsoft XML v6.0 を参照設定
Dim XMLDocument As MSXML2.DOMDocument60
Dim pElem As MSHTML.HTMLParaElement

'Dim Doc As New XMLDocument Dim e As MSHTML.HTMLHtmlElement Dim ws1 As Worksheet Set ws1 = Worksheets("データ一覧") 'MSXMLオブジェクトを生成し、xmlファイルをロード Set XMLDocument = New MSXML2.DOMDocument60 'async = False → 読み込み終了後、次の処理をします(同期処理) 'async = true →だと、読み込みが終わらなくても、次のステップへ(非同期処理) 'VBAは非同期処理に対応していないので、async = Falseとします XMLDocument.async = False Dim strMsg As String Dim i, cmax As Long cmax = ws1.Range("A1048576").End(xlUp).Row 'Doc.Load (xmlpath) XMLDocument.Load (xmlpath)

If (XMLDocument.parseError.ErrorCode <> 0) Then 'ロード失敗
strMsg = XMLDocument.parseError.reason 'エラー内容を出力
MsgBox "ロードに失敗しました・・・" & vbCrLf & vbCrLf & strMsg, vbCritical
Exit Sub
End If
'-困っているのはここから下---------------------------------------------------------------

ws1.Range("A" & cmax + 1).Value = cmax Dim objxml As Object For Each objxml In XMLDocument.getElementsByTagName("P") Dim tmp As Variant tmp = Split(objxml.Text, "<P>") For i = 0 To UBound(tmp): Debug.Print tmp(i) ws1.Cells(cmax + 1, i + 2) = tmp(i)

' tmp = Null

Next Next

End sub

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2020/10/14 05:06

どのようなXMLでP要素(<p>~</p>のことですよね?)が取れないのか、問題を再現できる最低限のXMLの実例を質問文中に示した方が良いと思います。そうでないと、他者が問題を再現できないかもしれません。VBAの実行環境、ExcelVBAであったりWindowsのバージョンも併せて示しましょう。 更に、コードはマークダウン記法を用いて読みやすくするようにしてください。インデントも崩れ、読みづらいとそれだけで回答は離れがちになります。 https://teratail.com/help/question-tips#questionTips3-5-1 https://teratail.com/questions/238564 あたりを参考にしてソースコードを適切に表示するようにしてください。
kodai1119

2020/10/14 05:22

ご指摘ありがとうございます。以後気をつけます。
guest

回答1

0

ベストアンサー

VBAでXMLファイルから特定の要素を取得する方法はいろいろあり、
MSXML2を使う方法、Splitを使う方法、regexpを使う方法、、などなどがあります。

提示のコードをみると上記のMSXML2の方法とSplitの方法を一緒にしてしまったようですね。
MSXML2を使うなら、getElementsByTagName("P")でp要素は取得できてますので、Splitは必要ないです。

vba

1Sub xml_parse(ByVal xmlpath As String) 2 3 '前略 4 5 '-困っているのはここから下--------------------------------------------------------------- 6 7 ws1.Range("A" & cmax + 1).Value = cmax 8 9 Dim objxml As Object 10 For Each objxml In XMLDocument.getElementsByTagName("P") 11 12 ws1.Cells(cmax + 1, i + 2) = objxml.Text 13 i = i + 1 14 15 Next 16 17End Sub

投稿2020/10/14 05:07

編集2020/10/14 05:35
hatena19

総合スコア33715

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kodai1119

2020/10/14 05:32

ありがとうございます。この場合、iがempty値となり、2列目に入力されたデータが更新され続け、最後のP要素がデータとして残ってしまいます。 iは1ずつ増やし続けたいのですが、最大値はいくつになるかわからず、Uboundを使おうとしていました。上記の問題をうまく回避できる方法はありますか?
hatena19

2020/10/14 05:40 編集

あっ、そこを見落としてました。ループ内で i を1加算してください。回答のコードも修正しました。 あと、修正依頼にもコメントがありますが、コードはマークダウンのコードブロック内にいれるように質問を修正しておいてください。(後から見る人のために)
kodai1119

2020/10/14 05:47

ありがとうございます!ついに解決しました! これがわからず、何日も困っていました。本当にありがとうございます!! 初心者なのでまだまだ勉強の毎日です。今後もこちらでまたお伺いさせていただくこともあると思いますのでその際はアドバイスよろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問