【AutoCAD VBA】「保存しますか?」の呪縛を解く。図面制御の極意
AutoCADの自動化において、最も初歩的でありながら、最も多くのエンジニアが「泥沼」に足を踏み入れるポイントがある。それが「図面のクローズ制御」だ。
「`ThisDrawing.Close`を呼んだら保存ダイアログが出てスクリプトが止まった」。そんな報告が上がっているうちは、まだお前はアマチュアだ。業務自動化において、ユーザーの介在を許すことは、プログラムの死を意味する。
今日は、AutoCADのドキュメントライフサイクルを完全に掌握し、図面のオープン・クローズを意のままに操るための「実戦的アーキテクチャ」を伝授する。
—
1. なぜ `Close` メソッドだけでは不十分なのか
初心者は往々にして、`ThisDrawing.Close` を叩けばすべて解決すると思い込んでいる。だが、AutoCADのオブジェクトモデルは、単純な手続き型言語のようには動かない。
`Close` メソッドには引数が存在する。この引数の理解こそが、堅牢なツールを作るための第一歩だ。
- SaveChange (Boolean): 保存するかどうか。
- Filename (String): 保存先のパス。
この2つを適切に制御せず、場当たり的に `SendKeys` で「N」を送信するようなコードは今すぐ捨てろ。それは運用中にWindowsのフォーカスが外れた瞬間に崩壊する、脆弱なコードだ。
—
2. 実戦的プロダクションコード:完全制御の作法
以下のコードは、図面を一切のダイアログを表示させずに「強制保存」または「破棄」して閉じるためのテンプレートだ。これをそのままモジュールに組み込め。
‘ —————————————————————————
‘ @brief 図面をダイアログ無しで安全に閉じるプロシージャ
‘ @param doc 対象となるAcadDocumentオブジェクト
‘ @param saveChanges True:保存して閉じる, False:保存せずに閉じる
‘ —————————————————————————
Public Sub CloseDocumentSafely(doc As AcadDocument, saveChanges As Boolean)
On Error GoTo ErrorHandler
‘ 保存が必要な場合、かつ既にファイル名が定義されているかを確認
If saveChanges Then
‘ 保存済み図面なら上書き、未保存なら名前を付けて保存のハンドリングが必要
‘ ここでは簡略化のためCloseの引数を使用
doc.Close SaveChanges:=True
Else
‘ 変更を破棄して閉じる
doc.Close SaveChanges:=False
End If
Exit Sub
ErrorHandler:
‘ ここでログ出力やエラーハンドリングを行う
Debug.Print “Error ” & Err.Number & “: ” & Err.Description
End Sub
なぜこの書き方なのか
- オブジェクト引数化: `ThisDrawing` に依存せず、`AcadDocument` オブジェクトを引数に取ることで、マルチドキュメント環境(MDI)でも汎用的に使える設計にしている。
- 明示的なBoolean指定: 曖昧さを排除し、コードの可読性を高めることで保守性を確保している。
—
3. 現場で生き残るための「鉄則」
現場の業務自動化ツールを組む際、以下の注意点を蔑ろにすると、必ず後で大規模な手戻りが発生する。
① 未保存図面(名前が未定)の罠
図面が一度も保存されていない状態で `doc.Close True` を実行すると、AutoCADは名前を付けるためのダイアログを表示しようとする。これがスクリプト停止の要因だ。
解決策: `doc.FullName` プロパティが空文字でないかを確認し、空であれば `doc.SaveAs` で一時フォルダに退避させてから閉じるというロジックを挟め。
② イベントドリブンを過信するな
`BeginClose` イベントなどで制御を試みる者がいるが、あまりに複雑なロジックを詰め込むと、AutoCADの安定性を損なう。クローズ制御は、「メインの処理フローの中で完結させる」のが、最も堅牢だ。
③ データベース連携時のトランザクション管理
もしExcelやSQL Serverと図面情報を同期させているなら、`Close` を呼ぶ前に必ず「同期完了フラグ」を立てろ。図面が閉じられた後に「保存されたか否か」の判定がズレると、データ整合性が崩壊する。DBの更新とファイル操作は、必ずアトミック(不可分)に扱え。
—
最後に:エンジニアとしての矜持
「動けばいい」コードは誰にでも書ける。しかし、AutoCADが裏で何をしているか、メモリ上でどうオブジェクトが解放されているかを想像しながら書くコードは、時を超えて生き残る。
お前がこれから作るツールが、誰かの残業をゼロにするのか、それともバグ対応でさらに苦しめるのか。それはこの数行のクローズ処理を、どれだけ真摯に設計したかにかかっている。
さあ、コードを磨け。完璧な自動化の世界へようこそ。
