その買うを、もっとハッピーに。|ハピタス

IEの待機 - VBA、IE制御

今日は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:


などして次のループに進みます。
処理をスキップする訳ですので、完璧に処理を行いたいケースでは向いてませんね。
まぁ、その場合であってもタイムアウトした場合はアラートを表示させて一旦処理を停止したりするとかも良いと思います。