最近、Excel VBA(Excelマクロ)でインターネットエクスプローラ(Internet Explorer / IE)をCreateObjectしてスクレイピングしていたところ、Webリクエストを何度も繰り返すとIEプロセスのメモリが溜まり続け、1.5Gくらいになると、Webページを新しいタブで開きなおしますというメッセージがIEで発生し、VBAがオチるという事象がありました。
VBA側ではオートメーションエラーが発生します。
VBAでエラーハンドル(On Error GoTo)を入れても引っかかりません。
VBAのエラーハンドルVBAの中の例外を補足するものであって、CreateObjectした外部プロセスの例外は捕捉できないのです。(言われてみれば当たり前ですね)
とりあえず、今回は規定リクエスト数でIEをCreateObjectし直すことで回避するようにしました。
オートメーションエラーとは?
ところで、VBAに表示される「オートメーションエラー」とはどういう意味なのでしょうか?
これは、そもそもCreateObjectから順に追っていくことで判明します。
CreateObjectとは?
CreateObjectの正式リファレンスを参照します。概要には、
ActiveX オブジェクトへの参照を作成して返します。
CreateObject 関数
とあります。
ActiveXとは?
ActiveXとはなんでしょう?
先ほどの概要のリンクをたどると、ActiveXとは
オートメーション インターフェイスを通して他のアプリケーションまたはプログラミング ツールに公開されるオブジェクト。
ActiveXオブジェクト
との用語解説になっています。
ここでオートメーションという用語が出てきました。オートメーションエラーはココから来ています。
ActiveXとは「オートメーションインターフェイス」というインターフェイス(規格)を通じて他のアプリケーションで使用できるオブジェクト(アプリケーション)ということですね。
上に紹介したVBAはまさに「オートメーションインターフェイス」を備えたActiveXであるIEをExcel VBAが使っているという例です。
ActiveXの詳細はコチラです。
(英語ですが、chromeブラウザの翻訳が可能です)
ここには以下の記述があります。
The objects an application or programming tool exposes are called ActiveX objects. Applications and programming tools that access those objects are called ActiveX clients.
アプリケーションまたはプログラミングツールが公開するオブジェクトは、ActiveXオブジェクトと呼ばれます。これらのオブジェクトにアクセスするアプリケーションとプログラミングツールは、ActiveXクライアントと呼ばれます。(google翻訳)
結局オートメーションインターフェイスの実装はActiveXのことなので、ActiveXでエラーと言われた方がしっくりきますね。
オートメーションエラー=ActiveXのエラーということです。
—
他にExcelに関する記事はこちらをどうぞ