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

スポンサーリンク

こんにちは。AutoCADの自動化という深淵な世界へようこそ。

「マクロの記録」から一歩踏み出し、自分の手でCADを自在に操る領域へ足を踏み入れたあなたを、私は心から歓迎します。

業務でAutoCADを使っていると、一度は経験するはずです。「上書き保存したら、前の状態に戻せなくなった」という悪夢。これを防ぐための「世代管理」は、単なる便利機能ではなく、プロのエンジニアが現場で生き残るための必須の鎧です。

今回は、AutoCADの保存プロセスに介入し、保存の瞬間に別フォルダへ「バックアップの分身」を自動生成する、極めて実用的なVBAコードを伝授します。

—

1. なぜ「標準のバックアップ(BAK)」だけでは不十分なのか?

AutoCADには標準で `.bak` ファイルを作成する機能がありますが、これは「上書き保存のたびに1つ前の状態に上書きされる」という弱点があります。数時間前の状態に戻したいと思っても、既に `.bak` は上書きされている……そんな絶望を回避するために、「日時を刻印した個別のコピー」を保存する仕組みを作ります。

—

2. 実装の心臓部:VBAコードの全容

今回のコードは、標準モジュールではなく、`ThisDrawing` オブジェクトモジュールに記述するのが肝です。これにより、図面が「保存された」というイベントをAutoCADが検知した瞬間に、自動でバックアップ処理が走ります。

以下のコードを、AutoCADのVBAエディタ(`VBAIDE`)を開き、プロジェクト内の `ThisDrawing` に貼り付けてください。

‘ — ThisDrawing モジュールに記述 —

‘ 保存イベントを検知してバックアップを実行
Private Sub AcadDocument_SaveAs(ByVal FileName As String)
Call AutoBackup(FileName)
End Sub

Private Sub AcadDocument_Save(ByVal FileName As String)
Call AutoBackup(FileName)
End Sub

‘ バックアップを実行するメイン処理
Sub AutoBackup(ByVal CurrentFilePath As String)
Dim fso As Object
Dim backupFolder As String
Dim fileNameOnly As String
Dim timeStamp As String
Dim newBackupPath As String

‘ 1. バックアップ先のフォルダ設定(環境に合わせて変更してください)
backupFolder = “C:\CAD_Backups\”

‘ 2. ファイルシステムオブジェクトの準備
Set fso = CreateObject(“Scripting.FileSystemObject”)

‘ 3. バックアップ用フォルダが存在しなければ作成
If Not fso.FolderExists(backupFolder) Then
fso.CreateFolder (backupFolder)
End If

‘ 4. ファイル名に日時を付与(例: 20231027_153005_図面名.dwg)
timeStamp = Format(Now, “yyyymmdd_hhnnss”)
fileNameOnly = fso.GetFileName(CurrentFilePath)
newBackupPath = backupFolder & timeStamp & “_” & fileNameOnly

‘ 5. コピーを実行(上書き禁止の安全設計)
On Error Resume Next ‘ 念のためエラー抑制
fso.CopyFile CurrentFilePath, newBackupPath

If Err.Number = 0 Then
Debug.Print “バックアップ完了: ” & newBackupPath
End If

Set fso = Nothing
End Sub

—

3. コードの「魂」を解説する

このコードがなぜ優れているのか、エンジニアの視点でポイントを解説します。

  • `AcadDocument_SaveAs/Save` イベントの利用:

ユーザーが「保存ボタンを押した」というアクションをトリガーにしています。わざわざ別のマクロを実行しなくても、普段通り作業するだけで勝手に管理が進む。これが自動化の真髄です。

  • `FileSystemObject (FSO)` の採用:

VBA標準の `FileCopy` よりも堅牢で扱いやすいのがFSOです。フォルダの存在確認やパスの結合をスマートに行えるため、実務では必須のライブラリと言えます。

  • `Format(Now, “yyyymmdd_hhnnss”)` の魔力:

ファイル名の先頭に日時を入れることで、OS上でファイルが必ず「時間順」に並ぶようになります。これにより、古いものから消すといった運用も非常に楽になります。

—

4. 陥りやすい罠と対策

Q. 「保存のたびに遅くなるのでは?」

A. 巨大な図面だとコピーに時間がかかります。
もし図面サイズが数百MBある場合は、バックアップ先をネットワークドライブではなく、ローカルの高速なSSDフォルダに設定してください。また、バックアップフォルダ内のファイルが溜まりすぎるとHDDを圧迫します。「1週間経過したら古いファイルを削除する」という別のマクロをタスクスケジューラで組むと、完璧な世代管理システムになります。

Q. 「エラーが出て動かない」

A. 参照設定を確認しましょう。
VBAエディタの「ツール」→「参照設定」から「Microsoft Scripting Runtime」にチェックを入れるのが正式な手順ですが、上記のコードでは `CreateObject` を使っているため、あえて参照設定なしでも動くようにしています(遅延バインディング)。これでエラーが出る場合は、保存先フォルダへのアクセス権限がない可能性が高いです。

—

最後に:自動化は「守り」から始まる

自動化というと「複雑な図形を一瞬で描く」ような派手なものを想像しがちですが、本当に価値があるのは、今回のような「ヒューマンエラーによるデータ損失を防ぐ」という守りの自動化です。

これが動くようになったら、あなたはもう「マクロを記録する人」ではありません。「CADの環境を設計するエンジニア」です。

次は、このコードをベースに、「特定のプロジェクトフォルダだけバックアップする」「不要なレイアウトを削除してからバックアップする」といった独自のカスタマイズに挑戦してみてください。あなたのエンジニアリングライフがより知的で、そして何より「安心して」作業できるものになることを願っています。

何か詰まったら、いつでも戻ってきてください。また次のステップでお会いしましょう。

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