【入門編】【初心者向け】Closeメソッドの引数「SaveChanges」徹底攻略:保存漏れと意図しない上書きを防ぐ – AutoCAD VBA解析バイブル

スポンサーリンク

こんにちは!AutoCAD VBAの世界へようこそ。
私はこれまで数多くの業務自動化システムを構築してきましたが、初学者のあなたが最初に直面する「小さな、だけど絶対に避けて通れない壁」を今日はお話しします。

それが、図面を閉じるときに使う`Close`メソッドの引数「`SaveChanges`(セーブ・チェンジズ)」です。

「マクロの記録」から一歩踏み出し、自分だけのVBAコードを書き始めると、必ずこんな疑問やトラブルにぶつかります。

  • 「あれ? 気づいたら元の図面が変な上書きをされて消えてしまった……!」
  • 「プログラムの途中で『変更を保存しますか?』というダイアログが出て、処理が止まってしまう……!」

ここをクリアすれば、あなたのAutoCAD VBAスキルは「おもちゃの自動化」から「プロの現場で使える実用レベル」に一気にランクアップします。
優しく、そして本質からしっかりと解説していきますので、リラックスしてついてきてくださいね。

—

1. なぜ「Closeメソッド」で事故が起きるのか?

私たちが普段、AutoCADで作業をしていて図面を閉じようとするとき、未保存の変更があれば「変更を保存しますか?」というお節介な(しかし時には命を救う)ダイアログが出ますよね。

しかし、VBA(マクロ)で図面を自動処理している最中に、このダイアログが出て画面がフリーズ(停止)してしまったらどうでしょう?
夜間バッチで100枚の図面を処理させようと仕掛けて帰ったのに、最初の1枚目のダイアログで朝までストップしていた……なんて笑えない事故が、実務の世界では本当によく起きます。

これを防ぐのが、`Document`オブジェクトの`Close`メソッドが持つ`SaveChanges`という引数です。

魔法のスイッチ `True` と `False`

`Close`メソッドは、次のように書きます。

object.Close [SaveChanges, [FileName], [PromptForSaveNames]]

この中の第一引数 `SaveChanges` に何を渡すかで、AutoCADの挙動が劇的に変わります。

  • `True` を指定した場合

「問答無用で保存して閉じる」

  • `False` を指定した場合

「変更を一切破棄して(保存せずに)閉じる」

  • 省略した場合(または `PromptForSaveNames` との組み合わせ)

あの厄介なダイアログが画面に飛び出してきます。

—

2. 【図解風】実務における3つの選択パターン

現場でどのように使い分けるべきか、頭の中でイメージできるように整理しましょう。

[ 図面を閉じるシチュエーション ]
├── 1. データをプログラムで加工・上書き保存したい!
│ └─→ 【 Close True 】 (安全に保存して終了)
├── 2. 閲覧や一時的なデータ抽出だけで、元図面を汚したくない!
│ └─→ 【 Close False 】 (変更を破棄して終了)
└── 3. 人間の目で最終確認してから保存するか決めたい
└─→ 【 引数を省略 】 (確認ダイアログを出す)
└─ ※ただし、バッチ処理なら絶対にダイアログを出してはいけません!

プログラミング初学者がやりがちなのが、意図せず `Close True` を使ってしまい、テスト中のめちゃくちゃな修正データが元の図面に上書きされてしまう悲劇です。逆に、保存したつもりが `Close False` で全部消えていた、というのも定番の失敗です。

—

3. 実践!コピペで使える「安全な図面クローズ」マクロ

それでは、実際にVBAエディタ(VBE)に貼り付けて動かせるサンプルコードを見てみましょう。
ここでは、現在開いている図面を「保存せずに閉じるパターン」と「保存して閉じるパターン」を安全に制御するコードを記述します。

Sub SafeCloseDrawingExample()
Dim acadDoc As AcadDocument
Set acadDoc = ThisDrawing.Application.ActiveDocument

