2014-11-12

ExcelのVBAマクロからIE操作:「オートメーションエラーです。 システムのシャットダウンは既にスケジュールされています。」対処法

関連記事


以前、上記の記事でIEオブジェクトをVBAから制御して処理させる方法を記載しましたが、
これを自動実行プログラムとして運用していくとたまに次のようなメッセージで止まることがありました。







実行時エラー'-2147023706(800704a6)
オートメーションエラーです。
システムのシャットダウンは既にスケジュールされています。


これについて原因と対策を実装したので記載します。


オートメーションエラーの原因


どうやらCreateObjectで生成したIEオブジェクト1つを使いまわす分には問題ないですが、
プロシージャレベルで生成→操作→終了→破棄となっているものを何度も呼び出すと2回目以降、
稀にこれが起こることが分かりました。

例えば次のようなソースです。

これ単体では何も問題ないです。ですがこのプロシージャが何度も呼び出された場合、最後の
Set oIE = Nothing
での処理がすぐ完結しないときがあるようで、その後に実行される
Set oIE = CreateObject("InternetExplorer.Application")
のところでこのエラーが出るといった具合です。


解決方法としては次の方法があります。


  • 案①:プログラム起動時に1度だけCreateObjectしたIEオブジェクトを上位スコープ変数として持ち、プログラム終了までずっと使いまわす
  • 案②:IEを利用するときに、既にIEがいるならそれをバインドして利用する。ないなら生成する。

①の方法が良いのでしょうが、そうするとローカル関数で生成しているオブジェクト生成と破棄を実施しているソースコードに1つ1つパラメータ引数で渡してあげなければならないのもいやなので(グローバルは使わない方針w)
今回は修正方法が楽な②の方法としました。

まず、次の関数を作ります


次にさきほどのテストソースは次のように修正します。


今度は終了時の処理です。まずこの関数を定義します。


で、プログラムの終了時にIEオブジェクトを掃除します


コードは前よりもシンプルになり、また変なエラーも出なくなりましたw
※一応補足しますと、IEオブジェクト操作による自動実行処理をさせているマシンは基本、
人が操作することがない無人機想定です。
なので、このプログラム時にたまたま画面に出ていたIEが再利用されて挙句に
プログラム終了したらIEも1ウィンドウ残らず閉じられたとしても問題ありません^^