【入門編】【初心者向け】図面を閉じる際の「変更の破棄」をVBAで確実に制御する:Savedプロパティの活用 – AutoCAD VBA解析バイブル

スポンサーリンク

【初心者向け】AutoCAD VBAで図面を閉じる際の「変更の破棄」を確実に制御する:`Saved`プロパティの活用

皆さん、こんにちは! 最強の業務自動化エンジニアを目指す皆さんを、今日も温かくサポートする先輩エンジニアです。AutoCAD VBAの世界へようこそ!

AutoCADを使っていて、図面を閉じようとしたときに「変更を保存しますか?」というダイアログが表示されて、思わず手が止まってしまった経験はありませんか? VBAで処理を自動化したいのに、このダイアログのせいでスクリプトが止まってしまう…そんな歯がゆい思いをしている方もいらっしゃるかもしれませんね。

今日は、この「変更を保存しますか?」ダイアログをVBAでスマートに、そして確実に制御する方法、特に変更を破棄して図面を閉じるテクニックについて深掘りしていきます。ポイントとなるのは、`Document`オブジェクトが持つ`Saved`プロパティです。

ここをクリアすれば、AutoCAD VBAの図面ファイル操作の基本はバッチリですよ! 安心してついてきてくださいね。

—

1. AutoCADは「変更」をどう認識しているの?

まず、`Saved`プロパティの話に入る前に、AutoCADが「この図面は変更されたぞ!」と判断する仕組みを少しだけ理解しておきましょう。

AutoCADはとても賢いソフトウェアです。線を追加したり、色を変えたり、文字を編集したり…図面に対して何かしらの操作を行うと、内部的に「あ、この図面は変更されたな」という情報を記憶しています。これは、いわば「図面が保存された状態から、何か編集が行われた」という状態を示すフラグだと思ってください。

このフラグがオンになっていると、図面を閉じるときに「変更を保存しますか?」というダイアログが表示されるわけです。ユーザーに「せっかくの変更、保存しなくていいの?」と確認してくれているわけですね。

2. VBAからその「変更フラグ」を操作する:`Saved`プロパティ

さて、本題です。VBAから、このAutoCADが内部的に管理している「変更フラグ」を直接読み書きできるのが、`Document`オブジェクトの`Saved`プロパティなんです。

`Saved`プロパティは、ブール型(TrueまたはFalse)の値を持ちます。

  • `True`: 図面は保存済みである、または前回の保存から変更がない状態です。
  • `False`: 図面は未保存である、または前回の保存から変更が行われた状態です。

現在の図面の状態を確認してみよう

まずは、現在の図面が変更されているかどうかをVBAで確認してみましょう。

Sub CheckDocumentSavedStatus()
‘ 現在アクティブな図面(Documentオブジェクト)を取得します。
Dim oDoc As AcadDocument
Set oDoc = ThisDrawing ‘ ThisDrawingは現在実行中の図面を指します

‘ Savedプロパティの値を確認し、メッセージボックスで表示します。
If oDoc.Saved = True Then
MsgBox “現在の図面は保存済み(または変更なし)です。”, vbInformation, “図面の状態”
Else
MsgBox “現在の図面は未保存(変更あり)です。”, vbExclamation, “図面の状態”
End If
End Sub

このコードを実行する前に、何か適当な線を描いてみたり、色を変えてみたりしてから実行してみてください。変更を加えた後なら「未保存」、変更後に保存していれば「保存済み」と表示されるはずです。

3. `Saved`プロパティで「変更の破棄」を制御する具体的な方法

VBAで自動処理を行う際、一時的な操作(例えば、特定の情報を取得するためだけにレイヤーを一時的に表示させたり、オブジェクトの色を一時的に変えたり)を行った後、その変更を図面ファイルに保存したくない、でも「変更を保存しますか?」ダイアログも出したくない、というシーンがよくあります。

そんなときに `Saved` プロパティが非常に強力な味方になります!

シナリオ1:変更を保存せずに図面を閉じる

これは、図面に対して変更を加えたが、その変更は残さずに、元の状態のまま図面を閉じたい場合に利用します。

Sub CloseDocumentWithoutSavingChanges()
‘ 現在アクティブな図面オブジェクトを取得
Dim oDoc As AcadDocument
Set oDoc = ThisDrawing

‘ もし図面が変更されている(Saved = False)場合、
‘ 強制的にSavedプロパティをTrueに設定します。
‘ これにより、AutoCADは「変更がない」と判断します。
If Not oDoc.Saved Then
oDoc.Saved = True
MsgBox “図面の変更状態をリセットしました。”, vbInformation, “情報”
End If

