こんにちは。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の環境を設計するエンジニア」です。
次は、このコードをベースに、「特定のプロジェクトフォルダだけバックアップする」「不要なレイアウトを削除してからバックアップする」といった独自のカスタマイズに挑戦してみてください。あなたのエンジニアリングライフがより知的で、そして何より「安心して」作業できるものになることを願っています。
何か詰まったら、いつでも戻ってきてください。また次のステップでお会いしましょう。
