[VBA]終わらないアプリケーションオブジェクト

「 終わらないアプリケーションオブジェクト」VBA でアプリケーションオブジェクトを呼び出して、エラーや例外などで開きっぱなしになってしまう現象を名付けました。終わらない代表例は以下の Microsoft 製品です。

Set exc = VBA.CreateObject("Excel.Application")
Set acc = VBA.CreateObject("Access.Application")
Set wrd = VBA.CreateObject("Word.Application")
Set ie = VBA.CreateObject("InternetExplorer.Application")

アプリケーションを閉じないで変数を初期化すると、VBAとアプリケーションが切り離されてしまい、以降VBAからは制御できなくなります。

そこでVBAの場合は、ラップするクラスモジュールを使って確実に終了できるようにします。参照している変数が無くなった場合にクラスの終了処理が動く仕組みです。この場合でもデバッグモードで中断した場合は残ってしまいますが、本番運用中であれば問題無いでしょう。

[WrapExcel.cls]
Private obj
Private Sub Class_Initialize()
    Set obj = VBA.CreateObject("Excel.Application")
End Sub
Public Property Get Application()
    Set Application = obj
End Property
Private Sub Class_Terminate()
    obj.Quit
End Sub

なお、切り離されたアプリケーションについてはタスクマネージャーで強制終了させます。