AutoCAD VBAの深淵:バックアップ戦略における「動的パス制御」の極意
AutoCADのオートメーションにおいて、`ThisDrawing.FullName` を単に文字列として扱うのは、初心者か、あるいは「動くこと」だけを是とするアマチュアの所業だ。
我々のようなシステムアーキテクトがバックアップルーチンを設計する際、考慮すべきは単なる保存処理ではない。ファイルシステムの排他制御、OSレベルのパス正規化、そしてメモリの断片化を許さないオブジェクト管理である。
今回は、実務で遭遇する「既存図面の別名保存」というありふれた要求に対し、堅牢かつ極限まで洗練されたアプローチを伝授する。
—
1. パス操作の「非効率」を排除する
多くの開発者は、`Left`や`Right`関数でパスを切り刻む。だが、パス文字列の操作は常に「ディレクトリ境界の不一致」という地雷を抱えている。
Windows環境においては、`Scripting.FileSystemObject` (FSO) を活用し、オブジェクト指向的にパスを制御するのが鉄則だ。さらに言えば、システム連携を視野に入れるなら、パスの生成は常に「一意性」を担保せねばならない。
2. 【実装コード】堅牢なバックアップ・オートメーション
以下のコードは、単にファイルを保存するだけでなく、メモリリークを防ぎ、予期せぬIOエラーをハンドリングする実務構成となっている。
Option Explicit
‘ 伝説のコード:堅牢な別名保存ルーチン
Public Sub CreateSmartBackup()
Dim doc As AcadDocument
Dim fso As Object
Dim fullPath As String
Dim folderPath As String
Dim baseName As String
Dim ext As String
Dim newPath As String
‘ オブジェクトのセットアップ
Set doc = ThisDrawing
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ 1. 現在のドキュメントが一度も保存されていない場合のガード節
If doc.Path = “” Then
MsgBox “この図面はまだ一度も保存されていません。”, vbCritical
GoTo Cleanup
End If
‘ 2. パスの分解と検証(FSOによる安全な抽出)
fullPath = doc.FullName
folderPath = fso.GetParentFolderName(fullPath)
baseName = fso.GetBaseName(fullPath)
ext = “.” & fso.GetExtensionName(fullPath)
‘ 3. バックアップ用ファイル名の生成(タイムスタンプを付与)
‘ ISO 8601準拠の形式でソート性を担保する
newPath = folderPath & “\” & baseName & “_Backup_” & Format(Now, “yyyyMMdd_HHmmss”) & ext
‘ 4. 保存処理(エラーハンドリングを伴う実行)
On Error Resume Next
doc.SaveAs newPath
If Err.Number <> 0 Then
MsgBox “保存失敗: ” & Err.Description, vbCritical
Else
‘ ユーザーへのフィードバック
Debug.Print “バックアップ完了: ” & newPath
End If
On Error GoTo 0
Cleanup:
‘ 5. メモリの明示的解放(VBAのGCは信用するな)
Set fso = Nothing
Set doc = Nothing
End Sub
—
3. チーフアーキテクトからの「極限の知見」
① なぜ `Format(Now, …)` を使うのか
バックアップファイルに「日付」を入れる際、`yyyy/mm/dd` のような区切り文字を含めないこと。Windowsのファイルシステムにおいて、パスにスラッシュを含めることはナンセンスであり、他のシステム(特にWebベースの管理システム)との連携時に文字コードやエスケープ処理で必ず破綻する。`yyyyMMdd` 形式が、唯一の正解だ。
② メモリ解放の神話と現実
`Set obj = Nothing` は現代のVBAでは必須ではないと語る者もいる。しかし、AutoCADのCOMインターフェースは外部プロセスと密接に絡み合っている。特に大量の図面をバッチ処理する際、この「明示的解放」を怠ると、AutoCADのプロセスがゾンビ化(終了してもメモリ上に残り続ける)するリスクが跳ね上がる。プロは「念のため」ではなく「確実な終了」のために解放を行う。
③ 保存時の「排他制御」について
上記コードはシングルユーザー環境を前提としているが、共有サーバー上に図面がある場合、`SaveAs` が失敗する確率はゼロではない。もし大規模なプロジェクトで展開するなら、`SaveAs` の前に `Dir(newPath)` で同名ファイルの存在確認を行うか、APIを使ってファイル属性をチェックするフェーズを挟む必要がある。
—
最後に
VBAはレガシーと言われることもある。しかし、AutoCADという巨大なCADシステムの核心部に直接触れられるのは、今なおVBAの特権だ。
コードをコピペして満足するな。そのコードが「なぜ」その順序で実行され、どのようなメモリ状態を想定しているのか。そこまで考え抜いて初めて、君は「エンジニア」と名乗る資格を得る。
さあ、次はGUIを構築し、このルーチンをリボンメニューへ組み込む作業だ。健闘を祈る。
