ようこそ、AutoCAD自動化の世界へ。
マクロの記録から一歩踏み出し、「自分の意図通りに図面を操る」という快感に目覚めたあなたへ、エンジニアの先輩として一つの重要な技術を伝授しましょう。
今回は、「変更を破棄して図面を閉じる」という、一見単純そうに見えて、実は奥が深いテーマを扱います。
—
なぜ「保存せずに閉じる」操作が重要なのか?
自動化処理を行っていると、「一時的に図面を開いて数値を読み取り、何も変更せずに閉じる」という作業が頻発します。この時、もし図面側に少しでも変更が加わっていると、AutoCADは律儀に「変更を保存しますか?」とダイアログを出してきます。
自動化において、このダイアログは「悪」です。 処理がそこで止まり、あなたのPCはユーザーの操作を待ち続けて永久に帰ってこないからです。
これをスマートに解決するのが、`Document`オブジェクトの `Saved` プロパティです。
—
Savedプロパティの正体:図面の「心」を知る
`Saved` プロパティは、Boolean型(True/False)の値を持ちます。
- True: 図面は保存されている(変更なし)
- False: 図面は変更されている(未保存の状態)
このプロパティを「書き換える」という裏技を使うことで、AutoCADを「この図面はもう保存済みだと認識している」という状態に騙すことができるのです。
実践:変更を破棄して閉じるコード
以下のコードをコピーして、標準モジュールに貼り付けてみてください。
Public Sub CloseWithoutSaving()
‘ 現在アクティブなドキュメントを取得
Dim doc As AcadDocument
Set doc = ThisDrawing
‘ 【重要】SavedをTrueに強制設定する
‘ これにより、AutoCADは「保存すべき変更はない」と判断します
doc.Saved = True
‘ 図面を閉じる(Falseは「変更を保存するか?」という問いへの答えではなく、
‘ 単に「閉じる」という命令です。Saved=Trueのおかげで確認は出ません)
doc.Close False
MsgBox “図面を保存せずに閉じました。”
End Sub
—
初学者が陥りやすい「エラーの罠」
このコードを使う際、いくつか覚えておいてほしい「現場の鉄則」があります。
1. `ThisDrawing` を過信しない
`ThisDrawing` は現在作業中の図面を指しますが、もし複数の図面を開いている場合や、バックグラウンドで別の図面を開いて処理したい場合は、`Application.Documents` コレクションからターゲットを明確に指定する必要があります。
2. ループ処理での落とし穴
複数の図面を一括処理する際、`doc.Close` を実行した瞬間にその `doc` オブジェクトはメモリから破棄されます。ループの最後にこの処理を置かないと、存在しないオブジェクトを操作しようとして「実行時エラー」が発生します。
—
ワンランク上のエンジニアになるために
実務では、単に閉じるだけでなく「エラーが起きた時だけ破棄して閉じる」といったエラーハンドリングと組み合わせることが多いです。
Public Sub SafeCloseExample()
On Error GoTo ErrorHandler
‘ ここで何らかの図面操作を行う
‘ …
Exit Sub
ErrorHandler:
‘ 万が一エラーが起きたら、保存せずに閉じて図面をクリーンにする
ThisDrawing.Saved = True
ThisDrawing.Close False
End Sub
先輩からのアドバイス
`Saved = True` は、いわば「免罪符」です。これを使えば、どんなに図面を弄くり回しても、AutoCADを強制的に「お利口な状態」に戻して終了させることができます。
ただし、本当に大切な変更まで捨ててしまわないよう、ここぞという時にだけ使うようにしてくださいね。
—
まとめ:今日のポイント
- `Saved = True`: AutoCADの「保存しますか?」という警告を回避する魔法。
- 制御の主導権: ダイアログを出さないことが、自動化の安定性を生む。
- 慎重な運用: 便利な機能ほど、使うタイミングをコードで明確に管理する。
ここをクリアすれば、あなたはもう「マクロを動かしている人」から「AutoCADを制御しているエンジニア」へと一歩進んだことになります。
さあ、このコードをあなたのツールボックスに加えて、さらに快適な自動化ライフを送りましょう!
