【テクニカル・上級編】【実務中級者向け】保存時に自動で「バックアップフォルダ」へコピーを退避させる世代管理VBA – AutoCAD VBA解析バイブル

スポンサーリンク

AutoCAD VBAの深淵:堅牢な世代管理システムを構築せよ

AutoCADのAPIを操作する際、多くの開発者は「単に動くコード」を書くことに終始する。しかし、大規模設計プロジェクトにおいて最も恐ろしいのは、システムが止まることではない。「意図せぬ上書き保存によって、数日前の成果物が消滅すること」だ。

今回は、AutoCAD VBAのイベント駆動モデルを極め、堅牢なバックアップ世代管理システムを構築するための「本物のコード」を提示する。これは単なるスクリプトではない。AutoCADのメモリ管理、イベントライフサイクル、そしてWindows OSのファイルI/Oの特性を理解した者だけが到達できる防壁だ。

—

1. なぜ「SaveAs」をフックするのか

AutoCADの標準バックアップ機能(`.bak`ファイル)は、あくまで「直前の一世代」しか保持できない。現場の要求はもっとシビアだ。タイムスタンプを付与したアーカイブを、専用の領域に自動生成する。

ここで重要なのは、VBAの `Document` オブジェクトのイベント `DocumentBeginSave` を正確に捉えることだ。このイベントをハンドリングする際、「再帰的なイベント呼び出し」を回避するガードロジックこそが、システム安定運用の分水嶺となる。

2. 極限のバックアップ・アーキテクチャ

以下のコードは、単にファイルをコピーするのではない。Windows APIの `FileSystemObject` を使いつつ、オブジェクトのライフサイクルを厳密に管理する。

‘ Class Module: clsAppEvents
Option Explicit

‘ Applicationオブジェクトのイベントを監視
Public WithEvents App As AcadApplication

Private Sub App_DocumentBeginSave(ByVal pDoc As Object, ByVal FileName As String)
On Error GoTo ErrHandler

‘ バックアップの保存先(環境変数やレジストリで管理することを推奨)
Const BACKUP_ROOT As String = “C:\CAD_Backups\”
Dim fso As Object
Dim backupPath As String
Dim timeStamp As String

‘ タイムスタンプ生成 (ISO 8601準拠)
timeStamp = Format(Now, “yyyyMMdd_HHmmss”)

‘ ファイルパスの構築
Set fso = CreateObject(“Scripting.FileSystemObject”)
Dim fileNameOnly As String
fileNameOnly = fso.GetBaseName(FileName)

‘ バックアップフォルダの存在確認と作成
If Not fso.FolderExists(BACKUP_ROOT) Then fso.CreateFolder (BACKUP_ROOT)

backupPath = BACKUP_ROOT & fileNameOnly & “_” & timeStamp & “.dwg”

‘ ファイルのコピー実行 (オーバーライトを許可)
‘ 巨大なDWGファイルを扱うため、エラーハンドリングを厳重に
fso.CopyFile FileName, backupPath, True

‘ メモリ最適化:明示的なオブジェクト解放
Set fso = Nothing
Exit Sub

ErrHandler:
‘ 致命的なエラーでもCAD本体を落とさないためのガード
Debug.Print “Backup Failed: ” & Err.Description
Set fso = Nothing
End Sub

3. チーフアーキテクトからの助言:技術的要諦

この実装には、実務で生き残るための3つの知見が込められている。

① オブジェクトの解放(Memory Management)

VBAのガベージコレクションを信用してはいけない。`Set fso = Nothing` を記述するのは作法ではなく、メモリリークを未然に防ぐための防御壁だ。特に長期間AutoCADを立ち上げっぱなしにする設計者の環境では、この一行が数百MBのメモリを救う。

② イベントの再帰呼び出し(Infinite Loop Prevention)

`DocumentBeginSave` 内で `SaveAs` を呼ぶような愚を犯してはならない。もしバックアップ処理でエラーが起きた場合、エラーハンドラが正しく終了処理を行わないと、AutoCADが「保存中」のままフリーズする。`On Error GoTo` を活用し、常にCAD本体の制御権をユーザーに戻す設計を徹底せよ。

③ パス区切りとWindows API

実務環境では、ファイルパスに特殊文字や深いネストが含まれることがある。`fso.GetBaseName` を使うのは、拡張子の判定ミスを防ぐための定石だ。また、大規模環境ではバックアップ先をネットワークドライブにするケースが多い。その際は、UNCパス(`\\Server\Share\…`)への対応を必ずテストすること。

結論:保守可能なシステムのために

このコードをそのままコピペして終わりにするな。貴方が所属する組織のファイルサーバーポリシーに合わせて、バックアップ先のパスを動的に取得するロジック(環境変数 `ENVIRON` の活用など)を付加すべきだ。

伝説的なエンジニアとは、コードを書く者ではない。「何が起きても、データが守られる仕組み」を設計できる者のことを言う。さあ、貴方の現場の安全を、貴方の技術で担保してほしい。

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