【実務・中級編】【初心者向け】ThisDrawing.FullNameから「バックアップ用ファイル名」を自動生成して保存する方法 – AutoCAD VBA解析バイブル

スポンサーリンク

AutoCAD VBAの「バックアップ自動生成」を極める:泥臭い手作業を駆逐する設計思想

AutoCADの業務自動化において、最も初歩的かつ重要なのが「図面の保護」だ。
「手動で名前を付けて保存」などという非効率なルーチンを繰り返しているようでは、エンジニアとは呼べない。今回は、`ThisDrawing.FullName`から安全かつ確実にバックアップパスを生成し、一撃で保存を完結させるプロフェッショナルな実装を伝授する。

単に文字列を連結するだけのコードは、現場では即座にゴミと化す。なぜなら、パスの解析は「例外」をいかに潰すかがすべてだからだ。

—

1. なぜ「単純な文字列操作」が破綻するのか

初心者が陥る罠は、`Left`や`InStr`を闇雲に組み合わせることだ。

  • パスがネットワークドライブにあるのか、ローカルか?
  • ファイル名にドット(.)が複数含まれていたらどうなる?
  • 保存先フォルダが存在しなかったら?

これらを考慮しないコードは、ある日突然、パス生成エラーで現場を止めさせる。我々が目指すべきは、「堅牢性(Robustness)」だ。ファイルシステムオブジェクト(FSO)を使い、OSのパス管理に準拠した実装を行うのが、AutoCAD開発の鉄則である。

—

2. プロダクションコード:BackupManagerの実装

このコードをそのまま標準モジュールに貼り付けてほしい。エラー処理とFSOを組み合わせた、保守性の高い設計だ。

Option Explicit

‘ @brief 現在の図面を日付付きバックアップとして別名保存する
‘ @details FileSystemObject(FSO)を使用してパスを安全に分解・再構成する
Public Sub SaveAsBackup()
Dim doc As AcadDocument
Dim fso As Object
Dim fullPath As String
Dim folderPath As String
Dim baseName As String
Dim extension As String
Dim backupPath As String

Set doc = ThisDrawing

‘ 1. 未保存ファイルかどうかのチェック(重要:AutoCADの仕様)
If doc.Path = “” Then
MsgBox “この図面はまだ一度も保存されていません。”, vbCritical, “エラー”
Exit Sub
End If

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

‘ 3. パスを解析してパーツに分解
folderPath = fso.GetParentFolderName(fullPath)
baseName = fso.GetBaseName(fullPath)
extension = “.” & fso.GetExtensionName(fullPath)

‘ 4. バックアップ用ファイル名の生成 (YYYYMMDD_HHMM_OriginalName)
‘ ※日付形式は社内ルールに合わせて変更可能
backupPath = folderPath & “\” & _
Format(Now, “yyyyMMdd_HHmm”) & “_” & _
baseName & “_backup” & extension

‘ 5. 保存処理とエラーハンドリング
On Error GoTo ErrHandler
doc.SaveAs backupPath

MsgBox “バックアップ完了: ” & vbCrLf & backupPath, vbInformation, “成功”

Set fso = Nothing
Exit Sub

ErrHandler:
MsgBox “保存に失敗しました: ” & Err.Description, vbCritical, “システムエラー”
Set fso = Nothing
End Sub

—

3. 実務で「勝てる」エンジニアになるための3つの鉄則

① `ThisDrawing.Path` の空判定を忘れるな

AutoCADで「名前を付けて保存」をしていない未保存ファイルに対し、`FullName`や`Path`を参照すると空文字が返り、そのまま後続処理を行うとランタイムエラーになる。現場のツールなら、必ず「保存済みか?」を先頭でチェックすること。

② FSO(FileSystemObject)を愛せ

パスの切り出しに`Left`や`Right`関数を使うのは今すぐ止めよう。パスの区切り文字(`\`)の検索ミスや、拡張子の有無によるバグを誘発する。`fso.GetBaseName`や`fso.GetExtensionName`を使えば、それらの複雑な処理をOSレベルの信頼性で代行してくれる。

③ データベース連携を見据えた命名規則

もし今後、この図面を管理データベース(ExcelやSQL Server)と連携させる予定があるなら、バックアップファイル名の先頭にタイムスタンプを付けるこの形式は極めて有効だ。ソートした際に時系列順に並ぶため、管理コストが劇的に下がる。

—

まとめ:自動化のその先へ

今回紹介したコードは、あくまで「仕組み」の入り口に過ぎない。
これをコマンドボタンに割り当てたり、`BeginSave`イベントと連携させて「保存するたびにバックアップを強制生成する」ような仕組みへ昇華させることも可能だ。

「コードを書く」のではない。「業務のフローを設計する」のだ。
その視点さえ忘れなければ、君の作るツールは、現場のエンジニアたちにとってかけがえのない武器になるはずだ。

さあ、退屈な手作業をコードで駆逐しに行こう。

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