今日はIEの待機です。
今まで使ってた待機する関数はよくあるBusy状態が解除されるまで待って、HTMLが完全に読み込み終わるまで待つ関数を使ってました。
しかしプログラムを走らせっぱなしにして別作業をしてる時、一部のページで応答せずずっと処理が進まないことがあったので、従来のものにタイムアウトを設けることにしました。
ついでにCPU負荷対策で挟んであるSleep関数もどれだけ休むか指定出来るようにしました。
'--------------------------------------------------------------- '関数名:waitEx '内容:IEのBusy状態が解除されるまで待機 '引数1:IEオブジェクト '引数2:タイムアウトの時間(オプション) '引数3:Sleep関数で休む時間(オプション) '戻り値:タイムアウトの有無 '--------------------------------------------------------------- Function waitEx(ByVal objIE As Object, Optional ByVal timeout As String = "0:00:00", Optional ByVal breaktime As Long = 100) As Long Dim flg As Boolean Dim setTime As Date flg = False If CDate(timeout) > CDate("0:00:00") Then flg = True setTime = Now + CDate(timeout) End If Do While objIE.Busy If flg Then If Now >= setTime Then waitEx = 1 Exit Function End If End If Sleep breaktime DoEvents Loop Do While objIE.document.ReadyState <> "complete" If flg Then If Now >= setTime Then waitEx = 1 Exit Function End If End If Sleep breaktime DoEvents Loop waitEx = 0 End Function
タイムアウトの時間とSleep関数で休む時間はそれぞれオプションになってて、省略した場合はタイムアウトはせず、Sleep関数は100ミリセカンド休みます。
Sleep関数に関して、自分は全WindowsAPIが書かれたxlaファイルに自分の関数が書いてあるので上記では定義してませんが、そうでない場合は
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
が必要です。
タイムアウト(変数timeout)は「0:00:00」の文字列型で指定します。3分でタイムアウトなら「0:03:00」と指定します。
Sleep関数に入れる値(変数breaktime)はミリセカンドで指定します。(1000ミリセカンド = 1秒)
今まではただ休むだけなので戻り値は返さないようにしてましたが、上記プログラムでは返すようにしました。
タイムアウトせずに済んだ場合は0を、タイムアウトしたら1が返ります。
従って本文の方で
If waitEx(objIE, "0:03:00") Then GoTo Skip: '処理 Skip:
などして次のループに進みます。
処理をスキップする訳ですので、完璧に処理を行いたいケースでは向いてませんね。
まぁ、その場合であってもタイムアウトした場合はアラートを表示させて一旦処理を停止したりするとかも良いと思います。
Excel VBAでIEを思いのままに操作できるプログラミング術 Excel 2013/2010/2007/2003対応
- 作者: 近田伸矢,植木悠二,上田寛
- 出版社/メーカー: インプレス
- 発売日: 2013/04/19
- メディア: Kindle版
- この商品を含むブログ (8件) を見る