‘ 図面を閉じます。
‘ Closeメソッドの引数にFalseを指定すると、変更の有無に関わらず保存せずに閉じます。
‘ しかし、Saved = True に設定しているので、この引数は実質的に不要になります。
‘ (AutoCADが変更なしと判断するため、保存確認ダイアログも出ません)
oDoc.Close False ‘ 引数 False は「保存せずに閉じる」を意味します

MsgBox “図面は変更を保存せずに閉じられました。”, vbInformation, “完了”
End Sub

解説:
このコードの肝は `oDoc.Saved = True` です。図面が変更された状態(`Saved = False`)であっても、このVBAコードで強制的に `True` に設定することで、AutoCADは「この図面には、保存すべき変更はない」と判断します。その結果、図面を閉じるときに「変更を保存しますか?」というダイアログは表示されなくなります。

`oDoc.Close False` は「保存せずに閉じる」という意味ですが、`oDoc.Saved = True` のおかげで、AutoCADは既に「変更なし」と認識しているため、ダイアログは出ません。

シナリオ2:変更を保存して図面を閉じる

これは、図面に加えた変更をファイルに保存し、その後図面を閉じる場合です。

Sub CloseDocumentAndSavingChanges()
‘ 現在アクティブな図面オブジェクトを取得
Dim oDoc As AcadDocument
Set oDoc = ThisDrawing

‘ もし図面が変更されている(Saved = False)場合、
‘ Saveメソッドで変更を保存します。
If Not oDoc.Saved Then
oDoc.Save ‘ 変更を現在のファイルに保存します
MsgBox “図面の変更を保存しました。”, vbInformation, “情報”
End If

‘ 図面を閉じます。
‘ Closeメソッドの引数にTrueを指定すると、変更があれば保存して閉じます。
‘ Saved = True の場合はそのまま閉じます。
oDoc.Close True ‘ 引数 True は「変更があれば保存して閉じる」を意味します

MsgBox “図面は変更を保存して閉じられました。”, vbInformation, “完了”
End Sub

解説:
こちらは比較的シンプルですね。`oDoc.Save` で明示的に保存を行うことで、`Saved` プロパティが `True` になり、その後 `oDoc.Close True` でダイアログなしに図面が閉じられます。

シナリオ3:VBAで行った一時的な変更を破棄し、ダイアログも出さない

これが `Saved` プロパティの最もスマートな使い方の一つかもしれません。VBAで一時的に図面をいじったが、それをファイルに残したくなく、かつダイアログも出してユーザーの操作を止めさせたくない場合です。

例えば、ある情報を取得するために一時的に特定の画層を表示させたり、オブジェクトをハイライト表示させたりする処理をVBAで行ったとします。その後、元の状態に戻し、これらの変更は保存したくない、という状況です。

Sub ResetChangesWithoutDialog()
‘ 現在アクティブな図面オブジェクトを取得
Dim oDoc As AcadDocument
Set oDoc = ThisDrawing

‘ ここに、例えば一時的な描画やレイヤー操作など、
‘ 図面を「変更状態」にするVBAコードが入るとします。
‘ —————————————————-
‘ 例: 一時的に新しい円を描画する
Dim Center(0 To 2) As Double
Dim Radius As Double
Center(0) = 0: Center(1) = 0: Center(2) = 0 ‘ 中心座標
Radius = 10 ‘ 半径
Dim oCircle As AcadCircle
Set oCircle = oDoc.ModelSpace.AddCircle(Center, Radius)
oCircle.Color = acRed ‘ 赤色にする
oDoc.Regen acAllViewports ‘ 画面を再表示

MsgBox “一時的に赤い円が描かれました。図面は変更状態です。”, vbInformation, “一時操作”
‘ —————————————————-

‘ ここでSavedプロパティを確認してみましょう
If oDoc.Saved = False Then
MsgBox “現在の図面は未保存(変更あり)状態です。”, vbExclamation, “状態確認”
Else
MsgBox “現在の図面は保存済み(変更なし)状態です。”, vbInformation, “状態確認”
End If

‘ VBAで行った一時的な変更を破棄し、ダイアログを出さずに状態をリセットする
‘ これにより、AutoCADは「変更がない」と判断し、ダイアログは表示されません。
oDoc.Saved = True

MsgBox “図面の変更状態をリセットしました。この後閉じてもダイアログは出ません。”, vbInformation, “完了”

