※レガシーブラウザIEを、VBAマクロで自動操作してる諸君向け。
VBAで作成した社内ツールに、
Excel.Applicationを非表示状態でUserFormのみ表示→UserFormの中の1つのボタンを押すとIEバックグラウンドで起動→完全に読み込まれてから次のコードに移る
という動きをするものがある。
読み込み完了待機には、
Do While ie.Busy = True Or ie.ReadyState <> 4
Loop
を挟んでいるのだが、急に、特定のPCのみでエラーが発生する状況になった。
(というより結構前からエラーが出ていたようだが、気づいていなかったか忘れていたために対応が遅れた)
エラー内容は、
オートメーションエラーです。
起動されたオブジェクトはクライアントから切断されました。
である。
※エラーはタイミングによって特定不可となったり変わったりしたが、上のエラーが正規。
他PCでは問題ないため、原因が分からず色々検索。
結果、
Set ie = CreateObject("InternetExplorer.Application")
を
Set ie = New InternetExplorerMedium
にするか(Mediumとかいうのは整合性レベルを表してるんだと。表記しない場合、基本は低(Low)になるらしい)、
IE保護モードをオンにするかのいずれかで対処可能。
ということがわかった。
※遷移先URLが「信頼済みサイト」に登録されていても発生したりするらしい。
一応、
保護モードがオンなら
Set ie = CreateObject("InternetExplorer.Application")
保護モードがオフなら
Set ie = New InternetExplorerMedium
と言うことになっているとかなんとかだが、
保護モードを片っ端から全てオンにした状態で(インターネット・ローカルイントラネット・信頼済みサイト・制限付きサイト)、
Set ie = New InternetExplorerMediumにして試してみたが、問題なく動いており、
逆にそのエラーが出ていたPCの保護モードを全解除状態(元はインターネット→保護モードがオフだった)で
Set ie = CreateObject("InternetExplorer.Application")に戻し起動させても、全くエラーがでなくなったため意味が分からん状態に。
どういう事かが分からず、実はNew InternetExplorerMediumは保護モードオンでも互換があってうまい事うごいているのか?!と検索してみたものの、よくわからず。どっちかと言えばデフォルトの低のほうが互換あるっぽいような?
それとも、整合性レベルを明示することが大事なのか?
…まあいい(分からん)。
とりあえず切り替えればエラー回避できたので、何でや!と発狂寸前の諸君は試してみることをおすすめする。
※一応一時的な改善とかまぐれだったりしないか、念の為後日確認→問題無しだった。
※現在New InternetExplorerMedium 己の席の保護モードは全オン これで動いている。なんやのマジで…。
使うかもしれん備忘録
READYSTATE_INTERACTIVE … 3 IEオブジェクトの操作可能状態。
READYSTATE_COMPLETE … 4 IEオブジェクトの全データ読み込み完了状態。