ALL EXCEL Program VBA

【解説付】EXCEL-VBAでWebブラウザ読込が完了するまで待つ方法

■ はじめに

EXCEL VBAでIE(InternetExploer)を制御する方法について触れようと思います。
本ブログ記事は、Crowd Works で納品まで行い、実際にお金になったコードを元に紹介します。

■本記事でできること

EXCEL-VBAにおけるDOM(Document Object Model)でのブラウザ制御で、
Webブラウザ読込が完了するまで待つことができます。

■コード

 

■コードの説明

以下のコードを分解して説明すると、

Do While IEAP.readyState <> 4 Or IEAP.Busy = True
DoEvents
Loop


『IEAP.readyState』のReadyStateプロパティでは、
IEAPに格納したWebサイトの読み込み状態を4段階で表現してくれます。

IEAP.readystate = 1 の場合:Webページ 読込開始前
IEAP.readystate = 2 の場合:Webページ 読込開始
IEAP.readystate = 3 の場合:Webページ 読込中+操作可能状態
IEAP.readystate = 4 の場合:Webページ 読込完了

正しくWebページが読込完了された状態は『IEAP.readystate = 4』となります。


『IEAP.Busy』のBusyプロパティでは、
IEAPに格納したWebサイトの読込中状態を示すものになります。

  IEAP.Busy = True の場合:Webページ読込中
  IEAP.Busy = Falseの場合:Webページ読込完了”

実際の処理ではTrue→True→False→True のように不規則に動くこともあるため、BusyプロパティのみでWeb読込を待つコードを組むのは危ないです。



正しくWebページが読込完了された状態を
readystateプロパティ と Busyプロパティ でそれぞれで表現すると、

IEAP.readystate = 4
IEAP.Busy = False

となります。

よって、
Do while IEAP.readystate <> 4 or IEAP.Busy = True が意味指すものは、
『4の戻り値では ない場合 もしくは busyが読込中の場合は、Do Loop して次の処理に移行しないでね』の意味になります。

言い方を変えると、
readystateが4(読込完了)になったとしてもBusyがTrue(読込中)であったら待ち続け、
BusyがFalse(読込完了)になったとしてもreadystateが1〜3(読込未完了)の場合は待ち続けてね、
の意味となります。


DoEvents を利用する理由は、無限ループに陥った際に、
制御がDoEventsの際にPCに都度戻るため、EspキーでVBA動作を緊急停止させることができるからです。


以下のコードの説明ですが、
結論からいうと 1秒待つ になります。

STime = Now
Do While DateAdd("S", 1, STime) > Now
DoEvents
Loop

変数STimeに現在の時刻(now)を格納して、DateAddでSTimeに1秒を足してあげる。
DateAddされたSTime(Now)+1秒 > 現在の時刻(Now) になるまでの間、
Do Loopして次の処理に移行しない。


と読み替えることができます。

■Sleep では だめなの?

Sleep 1000(1秒待つ)などでWebページ読込を待っている人も多いかと思いますが、
Sleepは PCの実行を 指定した秒数を待つ命令文となるため、
Webページ側の読込ステータスに関係なく 指定の秒数を待機したら次の処理に移行します。

そのようなWebページ側のステータスを考慮しないものを多用したプログラムでは、
『動作が安定しない』や『プログラム実行時間が長い』などに陥りやすくなってしまいます。

もちろん、Sleep でないと行けない場面があったりしますので、この限りではないです。

■おわりに

いかがでしたでしょうか。
今後もVBA↔IEブラウザ制御については需要があると思いますので、投稿していこうと思います。
また、ゆくゆくは『 1から始めるVBA ↔IEブラウザ 連携 講座』もシリーズものとして投稿し少しでも読者の方の役に立てれば良いなと考えておりますの、今後とも どうぞよろしくお願いいたします。




-ALL, EXCEL, Program, VBA
-, , , ,