発生している問題
VBAでMSXML2.XMLHTTPを用いて、指定URLからデータを抽出しようとしています。
対象URLのリストを1件ずつループで処理したいのですが、出力する際取得済みのURLのデータを重複して出力してしまいます。
前提
1.対象URLは複数件
2.対象のURLに対してHTTPリクエストを行い、データを抽出
2.抽出したデータを加工してExcelシートに出力
4.リストから次のURLを取得し、2~3の処理を繰り返す
コードは以下の通りです
Sub sub2() Dim objHttpReq As Object Dim objHtmlDoc As Object Dim objHtmlElem As Object Dim iStatusCode As Integer Dim wsIn As Worksheet, wsOut As Worksheet Dim iDstRow As Integer Dim rngList As Range, rng As Range ~(略)~ Set wsIn = ThisWorkbook.Worksheets("Sheet2") Set wsOut = ThisWorkbook.Worksheets("Sheet3") With wsIn.Range("F3").CurrentRegion Set rngList = .Offset(1).Resize(.Rows.Count - 1) End With strYear = wsIn.Range("D3").Value Set objHttpReq = CreateObject("MSXML2.XMLHTTP") Set objHtmlDoc = CreateObject("htmlfile") objHtmlDoc.DesignMode = "on" iDstRow = 1 For Each rng In rngList DoEvents strURL = rng.Value objHttpReq.Open "GET", strURL objHttpReq.Send ' ダウンロード待ち Do While objHttpReq.readyState <> 4 DoEvents Loop iStatusCode = objHttpReq.Status ' ステータス判定 If iStatusCode = 200 Then objHtmlDoc.write objHttpReq.responseText For Each objHtmlElem In objHtmlDoc.getElementsByTagName("p") ~(略)~ Next End If Next Set objHtmlDoc = Nothing Set objHttpReq = Nothing End Sub
(2021/06/19 20:00 質問内容の記載が途中で切れてしまっていたので、続きを下記に追記します。)
期待結果
各URLから抽出したデータが、Excelシートに下記のように出力されること
1行目 URL1の抽出データ 2行目 URL2の抽出データ 3行目 URL3の抽出データ
実行結果
上記コードを実行したところ、各URLから抽出したデータが下記のように重複してExcelシートに出力されておりました。
1行目 URL1の抽出データ 2行目 URL1の抽出データ ←1行目と重複 3行目 URL2の抽出データ 4行目 URL1の抽出データ ←1行目と重複 5行目 URL2の抽出データ ←3行目と重複 6行目 URL3の抽出データ
試したこと
当該コードを下記のように修正したところ、期待結果通りに抽出データが重複せずに出力されることが確認できました。ですが、実現したいこと(URL複数件からのデータ抽出)に対して、コードが適切か判断がつきません。そのため、修正コードが適切かご教示いただきたく、または参照すべきドキュメント等ご教示いただけますと幸いです。
修正コード1(ループの中で、Set objHtmlDoc = CreateObject("htmlfile")とSet objHtmlDoc = Nothing を実施するように変更):
Sub sub2() ~(略)~ Set objHttpReq = CreateObject("MSXML2.XMLHTTP") objHtmlDoc.DesignMode = "on" iDstRow = 1 For Each rng In rngList DoEvents strURL = rng.Value objHttpReq.Open "GET", strURL objHttpReq.Send ' ダウンロード待ち Do While objHttpReq.readyState <> 4 DoEvents Loop iStatusCode = objHttpReq.Status ' ステータス判定 If iStatusCode = 200 Then Set objHtmlDoc = CreateObject("htmlfile") ~(略)~ Set objHtmlDoc = Nothing End If Next Set objHttpReq = Nothing End Sub
修正コード2(データを抽出後、objHtmlDoc.Close を実行するように変更):
Sub sub2() ~(略)~ Set objHttpReq = CreateObject("MSXML2.XMLHTTP") Set objHtmlDoc = CreateObject("htmlfile") objHtmlDoc.DesignMode = "on" iDstRow = 1 For Each rng In rngList DoEvents strURL = rng.Value objHttpReq.Open "GET", strURL objHttpReq.Send ' ダウンロード待ち Do While objHttpReq.readyState <> 4 DoEvents Loop iStatusCode = objHttpReq.Status ' ステータス判定 If iStatusCode = 200 Then objHtmlDoc.write objHttpReq.responseText ~(略)~ objHtmlDoc.Close End If Next Set objHtmlDoc = Nothing Set objHttpReq = Nothing End Sub
補足情報(FW/ツールのバージョンなど)
OS: Windows10
Microsoft Visual Basic for Applications 7.1
回答1件
あなたの回答
tips
プレビュー