【テクニカル・上級編】【初心者向け】図面を閉じる前に「変更を破棄」を確実に実行:Savedプロパティの活用法 – AutoCAD VBA解析バイブル

スポンサーリンク

序論:なぜ「変更を破棄」が自動化の成否を分けるのか

自動化エンジニアとしてのキャリアを積めば、誰もが一度は「予期せぬダイアログ」にシステムを殺された経験を持つはずだ。
数百、数千の図面をバッチ処理する際、最も恐れるべきはランタイムエラーではない。ユーザーの介在を求める「変更を保存しますか?」という、あの沈黙のダイアログだ。

AutoCAD VBAにおいて、図面を閉じる処理は一見単純に見える。しかし、その背後にはCOMオブジェクトのライフサイクル、メモリ空間の管理、そして「図面が変更された」と見なす内部フラグの制御という、深淵なロジックが横たわっている。

今回は、図面を保存せずに閉じる——すなわち「変更を確実に破棄」するための決定打である`Saved`プロパティの活用法と、それを支えるアーキテクチャの本質について解説する。

—

1. `Saved`プロパティの真実:AutoCADを欺く技術

`Document.Saved`プロパティは、Boolean型のフラグだ。図面が最後に保存されてから変更が加えられたかどうかを保持している。
ここで重要なのは、このプロパティは書き込み可能であるという点だ。

通常、図面内のエンティティを一つでも操作(Move, Add, Delete)すれば、このフラグは自動的に `False` になる。AutoCADはこのフラグを見て、終了時に保存ダイアログを出すべきか判断する。

エンジニアが取るべき戦略は、「実際には変更されているが、AutoCADに対して『この図面は既に保存済みである』と嘘をつく」ことだ。

基本的な実装パターン

Public Sub DiscardChangesAndClose()
Dim doc As AcadDocument
Set doc = ThisDrawing

‘ 変更が加えられていても、保存済みとしてマークする
‘ これにより、Closeメソッド呼び出し時のダイアログを抑制する
doc.Saved = True

‘ 第1引数をFalseにすることで、保存せずに閉じる
doc.Close False
End Sub

—

2. 決定論的なクローズ処理:`Documents`コレクションの走査

単一の図面ではなく、開いている全ての図面を処理する場合、`Documents`コレクションの制御には細心の注意が必要だ。コレクションを回しながら自身をCloseすると、インデックスが狂い、処理漏れやアクセス違反(Access Violation)を招く。

シニアエンジニアは、コレクションを逆順で回るか、あるいは特定の条件を満たすオブジェクトを安全に特定する。

実戦的な一括破棄コード

Public Sub ForceCloseAllDocuments()
Dim i As Integer
Dim doc As AcadDocument

‘ 逆順でループを回すのが、動的コレクション操作の定石
For i = Documents.Count – 1 To 0 Step -1
Set doc = Documents.Item(i)

‘ アクティブな図面(ThisDrawing)や読み取り専用図面への配慮
If Not doc.FullName = “” Then
‘ 内部フラグを「保存済み」に書き換え
doc.Saved = True
‘ 保存を伴わずに閉じる
doc.Close False

‘ オブジェクトの明示的解放(COM参照カウンタのデクリメント)
Set doc = Nothing
End If
Next i
End Sub

—

3. 深層の最適化:メモリとCOMスタックの管理

AutoCAD VBAは、背後でCOM(Component Object Model)を利用している。`Close`メソッドを呼んだ後も、オブジェクト変数がメモリ上に残っていると、AutoCADのプロセス(acad.exe)が正常に終了しなかったり、ゾンビプロセスとしてメモリを食いつぶす原因となる。

参照の切断とガベージコレクションの誘発

VBAには明示的なデストラクタがない。そのため、`Set doc = Nothing` は単なるマナーではなく、大規模処理における「必須の儀式」である。

また、Windows APIを利用して、AutoCADのメッセージループを強制的に回す、あるいは描画更新を完全に停止させることで、クローズ処理のパフォーマンスは劇的に向上する。

‘ Windows APIによる描画更新の抑制(パフォーマンス向上)
Private Declare PtrSafe Function LockWindowUpdate Lib “user32” (ByVal hwndLock As LongPtr) As Long

Public Sub HighSpeedClose()
On Error Resume Next
‘ AutoCADのメインウィンドウハンドルを取得して描画をロック
LockWindowUpdate Application.hwnd

‘ — クローズ処理実行 —
ThisDrawing.Saved = True
ThisDrawing.Close False

‘ ロック解除
LockWindowUpdate 0
End Sub

—

4. システム間連携における「不揮発性」の維持

社内システム管理者やシニアエンジニアが設計する際、最も配慮すべきは「データの整合性」だ。
「変更を破棄して閉じる」という操作が必要になるのは、主に以下のようなケースである。

1. 情報の抽出(データマイニング): 図面からBOMや座標データを抜くだけの処理。
2. 一時的な変換処理: PDF出力やDXF書き出しのために一時的に画層状態を変えた場合。
3. 整合性チェック: エラー検出し、修正せずにレポートだけ出す場合。

これらの処理において、誤ってオリジナル図面を上書き保存することは、システム上の致命的な「汚染」を意味する。`Saved = True` の活用は、オリジナルデータの不揮発性を担保するための防波堤なのだ。

—

5. 結論:プロフェッショナルの矜持

`Saved`プロパティを操作するということは、AutoCADの標準的な動作をオーバーライドすることを意味する。
初心者は単に「ダイアログを出さない魔法」として使うかもしれない。しかし、この記事を読んでいる貴殿には、これが「オブジェクトのステート管理」という高度な設計思想の一部であることを理解してほしい。

  • 状態の偽装 (`Saved = True`)
  • 非同期的な安全停止 (`Close False`)
  • 参照の確実な破棄 (`Set = Nothing`)

この三位一体の実装こそが、数千枚の図面を無人で処理し、一分一秒のダウンタイムも許されないプロフェッショナルの現場を支えるのである。

レガシーなVBAであっても、その振る舞いを完全に掌握すれば、最新の言語に引けを取らない堅牢なシステムを構築できる。道具を呪う前に、その真理を穿て。それがアーキテクトとしての道である。

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