shikumika’s diary

日々の事務作業で手間なことを簡単にできる仕組み(自動化、方法など)、困ったことの解決方法を調べた備忘録

【Excel VBA】Setでワークブックを変数に割り当て(オートメーションエラーの発生事例)

ExcelのVBAを使って作業を自動化する際、ワークブックを変数に割り当てることはよくあります。このとき、変数が不要になったらSetステートメントでNothingを実施しておかないと、次のような"オートメーションエラー"が発生することがあります。

オートメーションエラーの発生例

実行時エラー '-2147221080(800401a8)': オートメーション エラーです。

オートメーションエラーは、重いデータ処理や、メモリ不足等が原因にもなるようなので、エラーの一例として示します。

次のように、モジュールレベルの変数でワークブックを割り当て、最後にSetステートメントでNothingを実施していないケースでは注意が必要でした。

このケースでは、1回目の実行は問題なく動作し、2回目でオートメーションエラーが発生しました。原因は、1回目の実行後にオブジェクトへの参照が解除されず、「対象ブック is Nothing」の分岐で意図しない処理となるためです。

モジュール レベルの変数で宣言し、Nothingの処理もなし

オートメーションエラーが発生したコード例

なお、プロシージャ内で変数を宣言している場合は、SetステートメントでNothingを実施していなくても、プロシージャの終了とともにオブジェクトへの参照が解除されました。

要は、プロシージャの終了だけでオブジェクトへの参照が解除されるものではないので、必要に応じてSetステートメントでNothingが必要という一例でした。