【実務・中級編】【上級】AcadApplicationの「ゴーストプロセス」を完全に封じ込める:エラー発生時でも確実にAutoCADをクリーンアップする堅牢な終了処理の実装 – AutoCAD VBA解析バイブル

スポンサーリンク

AutoCAD VBAを掌握する:ゴーストプロセスを根絶する「絶対終了」の極意

AutoCADのオートメーション開発において、最も恥ずべき失態は何か。それは、業務終了後にタスクマネージャーを覗くと、「終了したはずのAcad.exeがメモリを食いながら居座っている」という光景だ。

いわゆる「ゴーストプロセス」だ。これが残ると、次にプログラムを起動した際にメモリ不足やファイルロックエラーを引き起こし、最悪の場合は図面データそのものを破損させる。

「エラーハンドリングさえしていれば大丈夫」と高を括っているなら、それはアマチュアの思考だ。今回は、伝説的な安定性を誇るAutoCAD VBAの終了処理構造を伝授する。

なぜ、あなたのコードは「ゴースト」を生むのか

VBAの標準的なエラーハンドリング(`On Error GoTo`)は、あくまでコードの実行フローを制御するものであり、「予期せぬ外部要因」や「オブジェクトの保持状態」までケアしてはくれない。

特に外部からAutoCADを操作する際、以下のコードは地雷だ。

‘ 【アンチパターン】これではクリーンアップが保証されない
Set acadApp = New AutoCAD.Application
‘ 何らかの処理でエラー発生
‘ ↓
‘ エラーハンドラへ飛ぶが、acadAppがNothingにならずメモリに残る

原因は明白だ。「どのタイミングでエラーが起きても、必ずオブジェクトを解放する(Nothingにする)経路」が設計されていないからである。

究極のクリーンアップ設計:Finally構造の模倣

VBAにはVB.NETのような`Try-Catch-Finally`構文はない。だが、「関数を分ける」という設計思想で、事実上の`Finally`ブロックを実装することは可能だ。

堅牢な終了処理のプロダクションコード

以下のコードは、外部(Excel VBA等)からAutoCADを制御する際のテンプレートだ。ここでのポイントは、「メイン処理」と「後始末処理」を完全に分離し、エラー発生時でも必ず後始末へ強制ジャンプさせることにある。

Public Sub MasterController()
Dim acadApp As Object

‘ 1. 初期化
On Error GoTo ErrorHandler
Set acadApp = GetObject(, “AutoCAD.Application”)

‘ 2. メイン処理(別のプロシージャへ分離する)
Call ExecuteHeavyProcess(acadApp)

Cleanup:
‘ 3. 【最重要】何があってもここを通る
If Not acadApp Is Nothing Then
‘ 必要であればQuitを実行するが、AutoCADを立ち上げたままにする場合は
‘ ここで適切に接続を切る実装を入れる
Set acadApp = Nothing
End If
Exit Sub

ErrorHandler:
‘ エラーログ出力やユーザーへの通知
MsgBox “エラー発生: ” & Err.Description, vbCritical
Resume Cleanup
End Sub

Private Sub ExecuteHeavyProcess(ByVal objAcad As Object)
‘ ここで複雑な図面操作を行う
‘ この中でのエラーは、呼び出し元のErrorHandlerへ伝播する
End Sub

現場で差がつく「3つの鉄則」

1. オブジェクトの「多重参照」を避ける

`ThisDrawing`や`ActiveDocument`といったグローバルな参照を多用してはいけない。これらはプロセス終了時にAutoCAD側の解放待ちを阻害する大きな要因になる。必ず明示的にオブジェクト変数を宣言し、最後に`Nothing`を代入して参照カウントをゼロにせよ。

2. データベース連携時の「ロック」を意識する

AutoCADはDBではないが、図面を開くことは「排他ロック」に近い状態を作る。エラーで止まった際に`Document.Close`が実行されなければ、次にそのファイルを開く際、`read-only`モードに追い込まれるか、最悪の場合、ゾンビプロセスがファイルを掴み続けているためにアクセス拒否される。`Finally`節には必ず`Document.Close`を含めること。

3. DoEventsの安易な使用を禁ずる

ループ処理で`DoEvents`を使いすぎると、スタックが不安定になり、エラー発生時の終了処理が正常に動作しなくなることがある。AutoCADのプロセスがビジー状態のときは、`Sleep` APIを利用してプロセスに呼吸をさせるのが、プロフェッショナルの制御だ。

結論:安定性は「設計」で決まる

「動けば良い」コードは、一週間後のあなたを苦しめる負債になる。
AutoCADを外部から制御するということは、「CADの命を一時的に預かる」ということだ。エラーが起きたとき、いかにして美しく、静かにCADを終了させ、システムを健全な状態に戻すか。

この「後始末の美学」こそが、業務自動化エンジニアとしての生存能力を決定づける。

今日からあなたのコードに、この「Cleanupラベル」を刻み込んでほしい。それが、ゴーストプロセスを根絶し、真に堅牢なツールを作り上げるための第一歩だ。

タイトルとURLをコピーしました