AutoCAD VBAを掌握する極限の知見:図面を閉じる「Close」メソッドの真実 〜SaveChanges引数で制御するプロの設計〜
こんにちは。AutoCAD VBAの世界へようこそ。
マクロの記録機能を使って、「あ、これ自動化できそうだな」と一歩踏み出したあなた。素晴らしいセンスです。しかし、いざ自分でコードを書き始めると、避けては通れない「壁」にぶつかることがあります。
その代表格が、「図面を閉じる際に出てくる、あの忌々しい(失礼!)確認ダイアログ」です。
「プログラムで自動処理しているのに、途中で『変更を保存しますか?』なんて聞いてこないでくれ!」
「逆に、勝手に保存されてしまって、元に戻せなくなった!」
こうした悩みは、すべて`Close`メソッドの第1引数である`SaveChanges`の使い分けを知ることで解決できます。今日は、単なるリファレンスの解説ではなく、実務で「使える」コードを書くための、設計思想としての`Close`メソッドを伝授しましょう。
ここをクリアすれば、あなたのマクロは「単なる記録」から「プロのツール」へと進化しますよ。
1. `Close`メソッドの正体:3つの「閉じ方」
AutoCAD VBAにおいて、図面(`Document`オブジェクト)を閉じる命令は `Document.Close` です。このメソッドには、`SaveChanges` という引数が用意されており、ここに何を渡すかで「図面の運命」が決まります。
結論から言うと、使い分けは以下の3パターンだけです。
| 引数の指定 | 挙動のイメージ | 実務での役割 |
|---|---|---|
| `True` | 「保存して閉じる」 | 自動書き換え、バッチ処理の確定 |
| `False` | 「変更を捨てて閉じる」 | 一時ファイルの破棄、テスト用図面のクリーンアップ |
| (省略) | 「ユーザーに聞く」 | 手動操作に近い、安全策としてのダイアログ表示 |
図解:Closeメソッドの分岐ロジック
graph TD
A[Closeメソッド実行] --> B{SaveChanges引数は?}
B -- True --> C[変更を保存 ➔ 図面を閉じる]
B -- False --> D[変更を破棄 ➔ 図面を閉じる]
B -- 省略 --> E[ダイアログを表示 ➔ ユーザーの判断]
2. 実践コード:ケース別・プロの書き分け術
それでは、実際の業務シーンを想定して、どのようにコードを書くべきか見ていきましょう。
ケースA:大量の図面を一括更新する(強制保存)
「指定したフォルダ内の全図面に、特定のレイヤーを追加して保存する」といったバッチ処理では、ユーザーにいちいち確認させてはいけません。ここでは `True` を使います。
Sub BatchUpdateLayers()
Dim doc As AcadDocument
' ※本来はDocumentManager等で図面をループさせますが、ここでは概念を示します
Set doc = ThisDrawing ' 現在の図面を例にします
On Error GoTo ErrorHandler
' --- ここに図面を加工する処理を書く ---
' 例: レイヤーの追加など
Debug.Print doc.Name & " の更新を完了しました。"
' 【プロの設計】
' 変更を確定させて、ユーザーの介入なしに図面を閉じます。
' これにより、バッチ処理が途中で止まることを防ぎます。
doc.Close True
Exit Sub
ErrorHandler:
MsgBox "エラーが発生しました: " & Err.Description, vbCritical
End Sub
ケースB:一時的な作業用図面を掃除する(変更破棄)
「計算用に一時的に図面を開いたが、計算が終わったので元に戻したくない」という場合。ここでは `False` を使います。
Sub CleanUpTempDrawing()
Dim tempDoc As AcadDocument
' ※仮に、何か処理のために開いた一時的な図面があるとします
Set tempDoc = Documents.Open("C:\Temp\Work_Temp.dwg")
' --- ここで複雑な計算や描画テストを行う ---
' 描画がぐちゃぐちゃになっても問題ありません
' 【プロの設計】
' 「作業内容は一切保存せず、元の状態のまま図面を閉じる」
' これにより、誤って作業用ファイルを汚染することを防ぎます。
tempDoc.Close False
Debug.Print "一時ファイルを安全に破棄しました。"
End Sub
3. 【重要】伝説のエンジニアが教える「陥りやすい罠」
ここからは、初学者が必ずと言っていいほどハマる「落とし穴」についてお話しします。これを知っているだけで、デバッグの時間は半分以下になります。
罠①:ActiveDocumentを閉じようとして自爆する
自分自身(現在動いているマクロが書かれている図面)を `Close` しようとすると、実行中のコードが「自分がどこにいるか分からなくなり」、予期せぬエラーや強制終了を引き起こすことがあります。
対策:
マクロを実行している図面を閉じる場合は、`Application.Close`(※環境による)や、他の図面を先に閉じる設計にするなど、「自分自身を消さない」という意識を持ってください。
罠②:読み取り専用(Read-Only)図面への `True`
読み取り専用で開いた図面に対して `doc.Close True` を実行しようとすると、「保存できません」というエラーが発生します。
対策:
「開いた図面が書き込み可能かどうか」を事前にチェックする、あるいはエラーハンドリング(`On Error Resume Next` など)を適切に組み込むのが、プロの作法です。
まとめ:使い分けの判断基準
最後に、迷った時のための「思考のロードマップ」を授けます。
1. 「この処理の結果は、資産として残すべきか?」
- YES $\rightarrow$ `doc.Close True` (自動化の力)
- NO $\rightarrow$ 次の質問へ
2. 「この図面は、使い終わったらゴミ箱に捨てるようなものか?」
- YES $\rightarrow$ `doc.Close False` (クリーンアップの力)
- NO(ユーザーが中身を確認すべき) $\rightarrow$ `doc.Close` (対話の力)
`Close` メソッドの引数ひとつをとっても、そこに「ユーザーにどう振る舞ってほしいか」という設計思想が宿ります。
これが理解できれば、あなたの書くコードは「ただ動くもの」から「信頼されるツール」へと昇華されます。一歩ずつ、着実に進んでいきましょう。応援していますよ!