‘ 例えば、この後図面を閉じる処理を続けることができます。
‘ oDoc.Close False ‘ もし閉じる必要があるなら
End Sub

解説:
このシナリオでは、`oDoc.Saved = True` を実行するだけで、図面ファイル自体に変更を加えることなく、AutoCADの内部的な「変更フラグ」をリセットしています。これにより、ユーザーが図面を閉じる際に「変更を保存しますか?」というダイアログが表示されるのを防ぎ、あたかも何も変更がなかったかのように振る舞わせることができます。

これは、プログラムが自動的に行った一時的な変更を、ユーザーの作業に影響を与えずに「なかったこと」にするための、非常に強力でスマートな方法です。

4. `Saved`プロパティと`DisplayAlerts = False`、どちらを使うべき?

VBAでダイアログを抑制する方法として、`Application.DisplayAlerts = False` というおまじないを目にしたことがあるかもしれません。これは、AutoCADの警告や確認ダイアログ全般を一時的に抑制する便利な機能です。

しかし、`Saved`プロパティと`DisplayAlerts = False`には、以下のような明確な違いがあります。

  • `Application.DisplayAlerts = False`:
  • 制御が粗い。保存確認ダイアログだけでなく、他のエラーメッセージや警告ダイアログも抑制してしまう可能性があります。
  • 処理の開始時に`False`に設定し、処理の終了時に必ず`True`に戻す必要があります。戻し忘れると、ユーザーが手動でAutoCADを操作する際にもダイアログが表示されず、混乱を招くことがあります。
  • `Document.Saved = True`:
  • 制御がピンポイント。図面の「変更状態」に特化して操作します。他の警告ダイアログには影響しません。
  • 特定の図面に対してのみ有効であり、他の開いている図面には影響を与えません。

結論として:
図面の保存状態(「変更を保存しますか?」ダイアログ)を制御したいのであれば、`Saved`プロパティを使うのが最も推奨される方法です。より意図が明確で、他の挙動に影響を与えにくい、洗練されたアプローチと言えます。

`DisplayAlerts = False`は、他に方法がない場合や、本当にAutoCAD全体のダイアログを一時的に抑制したい場合に限定して使うのが良いでしょう。

5. `Saved`プロパティを使う上での注意点

`Saved`プロパティは非常に強力ですが、使い方を誤ると、意図しないデータの消失を招く可能性もあります。以下の点に注意して活用してください。

1. 意図しない変更の破棄に注意!
`oDoc.Saved = True` は、ユーザーやVBAが加えた変更を「なかったこと」にする強力なコマンドです。もし、ユーザーが手動で重要な編集を行ったにも関わらず、VBAがそれを知らずに `Saved = True` を実行して図面を閉じてしまうと、その変更は永遠に失われてしまいます。
必ず、「この変更は本当に破棄していいのか」を明確に意識した上で使用してください。

2. `Saved`プロパティは「図面ごと」に管理される
`Saved`プロパティは、`AcadDocument`オブジェクト(つまり、開いているそれぞれの図面)に紐付いています。複数の図面を開いている場合、どの図面の`Saved`プロパティを操作しているのかを意識しましょう。

3. 保存済みの図面に対して`Saved = False`を設定することも可能
もし、`oDoc.Saved = False`と設定すると、たとえ図面が保存済みであっても、AutoCADは「変更あり」と認識するようになります。 これを意図的に使うケースは稀かもしれませんが、この挙動も頭の片隅に入れておくと良いでしょう。

まとめ:`Saved`プロパティで図面操作をマスターしよう!

いかがでしたでしょうか? 今日は、AutoCAD VBAで図面を閉じる際の「変更を保存しますか?」ダイアログを、`Document`オブジェクトの`Saved`プロパティを使ってスマートに制御する方法を学びました。

  • `Saved`プロパティは、図面が保存済みか(`True`)、変更があるか(`False`)を示すフラグです。
  • `oDoc.Saved = True`と設定することで、図面への変更を破棄し、ダイアログなしに図面を閉じることが可能になります。
  • `DisplayAlerts = False`よりも、図面の保存状態の制御には`Saved`プロパティを使う方が推奨されます。

この知識を身につければ、あなたのVBAスクリプトは、もっと柔軟に、もっと確実にAutoCADの図面を操作できるようになるはずです。自動化の幅がグッと広がる強力なツールですから、ぜひ皆さんのプロジェクトに役立ててみてくださいね!

それでは、また次の記事でお会いしましょう! VBAの旅を楽しんでください!

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