ブラウザの待機処理がうまくいかない場合の対処方法


VBAでIE操作を行う場合、ブラウザの読み込み待機処理はほぼ必須で使われていると思います。つい最近、とある改修案件で他の人の作成したプログラムを拝見する機会があったのですが、以下の様な記述になっていました。

Do While objIE.Busy Or objIE.readyState <> READYSTATE_COMPLETE
	DoEvents
Loop

一般的な待機処理ですね。

強いて言えばループ内にSleep入れておかないと、待機処理の度にPC操作ができなくなるかなという位。普通であればこの処理で全く問題無いと思いますが、私は過去に体験したトラブルのせいで未だにこれだけの待機処理には不安を感じています。「処理は0.1秒でも早く!とにかく速度を優先!」といった要望でも無い限りは、お客さんに納品するツールはコンマ数秒遅くなってももうちょっとしっかり遷移確認するべきかなと思っています。

昔仕事で納品したツールがあったのですが、テスト運用中にエラーが頻発するという報告を受けました。しかしそのエラー、全く同じ操作をしているにも関わらず「出る時と出ない時がある」という何とも困ったものでした。

当然こちらも同じ環境のマシンを用意したり、色んな環境でテストするも何回やっても再現せず。先方の環境でのみ発生するという謎現象だったんです。

いくら調べても原因が分からないので現地調査することになりました。

それで確認した所、エラーはこれ。

そしてエラーの発生場所は「getElementsByTagName」等でオブジェクトを取得したり、取得したオブジェクトのプロパティ情報取得のあたり。プロパティの指定が間違っていた訳ではありません。そもそもオブジェクトが取れていなかったみたいです。

そして何回か繰り返し実行した所、衝撃の現象が・・・

エラー発生箇所が実行の度に変わる(笑)

なぜだー!!

なんとなく理由が想像できる方っているでしょうか。プログラムミス?うーん・・・考慮できていないという点ではある意味そう言えなくもないなんですが・・・

調査した結果、原因はページの読み込みが完了していないのに「readyState」が「4(完了)」を返していたことでした。ページが読み込めていないんだから当然オブジェクトも取れませんよね。いや、絶対わかんないよこれ!

数年前なので細かくは覚えていませんが、readyStateの値を表示させながら処理した時「1111111223333341111111」という感じで一瞬しれっと4が混じってた記憶があります。何だったんでしょうね。ちなみにIEのバージョンは9だったかなぁ。

根本原因としては「回線速度が遅いせい」という結論になりました。その現場の場合、例えばYahooのトップページなんかにアクセスすると、完全に表示されるまでに6~8秒ほど掛かる様な環境でした。

一定時間経過しても読み込みが完了しない場合、「読み込み停止」⇒「再開までの一瞬の間(ここで一瞬「readyState=4」になる?)」⇒「読み込みやり直し」みたいなことが行われているんでしょうか・・・。

速度が原因だろうと「ツールが動かないと困る」という状況だったため、

力技で「読み込み終わった?本当に?じゃあ後○セット繰り返してね!」といった感じにループさせたり、

For i = 0 To retryCount
    Do While objIE.Busy Or objIE.readyState <> READYSTATE_COMPLETE
        DoEvents
    Loop
    
    Sleep 100
Next

「オブジェクトに触れる様になるまでは絶対に進むなよ!」という感じにしたり・・・

Do
    Set obj = Nothing
    On Error Resume Next
    Set obj = objIE.getElementById("nameInput")
    On Error GoTo 0
Loop While obj Is Nothing

読み込みの途中でそのまま止まってしまうこともあったので、一定時間経過しても読み込みが完了しない場合は待機処理を一旦抜けてページ更新からやり直したり・・・

startTime = GetTickCount
            
~省略~
            
useTime = GetTickCount - startTime
'タイムアウト処理(10秒経過時)
If useTime >= 10000 Then
    waitBrowse = reloadFlag
    Exit Function
End If

※GetTickCount…システムを起動した後の経過時間を、ミリ秒(ms)単位で取得する関数

「待つ」以外の解決策が無かったため、もう色んな所を作り替えて「とりあえず最後まで自動で動けばいい!」状態に仕上げました。あの時は本当に大変だった・・・

回線速度の問題だとして、現在でも起こる可能性がある程遅い環境はあるのかと思い、最新の接続回線加入状況を調べてみました。2015年末のものですが、参考までに。

ごく僅かですかナローバンドもまだ生きてるんですね。

限りなく可能性は薄いと思いますが、私の様な状況に陥った方がいましたら解決法の参考になればと思います。

関連記事と広告

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

コメント

  1. あいとり より:

    会社の数台あるパソコンの中で、一台だけ、このエラーがでるものがありました。
    社内のパソコンは、同一設定となっているため、比較したところ、IEの設定が相違していました。
    IEの「アドオンの設定」が、エラーのでるパソコンだけが、アドオンがすべて無効となっていましたが、他のパソコンと同じ項目を有効に変更したところ、エラーが発生しなくなりました。
    そういえば、以前IEのバージョンアップをした時に、アドオンを有効にするように指示があったのですが、モレていたようです。