AutoCAD VBAを掌握せよ:堅牢な「世代管理バックアップ」の実装戦略
AutoCADの標準機能である「SAVEBACK(.bak)」だけでは、現代の複雑な設計プロセスを救うにはあまりに脆弱だ。上書き保存の瞬間、過去の履歴は跡形もなく消え去る。
多くのエンジニアが「ファイル名_日付」で手動コピーを行っているが、「手動」という言葉は、プログラミングの世界では「ヒューマンエラー」と同義語である。
今日は、AutoCADの保存プロセスに介入し、確実かつ安全に世代管理を行うための「実務レベルのコードアーキテクチャ」を伝授する。
—
1. なぜ「単純なファイルコピー」ではダメなのか
初心者は、`FileCopy`コマンドを安直に使いがちだ。しかし、実務の現場では以下の問題が必ず発生する。
- 排他制御の欠如: 保存中(SaveAs中)にVBAが割り込むと、ファイルのロックで例外が発生する。
- パスの不整合: 相対パスやネットワークドライブ上の長いパスを扱う際、文字列操作のミスで「ファイルが見つからない」エラーが頻発する。
- ディレクトリの未作成: バックアップフォルダが存在しない場合、コードは即座に停止する。
我々が目指すのは、「例外を握りつぶす」のではなく「例外を発生させない」設計だ。
—
2. プロダクション品質のバックアップロジック
以下は、`AcadDocument`のイベントを利用し、保存時に自動で特定フォルダへ世代管理コピーを生成するクラスモジュールの実装例だ。
実装のポイント
- イベント駆動: `AcadDocument`の`BeginSave`イベントをフックし、保存と同期させる。
- 遅延評価と検証: ファイル名とパスを厳密に分割し、OSが受け入れ可能な形式か検証する。
- 再帰的なフォルダ生成: バックアップ先が存在しなければ、その場で作成する。
‘ —————————————————————————
‘ Class: clsBackupManager
‘ 概要: 保存時に自動でバックアップを作成するイベントハンドラ
‘ —————————————————————————
Option Explicit
Public WithEvents TargetDoc As AcadDocument
Private Sub TargetDoc_BeginSave(ByVal FileName As String)
On Error GoTo ErrorHandler
‘ バックアップの保存先(環境に応じて変更せよ)
Const BACKUP_ROOT As String = “C:\CAD_Backups\”
Dim fso As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ パス操作の堅牢化
Dim folderPath As String
folderPath = BACKUP_ROOT & Format(Date, “yyyyMMdd”) & “\”
‘ フォルダが存在しなければ作成
If Not fso.FolderExists(folderPath) Then
fso.CreateFolder folderPath
End If
‘ ファイル名にタイムスタンプを付与
Dim baseName As String
baseName = fso.GetBaseName(FileName)
Dim destPath As String
destPath = folderPath & baseName & “_” & Format(Now, “HHmmss”) & “.dwg”
‘ コピー実行(既存の場合は上書き許可)
fso.CopyFile FileName, destPath, True
Debug.Print “Backup created: ” & destPath
Exit Sub
ErrorHandler:
‘ 致命的なエラーはログに出力し、保存プロセスそのものを止めない配慮が必要
MsgBox “バックアップ作成中にエラーが発生しました: ” & Err.Description, vbCritical
End Sub
—
3. 実務で「生き残る」ための設計指針
このコードをただコピペして終わりではない。次の3つの観点を忘れるな。
① 「保存中」のタイミングを理解する
`BeginSave`イベントは、AutoCADがディスク書き込みを開始する直前に発行される。もしバックアップ処理が重すぎれば、AutoCADのUIが一時的にフリーズし、ユーザーにストレスを与える。ファイル容量が大きい場合は、非同期処理や軽量なコピーメソッドを選択することが肝要だ。
② 循環参照を防ぐ
このロジックをクラス化し、起動時にグローバル変数としてロードせよ。標準モジュールにべた書きするのは、コードの可読性を下げ、デバッグ難易度を跳ね上げるだけだ。
③ クリーンアップの実装
無制限にバックアップを増やせば、HDDは数ヶ月で飽和する。「30日経過した古いバックアップを削除する」といった保守スクリプトを、このバックアップロジックの裏側にセットで用意しておくのが、プロフェッショナルの仕事だ。
—
結びに代えて
AutoCAD VBAはレガシーな言語と思われがちだが、そのオブジェクトモデルは極めて洗練されている。設計者が「自動化」を「手抜き」ではなく「リスク管理」の手段として捉え始めたとき、その業務効率は劇的に向上する。
まずはこのコードを実装し、設計の現場に「絶対的な安心感」を導入してほしい。次のステップとして、バックアップをクラウドストレージと同期させたり、ログをDBに記録して「誰がいつ上書きしたか」を追跡する仕組みを構築するのも面白いだろう。
コードは嘘をつかない。設計の甘さが、バグという形で帰ってくるだけだ。 常に堅牢な設計を心がけろ。
