【入門編】【初心者向け】AcadDocument.NameとPathを組み合わせた「自動バックアップ」:保存実行時に別フォルダへタイムスタンプ付きコピーを作成する – AutoCAD VBA解析バイブル

スポンサーリンク

こんにちは!AutoCAD VBAの世界へようこそ。
マクロの記録ボタンを押すだけのステージから抜け出し、「自分の手で図面を自在に操るプログラムを書きたい」と思っているあなたへ。

今回は、実務で絶対に役立つ「図面の上書き保存と同時に、タイムスタンプ付きのバックアップを別フォルダへ自動作成するツール」の作り方を解説します。

「間違えて上書きしてしまった……昨日の状態に戻したい!」
そんな絶望的な状況を救う、エンジニアの必須教養とも言えるリスク管理スクリプトです。ここをクリアすれば、AutoCAD VBAのオブジェクトモデルの基礎はバッチリですよ。一緒にマスターしていきましょう!

1. なぜ「標準のバックアップ機能(.bak)」だけでは不安なのか?

AutoCADには、標準で上書き保存時に同階層へ`.bak`ファイルを作成する機能があります。しかし、実務の現場ではこれだけでは不十分なケースが多いです。

  • 同じフォルダに`.bak`が溜まるため、ファイル管理がごちゃごちゃする。
  • 気づかずに何度も上書き保存を繰り返すと、`.bak`も最新の「間違った状態」に上書きされてしまう。
  • 「午前10時点の状態」「午後3時点の状態」といった、時間ごとの履歴(世代管理)を残したい。

そこで今回作成するのが、「保存を実行した瞬間に、指定した専用のバックアップフォルダへ、現在時刻のラベル(タイムスタンプ)を付けたコピーを自動生成するツール」です。

2. 押さえておくべき基本:`AcadDocument` の `Name` と `Path`

AutoCAD VBAで図面を操作するとき、最も基本かつ重要なオブジェクトが `AcadDocument` です。現在開いている図面を指し示します。

このオブジェクトが持つ2つのプロパティが、今回の核心となります。

1. `Path` プロパティ: 図面が保存されているフォルダのパス(例: `C:\MyWorks\Projects`)を返します。
2. `Name` プロパティ: 拡張子を含んだファイル名(例: `SampleDrawing.dwg`)を返します。

※注意:もし図面が一度も保存されておらず、まだ名前がない状態(「図面1.dwg」など)の場合、`Path` は空欄(`””`)になります。ここが初学者が一番ハマりやすいポイントです。

3. 実装コード:安全で堅牢なバックアップ・マクロ

それでは、VBAエディタ(`Alt + F11`)を開き、`ThisDrawing` モジュールに以下のコードを貼り付けてください。

実務でそのまま使えるよう、エラー対策(未保存チェックやフォルダ自動作成など)を組み込んだ「一級品」のコードを用意しました。

Sub CreateTimestampBackup()
Dim oDoc As AcadDocument
Set oDoc = ThisDrawing

‘ 1. 図面が一度も保存されていない場合のガード処理
If oDoc.Path = “” Then
MsgBox “この図面はまだ保存されていません。一度保存してから実行してください。”, vbExclamation, “バックアップ中断”
Exit Sub
End If

Dim fso As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)

‘ 2. パスとファイル名の取得
Dim currentPath As String
Dim currentName As String
currentPath = oDoc.Path
currentName = oDoc.Name

‘ 3. バックアップ保存先フォルダのパスを決定(今回は同階層の “_Backup” フォルダ)
Dim backupDirPath As String
backupDirPath = currentPath & “\_Backup”

‘ バックアップ用フォルダが存在しなければ、自動で作成する
If Not fso.FolderExists(backupDirPath) Then
fso.CreateFolder (backupDirPath)
End If

‘ 4. タイムスタンプの生成(例: 20231025_143022)
Dim timeStamp As String
timeStamp = Format(Now, “yyyymmdd_hhnnss”)

