Excel2003のVBAでMSXML2.DomDocumentを使ってXMLの処理をしています。http経由でXMLを取得し、パースして、Sheetに書き込んでいます。
XMLの行数が少ないうちは問題ないのですが、行数が1600件を超えたあたりで、LoadXML()メソッドで落ちます。
XMLを分割して、500行ずつや100行ずつLoadXMLさせても、合計処理数が1600行あたりで、必ずLoadXML()に失敗します。
メモリ不足かと思って、ループするごごとにSet Dom = Nothingのようにしてオブジェクトをクリアしていますが、効果がありません。
処理させたいXMLは最大で8000行になります。
なんとか解決策はないでしょうか?
以下、ソースの一部です。
Dim Dom As New MSXML2.DOMDocument
Function get_xml_dom(query)
Dim MSX As Object
Set Dom = New MSXML2.DOMDocument
Dim Url As String
host_address = "hostname"
host_path = "/keyword_report/get_keyword_data"
Url = "http://" & host_address & host_path & query
Set MSX = CreateObject("MSXML2.XMLHTTP")
MSX.Open "GET", Url, False
MSX.Send
If Dom.LoadXML(MSX.responseText) Then '<- 1600件ぐらい処理させるとここで落ちる
Debug.Print "Load XML is True"
get_xml_dom = True
Else
get_xml_dom = False
Debug.Print "Load XML is False"
End If
Set MSX = Nothing
End Function
このあと、DomからXPATHで要素を取り出して、シートに埋め込んでいます。
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.5
- 回答日時:
連続回答します。
逆にMSXML2.XMLHTTPをつかわづ直接MSXML2.DOMDocumentで読み込むのも出来るとおもうのですが...
下のプログラムだとちゃんとURLでHTTPリクエストしてくれてます。
Sub gettag()
Dim result As String
Dim ObjXml As MSXML2.DOMDocument
Dim nlist As MSXML2.IXMLDOMNodeList
Set ObjXml = CreateObject("MSXML2.DOMDocument")
ObjXml.async = False
If ObjXml.Load("http://xxxx/xx.xml") = True Then
Set nlist = ObjXml.selectNodes("//情報/大問[@形式=""1""]/*")
Call Get_Node(nlist, result)
Debug.Print result
MsgBox result
Cells(1, 1).Value = result
End If
End Sub
Sub Get_Node(ByRef Nodes As MSXML2.IXMLDOMNodeList, _
ByRef result As String)
Dim xNode As MSXML2.IXMLDOMNode
For Each xNode In Nodes
If xNode.nodeType = NODE_TEXT Then
result = result + xNode.nodeValue
End If
If xNode.hasChildNodes Then
result = result + "<" + xNode.nodeName + ">"
Call Get_Node(xNode.childNodes, result)
result = result + "</" + xNode.nodeName + ">"
End If
Next xNode
End Sub
No.4
- 回答日時:
yyr446です。
Set MSX = CreateObject("MSXML2.XMLHTTP")を
Set MSX = CreateObject("MSXML2.ServerXMLHTTP")
If MSX Is Nothing Then Set MSX = CreateObject("MSXML2.ServerXMLHTTP.4.0")
If MSX Is Nothing Then Set MSX = CreateObject("WinHttp.WinHttpRequest.5.1")
If MSX Is Nothing Then Set MSX = CreateObject("MSXML2.XMLHTTP")
If MSX Is Nothing Then Set MSX = CreateObject("Microsoft.XMLHTTP")
にして試して見てください。
(全部使えなかったりして....)
No.3
- 回答日時:
Dom.LoadXML(MSX.responseText)
で、xml=text=>xmlで文字コードか何かの影響でxmlが壊れてしまう箇所が
あるのでは、
Dim Dom As New MSXML2.DOMDocument
は止めて、Dim Dom As Object
Dom = MSX.responseXML
とするだけで、だいじょうぶなはず。(Msxml2.XMLHTTP.3.0以上の場合)
おお! と思って試したんですが、
MSX.responseXMLというメソッドはサポートされていないと
怒られます。
>(Msxml2.XMLHTTP.3.0以上の場合)
参照設定でMicosoft XML v6.0を使用しております。
No.1
- 回答日時:
無責任な思いつき案ですが
Option Explicit
Dim Dom As MSXML2.DOMDocument
Dim MSX As MSXML2.XMLHTTP '"Microsoft XML, v?.?"に参照設定してるのですよね?
Sub try()
Dim i As Long
Dim query
Set Dom = New MSXML2.DOMDocument
Set MSX = New MSXML2.XMLHTTP
For i = 1 To 8000
query = "hoge" & i
If get_xml_dom(query) Then
':
End If
Next
Set Dom = Nothing
Set MSX = Nothing
End Sub
こんな感じでモジュールレベル変数にしてLoopの外でSetして使い回してみてもダメでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) vbaのエラー対応(実行時エラー7:メモリが不足しています) 4 2023/04/24 00:20
- Visual Basic(VBA) vbaの構文の修正相談(xmlファイルを順に開いてコピペ作業) 1 2023/04/22 01:18
- Visual Basic(VBA) エクセルVBA(実行時エラー438)の対処法を教えてもらえないでしょうか 3 2023/04/22 13:43
- Visual Basic(VBA) Excel vbaについての質問 3 2023/04/18 16:14
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) エクセルVBAのコードで質問です。 下のコードはJ16の文字列をB3を起点とする範囲から探して、見つ 5 2023/04/07 11:07
- Visual Basic(VBA) 【VBAエラー】Nextに対するForがありません 対策について 5 2022/11/21 21:26
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA指定行削除
-
VBA一覧取得 再投稿
-
VBAコンボボックスで選択した値...
-
エクセルVBAについて
-
【ExcelVBA】値を変更しながら...
-
FileCopy時のエラー
-
VBA 複数のエクセルから一つの...
-
VBA ユーザーフォーム ボタンク...
-
コードを直していただきたいで...
-
2つのマクロでチェックボックス...
-
VBAに詳しい方教えてください。
-
ExcelのVBAコードについて教え...
-
VBA listBoxについて
-
VBA実行後に元のセルに戻りたい
-
Vba 実数および実数タイプの変...
-
エクセルVBAについて
-
現在のブックを閉じないで、マ...
-
Excel VBA 定義されたプロージ...
-
エクセルのマクロについて教え...
-
Excelのマクロについて教えてく...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAのXML処理でメモリが足りない?
-
複数のxmlファイルの合体
-
VB6でXMLを処理するには
-
xmlはどんな用途で使われている
-
XMLデータを文字列分割&処理す...
-
東芝のDynabookなのですがアン...
-
CPUの考え方を教えてください ...
-
XMLで要素が記述された順番に意...
-
昔Winnyってありましたけど、あ...
-
バッチファイルでテキストファ...
-
XML、XSLTの適応エラー(IEから...
-
UTF-8でエンコーディングとはど...
-
SNMP リンクダウンとノードダ...
-
ルート要素ノードが2個ある場合?
-
XMLファイル内のデータ(値)を変...
-
xmlファイルが上手にHTMLに変換...
-
同じタグ名の項目取得
-
ExcelVBAで書き出した文字が化ける
-
ノードとは
-
XPathで途中に名前空間が設定さ...
おすすめ情報