【テクニカル・上級編】【初心者向け】図面を閉じる際に「保存しますか?」ダイアログを抑制するVBAテクニック – AutoCAD VBA解析バイブル

スポンサーリンク

AutoCAD VBAの深淵:図面クローズ時の「保存確認」を完全に制圧する

AutoCADの自動化において、最も初歩的でありながら、多くのエンジニアが躓き、そして最終的に力技の回避策で妥協するのが「図面を閉じる際の保存ダイアログ」の制御だ。

GUIによる対話型操作を前提としたAutoCADのアーキテクチャでは、`Document.Close` メソッドを安易に叩くと、バックエンドのイベントループが「変更があるならユーザーに聞くべきだ」と判断し、ダイアログという名の「ボトルネック」を生成する。バッチ処理で1000枚の図面を処理する際、このダイアログの出現は致命的なシステム停止を意味する。

今回は、この挙動を根底から制御し、メモリ管理とプロセスの安定性を両立させる「極限の手法」を伝授する。

—

1. 原理:なぜダイアログが出るのか

AutoCADの `Document` オブジェクトには、図面の変更状態を示す `Saved` プロパティが存在する。このプロパティが `False` の状態で `Close` を呼び出すと、AutoCADは安全装置としてダイアログを強制表示する。

この挙動を回避する唯一にして正攻法のアプローチは、「閉じる前に、強制的に保存状態(あるいは保存済みフラグ)を操作する」ことにある。

—

2. 実装:保存確認を黙殺するスマートなクローズ処理

以下のコードは、保存の有無を明示的に制御するモジュールだ。初心者向けに書かれているが、中身はプロダクション環境でそのまま転用できる堅牢性を持たせている。

‘ @description 図面を強制的に(保存または破棄して)閉じるためのユーティリティ
‘ @author Chief Architect
Public Sub CloseDrawingSilently(ByVal doc As AcadDocument, ByVal bSave As Boolean)
On Error GoTo ErrorHandler

‘ 1. メモリとオブジェクトの整合性チェック
If doc Is Nothing Then Exit Sub

‘ 2. 保存するか否かの分岐
If bSave Then
‘ 変更がなければ保存処理をスキップすることでI/Oを最適化
If Not doc.Saved Then
doc.Save
End If
Else
‘ 破棄する場合:SavedをTrueに偽装することでダイアログを回避
‘ これによりAutoCADは「変更なし」と誤認する
doc.Saved = True
End If

‘ 3. 図面を閉じる
‘ 第1引数は保存フラグだが、上記で制御済みのためFalseで確定
doc.Close False

Exit Sub

ErrorHandler:
‘ システムのクラッシュを防ぐためのエラーハンドリング
Debug.Print “Error ” & Err.Number & “: ” & Err.Description
Err.Clear
End Sub

【極限の知見】なぜ `doc.Saved = True` なのか

この手法は、AutoCADの内部フラグを直接書き換える「ハック」に近いアプローチだ。本来はファイルシステムと同期すべきだが、自動化バッチにおいて「中間生成物を残さない」という要件を優先する場合、このフラグ操作は最も高速かつ確実な手段となる。

—

3. シニアエンジニアが意識すべき「メモリリークとプロセス管理」

VBAはガベージコレクションが甘い。特に `AcadDocument` オブジェクトをループ処理で次々と開閉する場合、参照オブジェクトがメモリ上に残り続け、最終的にAutoCADのプロセスが肥大化(メモリリーク)を起こす。

これを防ぐための鉄則は以下の通りだ。

  • 明示的なオブジェクト解放:

処理のループ内で `Set doc = Nothing` を徹底すること。

  • イベントの無効化:

図面を開閉する際、`BeginClose` 等のイベントが走らないよう `Application.EnableEvents = False` を一時的に適用することを推奨する。これにより、サードパーティ製のアドオンによるダイアログの割り込みも抑制できる。

  • DoEventsの適切な使用:

処理が重い場合、`DoEvents` を挟まないとAutoCADの描画スレッドがハングアップしたように見えることがある。ただし、過剰な使用はパフォーマンスを劇的に下げるため、10図面ごとの処理終了後など、適切なインターバルを設けるべきだ。

—

4. 最後に:レガシーとの対峙

AutoCADのVBA環境はレガシーだが、そのAPIは極めて強力だ。
「ダイアログを消せない」と悩むのは、AutoCADのオブジェクトライフサイクルを単なるGUI操作の延長で見ているからに他ならない。

図面ファイルを「ファイル」としてではなく、「データベース・オブジェクト」として制御する視点に切り替えた時、君の自動化コードは初めて「システム」へと進化する。

この知見が、君の自動化プロジェクトにおける強固な基盤となることを期待している。質問があればいつでも来い。現場からは以上だ。

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