IE操作時のオートメーションエラーと戦う

2023年6月17日

はじめに

Excel VBAでツールを作成する時に、よく目にするオートメーションエラーについてIEブラウザ操作関連のオートメーションエラーについて、自分なりの対策を残しておきます。

オートメーションエラーとは?

メモリ不足や、参照の切れた変数の使用、ブックに対する矛盾する処理、PCが重い場合等々...様々な理由が原因で発生するエラーです。

基本的な対策

基本的にはエラー発生時のメッセージに記載されているエラーコードをGoogleで検索すると、先人様達の解決策がヒットします。
しかし中には全く解決策のないものや、解決策を講じてもまだ発生するなんてことも結構あります。特にIEブラウザ操作関連がオートメーションエラーの発生率が高かったので今回は記事にまとめようと思いました。

ソースコード

いろいろ話す前にIEブラウザ操作時のテンプレートとして使用できるソースコードを載せておきます。
InternetExplorerMediumを使用しているので、IEの保護モードは解除してください。

Option Explicit

Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sub Main()

    Dim objIE As InternetExplorerMedium

    'IEプロセスを削除'
    IeProcessKill

    'Googleトップページを開く'
    CreateIE objIE, "https://www.google.co.jp/"

    '1秒待機'
    Sleep 1000

    'IEを閉じる'
    objIE.Quit
    Set objIE = Nothing

    '処理完了メッセージ表示'
    MsgBox "処理完了"

End Sub

'IEのプロセスを削除する関数'
Public Sub IeProcessKill()

    Dim objShell As Object
    Dim objExec As Object

    Set objShell = CreateObject("WScript.Shell")
    Set objExec = objShell.Exec("taskkill.exe /F /IM iexplore.exe")
    Sleep 1000

End Sub

'Internet Explorer作成関数'
Sub CreateIE(ByRef objIE As InternetExplorerMedium, ByVal URL As String)

    Dim timeout As Date
    timeout = Now + TimeSerial(0, 0, 10)

    If objIE Is Nothing Then
        Set objIE = New InternetExplorerMedium
    End If

    objIE.Visible = True
    objIE.navigate URL

    Do While objIE.Busy = True Or objIE.readyState <> 4
        Sleep 100
        DoEvents
        If Now > timeout Then
            objIE.Refresh
            timeout = Now + TimeSerial(0, 0, 10)
        End If
    Loop

End Sub

Googleのトップページを開いて、閉じるサンプルです。
強いて特筆する点と言えば、仰々しく書いてあるIEのプロセスを削除する部分でしょうか。
実は無くても、普通に動きます。しかしある操作を行うとオートメーションエラーが発生してしまう状態なのです。

その操作ですが、Quit後に再度処理を実行することです。
objIEは閉じている、Nothingもセットしてるから安心!とは行きません。
まだプロセスが残存しています。試しにIeProcessKillのコール処理を削除して複数回実行するとページトップ画像の-2125463506 (8150002e)エラーが発生すると思います。

これが意外とソースを見ているだけでは気付かないもので、しばらく頭を悩ませることになります。エラーコードで検索をかけても別の解決策が提示されていることが多いので、結局治らず...。という方もいたのではないでしょうか。

こんな時に発生する

上記のサンプルでは、2度目の実行でエラーとなるソースを記載しましたが、
ループ処理の中でQuit、NothingをSetした場合にも同様の事象が起きる場合があったりなかったりします。(これは原因不明、エラーが起きなかった箇所が別のところにソース追加したりするとエラーが発生しはじめたりもする)

その場合でもとりあえずプロセスを削除しておけば、この事象でのエラーは回避できます。お約束的な感じで記載するのもいいかもしれません。

最後に

今回はIEのプロセスを一括で削除するようなソースとしましたが、実際に使用する際にはExcel VBAが開いたIEブラウザのプロセスのみを削除するべきだと思います。
使用する際にはご注意ください。