- ベストアンサー
エクセルのHTMLのループ取得でフリーズする
- エクセルのマクロでMSHTMLを用いてあるサイトの1ページ目、2ページ目・・・とループ処理でHTMLを取得する際、3回目以上のループからマクロがフリーズしてしまい、全ページを取得できない問題が発生しています。
- フリーズする際のループ回数はランダムであり、プログラムを直してフリーズせずに全ページを取得できるようにしたいです。
- 現在使用しているプログラムでは、サイト『エクセルの神髄』の「MSHTML.HTMLDocumentを使った方法」を参考にしており、一部修正を加えています。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 とりあえず、読みたいページのURL http:// ... ↓ https:// ... 今は、httpsと書いた方がいいですよね。 それも関係しているのか、私は殆ど使ったことないので詳しくないですが、 HTMLDocument.createDocumentFromUrl を現在、私の環境で実行する為には"セキュリティ保護"関連の 対策を幾つか施す必要があるようなので、 リンク先のSample3の実行再現については断念しました。あしからず。 (当方、Win7,IE11,Excel2010 すべて64ビット版) 私以外の方が回答するにも、ご使用の環境(os,ie,excelのver.) を詳らかにしないと、再現性が低くて難しいかも、です。 それと、リンクミス(括弧の位置が原因で遷移しません)してるみたいなので エクセルの神様 > マクロVBA > マクロVBAサンプル集 > WEBデータの取得方法 http://excel-ubara.com/excelvba5/EXCELVBA222.html 再掲しておきますね。 リンク先のSample2~Sample4、いずれも MSHTML.HTMLDocument.getElementsByTagName("td") で、td要素を総当たりループという DOM操作は全くの共通のようですから、 Sample4(MSXML2.XMLHTTP+MSHTML.HTMLDocument) の方を試してみては如何でしょう? urlを正して(←これ大事)、試しに仮設で1プロシージャに纏めて 51ページ(2534銘柄)分のループ取得を20回程試してみましたが、 こちらではトラブルもストレスもなく動いています。 Sample4のやり方だと、 すべて同期処理(処理の完了を待って次のスクリプトに進む)ですから、 却って扱い易いのでは、と思ったりしています。 申し訳ないですが、 こちらでは今回のご質問趣旨そのものに直接的にお応えすることが出来ませんので、 他の識者さんの回答を(ご使用環境等補足の上)待ってみるのがいいかもです、 ちなみに > DoEventsとIf Now()~の間に sleep 100 を入れています DoEventsとSleep関数を併用した方が良い場合もありますが、 今回の内容では、DoEventsの代りにSleep関数を、という趣旨 であろうと思われます。 ちなみのちなみに マクロがフリーズするのは、 Excelシートへの出力だけでも(件数や関数、シート設計によっては) 原因になり得ますから、 With Application .ScreenUpdating = False .EnableEvents = False .Calculation = xlCalculationManual End With ↓ 出力処理 ↓ With Application .Calculation = xlCalculationAutomatic .EnableEvents = True .ScreenUpdating = True End With 等のように、Excel.Application系の更新抑止を一時的に挟んであげるのも 役にたつ場合もあります。 以上です。
お礼
ご回答ありがとうございます。 プログラムはご意見していただいた通りSample3はやめてSample4(MSXML2.XMLHTTP+MSHTML.HTMLDocument)で書き直してみようかと思います。 ただ、参考サイトと取得したいサイトのHTMLが違うこともありgetElementsByClassNameでテーブルの属性で取り出したいテーブルを指定しからtd要素を総当たりループしようと思っており、sample3で出来た処理がそのままだとsample4で使えなかったので戸惑っています。 もう少し調べてみて上手くいきそうになかったら改めてご質問を新しく立ち上げようと思っています。 またhttps:// ...の指摘もありがとうございました。