2016年12月2日金曜日

IE+VBAでWebページを自在に操るときにハマる罠で再び、ハマる

VBAでWebページを自在に操るときにハマる罠

であれほど注意しいたにもかかわらず、再び、出てもいないページを覗いて、思うように制御できない事態に陥ってしまった。Webページが複数のフレーム(frame)で構成されていると、最後のフレームが表示されないことがあるのだ。そして、そこに次のページを出す重要なボタンがあるにもかかわらずにだ。その原因はIEのバグと思われるのだが、マイクロソフトが相手の場合、自分が修正するしかない。その対応策としては、IEのフレームのページ(frame)出力を待つのに

For Each objWindow In objShell.Windows
If TypeName(objWindow.document) = 'HTMLDocument' then
Set objIE = objWindow
End If
Next
Do While objIE.Busy = True Or objIE.document.frames("frameA").document.ReadyState<>4
DoEvents
Loop
fukakyon
ReadyStateではダメだということだ。
では、どうするのかというとInStr関数を使うのである。

具体的には、そのページ(frame)に存在するユニークな文字列、例えばワタシのページ(frame)ではFukakyonが出ているかをInStr関数で判定し、出ていないならIE.refreshで、無理矢理出してやるのだ。出てくるまで、IE.resfreshしてあげるのである。つまり、マイクロソフトのバグをInStr関数とIE.refreshの組み合わせで乗り切るのだ。









WaitFukakyon:
For Each objWindow In objShell.Windows
If TypeName(objWindow.document) = 'HTMLDocument' then
Set objIE = objWindow
End If
Next
Do While objIE.Busy = True Or objIE.document.frames("frameA").document.ReadyState<>4
DoEvents
Loop
If InStr(objIE.document.frames("frame-name-A").document.body.innerHTML,"Fukakyon") = 0 then
objIE.refresh
GoTo WaitFukakyon
End If

0 件のコメント:

コメントを投稿