【入門編】【初心者向け】図面を閉じる際の「SaveChanges」引数の徹底使い分け:ユーザーへの確認を出す場合と出さない場合のコード設計 – AutoCAD VBA解析バイブル

スポンサーリンク
スポンサーリンク

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` メソッドの引数ひとつをとっても、そこに「ユーザーにどう振る舞ってほしいか」という設計思想が宿ります。

これが理解できれば、あなたの書くコードは「ただ動くもの」から「信頼されるツール」へと昇華されます。一歩ずつ、着実に進んでいきましょう。応援していますよ!

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