【AutoCAD VBA】「保存しますか?」の呪縛を解く。Savedプロパティを制御する極限の流儀
AutoCADの自動化ツールを組んでいると、必ず一度は壁にぶつかる。「読み取り専用で開いて情報を抽出しただけなのに、閉じる時に保存ダイアログが出る」。
この些細なポップアップが、数百枚の図面を一括処理するバッチプログラムにおいてどれほどの「死」を意味するか。君たちは理解しているか? ユーザーの操作を止めるダイアログは、自動化の最大の敵だ。
今日は、`AcadDocument.Saved`プロパティを掌握し、プログラムの意図通りに図面の状態を制御する「プロの作法」を伝授する。
—
1. なぜ「Savedプロパティ」を理解する必要があるのか
AutoCADのオブジェクトモデルにおいて、`AcadDocument`オブジェクトには`Saved`というプロパティが存在する。これは図面の「ダーティフラグ(変更状態)」そのものだ。
- Saved = False: 図面が変更されている。終了時に保存を促す。
- Saved = True: 図面は変更されていない。即座に閉じることができる。
初心者は「保存しなければいい」と考えるが、AutoCADのAPIは、少しのプロパティ参照や非表示のシステム変数変更だけでも、内部的に「変更あり」と見なすことがある。この「見えない変更」をねじ伏せるのが、`Saved = True`の強制代入だ。
—
2. プロダクションコード:安全な「読み取り・クローズ」の実装
実務で最も重要なのは、「例外発生時でも確実に図面を閉じること」だ。途中でエラーが起きてプログラムが止まると、AutoCADがゾンビのようにバックグラウンドで残り続ける。
以下のコードは、私が設計・実装の現場でテンプレートとして利用している堅牢なパターンだ。
Public Sub ProcessDrawingQuietly(ByVal filePath As String)
Dim doc As AcadDocument
‘ エラーハンドリングの要。必ずOn Error GoToを使用する
On Error GoTo ErrorHandler
‘ 図面を開く(読み取り専用で開くのが基本)
Set doc = Application.Documents.Open(filePath, True)
‘ — ここに業務ロジックを記述 —
‘ 例:図面内のレイヤー情報を取得するなど
Debug.Print “Processing: ” & doc.Name
‘ 【重要】ロジック完了後、変更がないことを明示的にフラグへ教える
‘ これにより、ドキュメントを閉じる際の保存確認を抑制する
doc.Saved = True
‘ 図面を閉じる
doc.Close False ‘ 引数Falseは「保存せずに閉じる」の強制命令
Exit Sub
ErrorHandler:
‘ 異常終了時もメモリ解放を考慮し、ドキュメントを閉じるか判断する
If Not doc Is Nothing Then
doc.Close False
End If
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
End Sub
—
3. なぜ `doc.Close False` だけでは不十分なのか?
「`doc.Close False` を書けばいいじゃないか」という声が聞こえてきそうだが、それは甘い。
AutoCADの環境設定(`FILEDIA`や`PICKFIRST`など)をプログラム内で変更した場合、たとえ`Close False`を指定していても、AutoCADが「環境設定の変更」を「図面変更」と誤認し、稀にダイアログが出るケースがある。
極限の知見:
`doc.Saved = True` を先に実行してから `doc.Close False` を叩く。この二段構えこそが、いかなる環境下でもダイアログを黙らせるための「鉄壁の防御」だ。
—
4. 開発者としての注意点:データベース連携の罠
もし君たちが、AutoCAD図面からデータを抜き出し、ExcelやSQL Serverに書き出すツールを作っているなら、一つだけ注意してほしい。
「`Saved = True` は、あくまでAutoCADへの『嘘』である」
このフラグを操作しても、図面データそのものが破損することはない。しかし、もし君のプログラムが図面の中身を書き換えている(例:属性値を更新している)のに `Saved = True` を使って保存をスキップすれば、当然ながらその変更は「破棄」される。
- 更新を伴うツール: `doc.Save` を呼び出すべき。
- 抽出のみのツール: `doc.Saved = True` + `doc.Close False` で高速化すべき。
この明確な使い分けこそが、AutoCADのオブジェクトライフサイクルを支配する者の思考だ。
—
結びに:自動化は「静寂」であるべき
優れた自動化ツールとは、まるでそこに存在しなかったかのように静かに仕事を完遂するものである。ユーザーに「保存しますか?」と尋ねる時点で、そのプログラムは未完成だ。
今日から、すべての `Documents.Open` の後に `Saved = True` を仕込む癖をつけろ。そのわずかな一行が、君のツールを「おもちゃ」から「プロフェッショナルな業務システム」へと昇華させるはずだ。
次は「`Document`のオープンイベントと`Application`のイベントハンドラの同期」について深掘りしよう。これが理解できれば、君はもう初心者ではない。
