【AutoCAD VBA】図面を「黙って閉じる」技術:Savedプロパティを掌握し、自動化のボトルネックを排除せよ
業務自動化を志す諸君、AutoCADのVBA開発において、初心者が最初に突き当たる「見えない壁」がある。それが「図面を閉じる際の保存ダイアログ」だ。
バッチ処理で数百枚の図面を次々と開き、一括置換やメタデータ抽出を行う際、コードが途中で止まって「変更を保存しますか?」というモーダルダイアログが画面に鎮座しているのを見たことはないか? あの瞬間、君の自動化ツールは「兵器」から「ただの邪魔なソフトウェア」に成り下がる。
今日は、AutoCADのオブジェクトモデルの深淵にある`Saved`プロパティを制し、プログラムの主導権を完全に取り戻すための流儀を伝授する。
—
なぜ、保存ダイアログは「悪」なのか
AutoCADにおいて、`Document`オブジェクトは常に「Dirty(ダーティ:未保存の変更がある状態)」を監視している。プログラムが図面を操作すれば、AutoCADは当然のごとく「保存が必要だ」と判断し、ユーザーに介入を求める。
しかし、我々エンジニアにとって、自動化処理中の「一時的な操作」や「ログ用の書き込み」は、必ずしも図面本体の保存を意味しない。この「プログラムの意図」と「AutoCADの仕様」の乖離を埋めるのが、プロの設計というものだ。
Savedプロパティ:真実を操る鍵
`Document.Saved`は、単なる真偽値ではない。これはAutoCADに対する「この図面は、もう保存済みであると見なせ」という強力な宣言(フラグ)だ。
このプロパティを正しく操作することで、CAD側の保存チェックを無効化し、メモリ上の変更を破棄して強制的に閉じることができる。
【プロダクションコード】確実なクローズ処理のテンプレート
現場でそのまま使える、堅牢なクローズ処理の実装例を提示する。エラーハンドリングを怠ることは、自動化における最大の罪だ。
Public Sub ForceCloseCurrentDocument()
Dim doc As AcadDocument
Set doc = ThisDrawing.Application.ActiveDocument
On Error GoTo ErrorHandler
‘ 1. SavedフラグをTrueに強制設定
‘ これにより、AutoCADは「未保存の変更はない」と誤認する
If Not doc.Saved Then
doc.Saved = True
End If
‘ 2. 変更を破棄して閉じる(保存ダイアログは表示されない)
‘ 第二引数にFalseを指定することで、保存せずに閉じることを明示
doc.Close False
Exit Sub
ErrorHandler:
MsgBox “図面のクローズ中に予期せぬエラーが発生しました: ” & Err.Description, vbCritical
End Sub
現場で陥る「設計上の罠」
このコードを実装する上で、一つだけ注意すべきことがある。「本当に保存しなくていいのか?」という設計判断だ。
- データベース連携時:
外部DBと連携し、図面内のブロック属性を更新している場合、`Saved = True`をしてしまうと、データベース上のデータと図面内の実体が不整合を起こす可能性がある。
- 例外発生時のリカバリ:
処理の途中でエラーが発生した場合、`Saved = True`を実行した後に閉じてしまうと、本来保存されるべき修正結果までがゴミ箱行きになる。
アーキテクトからの助言:
「Savedフラグを操作するタイミングは、処理の『出口』の直前であること」。トランザクションを意識し、正常系であればSaveし、異常系であればCloseする、という明確な分岐点(ゲート)をコード内に設けるべきだ。
次のステージへ:ActiveDocumentの罠を避ける
中級者へのステップアップとして、`ThisDrawing`というキーワードに依存しすぎるのは禁物だ。複数の図面を扱う自動化の場合、`Application.Documents`コレクションを直接操作し、どのインデックスが対象かを明確に制御せよ。
‘ 全ての開いている図面を保存せずに閉じる(※慎重に使うこと)
Public Sub CloseAllDocumentsDiscardChanges()
Dim doc As AcadDocument
For Each doc In Application.Documents
doc.Saved = True
doc.Close False
Next
End Sub
結び:エンジニアの美学
「ツールが動く」ことと、「ツールが信頼に足る挙動をする」ことは別物だ。保存ダイアログ一つをとっても、それを仕様のせいにして放置するのか、プロパティをねじ伏せて制御下に置くのか。その細部への執着こそが、君をただの作業者から、真の自動化エンジニアへと押し上げる。
次は、`Saved`プロパティが持つ「副作用」をも利用した、より高度なトランザクション管理について話すとしよう。準備ができたらまた来い。現場の戦場へ戻る時間だ。
