ExcelVBA(マクロ):Webページの読み込みが全て完了してから次の処理を実行する方法/readyState・busyプロパティの使い方

airport IT

Webスクレイピングでは定番のアレ、ページの読み込み中は処理を中断する方法です。

スポンサーリンク

読み込み中は処理を中断する方法

Webページを表示するところまではこちら↓

ExcelVBA(マクロ):Internet Explorerを起動して特定のページを表示する方法/Navigateメソッドの使い方
ExcelでIEを起動し、狙ったページを表示するだけのプログラムを書いてみたいと思います。

IE読み込みに関するふたつのプロパティ

今回は、読み込みが全て完了したらメッセージを表示させたいと思います。
IEオブジェクトにはプロパティとしてbusyというものがあり、これがTrueなら読み込み中を意味します。従って、busy = trueの間はループするような処理を実装すれば、読み込み完了まで次の処理が中断されます。

ページの読み込み状態のプロパティ
IEオブジェクト.busy = 戻り値
※true = 読み込み中 false = 読み込み完了
※読み込み専用(操作できないプロパティ)

ただし、WebページはそこまでハッキリとONとOFFが切り替わるわけではなく、一部の読み込みが完了後また別のところを始めたりするそうなので、もうひとつreadystateというプロパティも使用します。これはそのまんまズバリ「IEが準備完了したか」というプロパティです。

ページの読み込み状態のプロパティ
IEオブジェクト.readyState = 戻り値
※0:デフォルト値。読み込み未完了 1:読み込み中 2:読み込みは終わったが操作は不可
3:IEオブジェクトの操作は可 4:IEの読み込み完了
※読み込み専用(操作できないプロパティ)

ほとんどの場合、4しか使わないです。ちなみに戻り値はREADYSTATE_COMPLETEと書いても4と同じ意味になります。こっちはこっちで読み込み完了しつつデータを追加でダウンロードしてたりするそうなので、readyStateは4なのにbusyはtrueのことがあるそうです。なので、このふたつを組み合わせます。

IEオブジェクト.readyState <> 4 or IEオブジェクト.busy = true

<>は「等しくない」ことを意味する演算子です。これでreadyStateが4でない時、またはbusyがtrueの時、という意味になります。

上の条件でループする方法

あとは上の条件をループに組み込むだけです。DoWhileについてここで詳述はしませんが、「条件を満たしている間はループする」という処理です。
実装としては以下のようになります。

Do while IEオブジェクト.readyState <> 4 or IEオブジェクト.busy = true
DoEvents
Loop

loopの後に処理を書けば、ページの読み込みが完全に完了してから次の処理が実行されます。今回は最後にmsgboxを表示するようにしてみました。

MsgBox("読み込み終了")

yomikomi1

処理を実行すると、IEが起動します



yomikomi2

処理が完了すると、次の処理が実行されました

やりたいことから方法を探すエクセル(Excel)操作・関数・VBA(マクロ)逆引きまとめ
逆引き(やりたいことから探す)Excel記事まとめ
関数・演算子・メソッド・プロパティ名から探すExcel/VBA(マクロ)使い方・組み合わせ方まとめ
こちらはExcelやメソッドの諸機能を、機能の名称から探せるまとめ記事です。

コメント