‘ 5. 拡張子(.dwgなど)とファイル名を分離して、タイムスタンプを挿入
Dim ext As String
Dim baseName As String
ext = fso.GetExtensionName(currentName)
baseName = fso.GetBaseName(currentName)

Dim backupFileName As String
backupFileName = baseName & “_” & timeStamp & “.” & ext

Dim destinationPath As String
destinationPath = backupDirPath & “\” & backupFileName

‘ 6. 現在の図面を一度上書き保存し、その後別名でコピーを作成
On Error GoTo ErrorHandler
oDoc.Save ‘ 現在の図面を確実に保存

‘ ファイルのコピー実行(FSOを使用)
Dim sourceFullPath As String
sourceFullPath = currentPath & “\” & currentName

‘ OverWriteFiles = True で既存ファイルを上書き許可
fso.CopyFile sourceFullPath, destinationPath, True

‘ 7. 完了メッセージ(実運用ではコメントアウトしてもOK)
MsgBox “バックアップを作成しました:” & vbCrLf & backupFileName, vbInformation, “バックアップ成功”

Exit Sub

ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “エラー”
End Sub

4. コードの解説:プロが教えるポイント

初心者のあなたが「おっ」と思うポイントや、実務で重要になる設計思想をいくつか解説します。

① `FileSystemObject (FSO)` の活用

VBA標準の `FileCopy` ステートメントでもファイルコピーは可能ですが、フォルダの存在確認(`FolderExists`)や自動作成(`CreateFolder`)をスマートに行うために、`Scripting.FileSystemObject` を使っています。Windows環境であれば追加設定なしで使える非常に強力なツールです。

② タイムスタンプによる一意性の確保

`Format(Now, “yyyymmdd_hhnnss”)` を使うことで、何秒に保存したファイルか一目でわかる名前(例: `A-Building_20231025_153000.dwg`)になります。これにより、同名ファイルによる上書き事故を完全に対策できます。

③ 安全な処理の順序

バックアップを取る前に、まず `oDoc.Save` で「いま編集している最新の状態」を確実にディスクに書き込んでから、そのファイルを `FSO.CopyFile` でバックアップフォルダに飛ばしています。この順序を守るのがデータ保護の鉄則です。

5. 初学者が陥りがちな「罠」とエラー対策

最後に、このコードを運用する中でぶつかりやすい壁と、その回避策を共有しておきます。

  • 罠1: ネットワークドライブ(共有サーバー)での遅延
  • 現象: 会社のサーバー(NASなど)上でこのマクロを実行すると、保存とコピーの処理が重なってファイル競合エラーが起きることがあります。
  • 対策: 大規模な図面では、コピー処理の前に `DoEvents` を挟むか、ローカルPCに一度保存してからサーバーに飛ばすなどの工夫を検討しましょう。
  • 罠2: バックアップフォルダが肥大化する
  • 現象: 毎日何十回も保存すると、`_Backup` フォルダの容量が圧迫されます。
  • 対策: 将来的には、FSOを使って「作成から7日以上経過したファイルを自動削除するロジック」をこのコードに組み込むと、さらに完璧な自動化エンジニアに近づけますよ。

まとめ

いかがでしたか?
今回は `AcadDocument.Path` と `Name` を組み合わせ、FSOの力を借りて強固なバックアップシステムを作る方法を解説しました。

「オブジェクトから現在の居場所(Path)と名前(Name)を調べる」
「足りないフォルダはプログラムが自動で作る」

この考え方は、図面の自動一括処理や、PDF自動パブリッシュ機能など、あらゆるAutoCAD VBAの応用へと繋がっていきます。

ここをクリアしたあなたなら、もう立派なAutoCADプログラマの仲間入りです。ぜひ日々の業務に組み込んで、快適なCADライフを手に入せてくださいね!

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