‘ 【重要】ユーザーに確認を促すメッセージボックス
Dim userResponse As VbMsgBoxResult
userResponse = MsgBox(“現在の図面を【保存せず】に閉じますか?” & vbCrLf & _
“(「いいえ」を選ぶと保存して閉じます)”, _
vbYesNo + vbQuestion, “AutoCAD VBA 終了テスト”)

If userResponse = vbYes Then
‘ —————————————————-
‘ パターンA:変更を破棄してサイレントクローズ (False)
‘ —————————————————-
‘ 引数に False を指定することで、ダイアログを出さずに即座に閉じます。
‘ ※ 今回行った変更はすべて消えます。
acadDoc.Close False

MsgBox “図面を保存せずに閉じました。”, vbInformation

Else
‘ —————————————————-
‘ パターンB:変更を保存してサイレントクローズ (True)
‘ —————————————————-
‘ 引数に True を指定することで、現在の状態で上書き保存して閉じます。
acadDoc.Close True

MsgBox “図面を保存して閉じました。”, vbInformation

End If
End Sub

コードの解説とエンジニアの知見

  • `ThisDrawing.Application.ActiveDocument`: 今まさに操作しているアクティブな図面をしっかりと変数に捕まえています。
  • `acadDoc.Close False`: この一行が、画面を一切汚さず(ダイアログを出さず)、強制的に変更を破棄して閉じる「サイレント終了」の核心です。
  • 業務自動化(バッチ処理)の基本は、「人間を画面の前からいかに排除するか」です。ダイアログを出さない(=サイレント制御する)技術は、実務でマクロを組む際の必須スキルになります。

—

4. 陥りやすい罠:「あれ? オブジェクトがありません」エラーの正体

`Close`メソッドを使いこなせるようになると、次に9割の人がこのエラーに遭遇します。

> 実行時エラー ‘-2147467259 (80004005)’:
> オブジェクトがありません(または自動化エラーです)

このエラーが出る原因は何だと思いますか?

答えは、「すでに閉じられた図面(またはそのオブジェクト)に対して、もう一度何か操作をしようとしたから」です。

VBAの世界では、`acadDoc.Close True` を実行した瞬間、その図面オブジェクトのメモリ上のライフサイクルは終了し、消滅します。
それにもかかわらず、その直後の行で `acadDoc.Name` などと図面の名前を取得しようとすると、AutoCADは「そんな図面もう存在しないよ!」と怒り出すわけです。

対策:閉じた後の変数には「何もない」を代入する

プログラミングの作法として、図面を閉じたらその変数は速やかに解放(リセット)してあげるのが、ワンランク上のエンジニアの流儀です。

‘ 図面を閉じる
acadDoc.Close False

‘ 変数を空っぽにする
Set acadDoc = Nothing

こうすることで、メモリの無駄遣いも防げますし、「うっかり存在しない図面を操作してしまうバグ」を綺麗に回避できます。

—

まとめ:ここをクリアすれば、基本はバッチリ!

お疲れ様でした!今回は `Close`メソッドの引数 `SaveChanges` を通じて、図面のライフサイクル管理とサイレント制御の基本を徹底的に解説しました。

  • `Close True`: 確実に保存して閉じる(上書き注意!)
  • `Close False`: 変更を破棄して安全に閉じる
  • 引数省略: ダイアログが出る(自動化では原則タブー)
  • 閉じた後の変数管理: `Set ○○ = Nothing` を忘れない

ここをしっかりと理解できたあなたなら、もう「マクロの記録をただ再生するだけの人」ではありません。自分の意図通りにAutoCADを裏側で自在にコントロールできる「オートメーション・エンジニア」の第一歩を踏み出しています。

明日からの図面整理やバッチ処理の自動化に、ぜひこの知見を活かしてくださいね。
それでは、また次の極限の知見でお会いしましょう!

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