データの命を守る生存戦略:AutoCAD VBAにおける「緊急退避保存」の実装
こんにちは。現場の設計業務を、技術の力でよりスマートに、より安全に変えていく。そんな挑戦を楽しんでいる皆さん、ようこそ。
AutoCADで日々、大規模な図面と格闘していると、ふとした瞬間に「恐怖」を感じることがありませんか?
そう、「保存ボタンを押した瞬間に、ネットワークが切断される」という、あの絶望的な瞬間です。
「サーバーに保存できません」という無機質なエラーメッセージ。
これまで数時間、あるいは数日かけて積み上げてきた設計データが、メモリ上の不安定な状態に置かれ、そのままAutoCADがクラッシュしてしまったら……。想像しただけで背筋が凍りますよね。
今日は、マクロの記録から一歩踏み出し、「実務で本当に使える堅牢なツール」を作りたいと考えている中級者へのステップアップとして、「ネットワーク障害時に、ローカル環境へ自動的にデータを退避させる生存戦略」を伝授します。
ここをクリアすれば、あなたの作るツールは「ただ動くもの」から「プロが信頼するシステム」へと進化しますよ。
なぜ、単なる「SaveAs」では不十分なのか?
多くの初学者は、こう考えます。
「`ThisDrawing.SaveAs` を書けば、保存できるはずだ」と。
しかし、実務の現場(特にサーバー・クライアント構成のオフィス)では、ネットワークの瞬断や、サーバーのメンテナンス、あるいは権限エラーといった「外部要因」が、プログラムの制御を離れて発生します。
通常のプログラムであれば、エラーが起きた瞬間に処理は止まります。しかし、図面作成という文脈において、「エラーで止まる」ことは「データ消失のリスク」に直結するのです。
私たちが目指すべきは、「エラーを『失敗』として終わらせず、『次のアクション(ローカル保存)』へのトリガーに変える」という設計思想です。
実装のアーキテクチャ:防波堤を作る
今回のロジックは、以下の3段構えで構築します。
1. メインプロセス: 通常通り、ネットワーク上の指定パスへ保存を試みる。
2. エラートラップ: 保存に失敗した瞬間、`On Error GoTo` を使ってエラーを検知する。
3. 緊急避難プロセス: エラーを検知したら、即座に「ユーザーのデスクトップ」へ、タイムスタンプ付きのファイル名で保存を実行する。
重要なテクニック:タイムスタンプの付与
緊急退避時、元のファイル名と同じ名前で保存しようとすると、既存のファイルと衝突したり、上書きしてしまったりする危険があります。必ず `20231027_143005`(年月日_時分秒)のような、一意(ユニーク)な名前を生成するのがプロの作法です。
実装コード:命を守る「SaveAs」プロトコル
それでは、実際に使えるコードを見ていきましょう。このコードは、そのままVBAエディタに貼り付けて、パスの部分を書き換えるだけで動作するように設計しています。
Option Explicit
''' <summary>
''' ネットワーク保存を試行し、失敗した場合はローカルへ緊急退避する
''' </summary>
Sub RobustSaveAs()
Dim targetPath As String
Dim localBackupPath As String
Dim fileName As String
Dim timestamp As String
Dim folderPath As String
' --- 設定エリア ---
' 本来保存したいネットワーク上のフルパスを指定してください
targetPath = "Z:\Project\Drawing_Data\Sample_Project.dwg"
' 緊急退避先のローカルフォルダ(デスクトップ等)
' ここではデスクトップをベースにします
folderPath = CreateObject("WScript.Shell").SpecialFolders("Desktop") & "\AutoCAD_Emergency_Backup\"
' ------------------
' 1. まずは通常の保存を試みる
On Error GoTo ErrorHandler
Debug.Print "Attempting to save to: " & targetPath
ThisDrawing.SaveAs targetPath
MsgBox "正常に保存されました。", vbInformation, "完了"
Exit Sub
ErrorHandler:
' 2. エラーが発生した場合、ここへジャンプする
' エラー番号がネットワーク切断や書き込み権限不足などを想定
Debug.Print "Save failed. Error: " & Err.Description
' ユーザーに警告を出す(焦らせすぎないように、優しく)
MsgBox "【警告】ネットワークへの保存に失敗しました。" & vbCrLf & _
"データを守るため、ローカル環境へ緊急退避を行います。", vbExclamation, "緊急事態発生"
' 3. 緊急退避プロセスの開始
Call EmergencyEvacuation(folderPath, targetPath)
End Sub
''' <summary>
''' ローカル環境へタイムスタンプ付きでファイルを保存する
''' </summary>
Private Sub EmergencyEvacuation(ByVal backupFolder As String, ByVal originalPath As String)
Dim fso As Object
Dim timestamp As String
Dim baseName As String
Dim extension As String
Dim finalPath As String
On Error GoTo CriticalError
Set fso = CreateObject("Scripting.FileSystemObject")
' 保存先フォルダが存在しない場合は作成する
If Not fso.FolderExists(backupFolder) Then
fso.CreateFolder (backupFolder)
End If
' ファイル名と拡張子を分離
' 例: "C:\Test\Drawing.dwg" -> baseName="Drawing", extension=".dwg"
baseName = fso.GetBaseName(originalPath)
extension = fso.GetExtensionName(originalPath)
' タイムスタンプの生成 (YYYYMMDD_HHMMSS)
timestamp = Format(Now, "yyyymmdd_hhmmss")
' 新しいファイルパスの組み立て
finalPath = backupFolder & baseName & "_" & timestamp & "." & extension
' 緊急保存実行
ThisDrawing.SaveAs finalPath
MsgBox "緊急退避が完了しました!" & vbCrLf & _
"保存先: " & finalPath, vbInformation, "救済完了"
Exit Sub
CriticalError:
' 万が一、ローカル保存すら失敗した場合(ディスクフルなど)
MsgBox "致命的なエラー: ローカルへの退避にも失敗しました。" & vbCrLf & _
"直ちにAutoCADを保存せずに終了せず、作業内容をメモしてください。", vbCritical, "生存不能"
End Sub
コードの深層解説:ここがエンジニアの腕の見せ所
このコードには、単に「動く」以上の、設計思想が詰まっています。
1. `FileSystemObject (FSO)` の活用
`CreateObject(“Scripting.FileSystemObject”)` を使っていますね。これはWindowsのファイル操作を極めて強力にするオブジェクトです。
「フォルダがあるかどうか確認する (`FolderExists`)」「フォルダを作る (`CreateFolder`)」「ファイル名から拡張子だけを抜き出す (`GetExtensionName`)」といった操作を、非常にスマートに行えます。これを使わずに文字列操作だけでパスをいじろうとすると、コードが汚れ、バグの温床になります。
2. エラーハンドリングの「階層化」
`RobustSaveAs`(メイン)と `EmergencyEvacuation`(サブ)で、エラーハンドリングを分けています。
もし、ネットワークが死んでいる上に、ローカルのCドライブまで容量がいっぱいだったら?
その「最悪のシナリオ」すら想定して、`CriticalError` という最後の砦を用意しています。これが「堅牢な設計」です。
3. オブジェクトのライフサイクルへの配慮
`ThisDrawing.SaveAs` を呼び出す際、AutoCADのメモリ上にある現在の図面オブジェクトの状態を、新しいパスへ「写し取る」作業が行われます。
エラーが発生した直後にこのメソッドを叩くことで、「メモリ上に残っている最新のデータ」を、失われる前に物理的なディスクへと書き込むことができるのです。
まとめ:一歩先のエンジニアへ
いかがでしたでしょうか。
「エラーが起きたら止まる」のではなく、「エラーが起きたからこそ、次の安全な道を探す」。
この考え方は、AutoCAD VBAに限らず、あらゆるシステム開発における鉄則です。
最初は、エラーハンドリングの書き方や、オブジェクトの使い分けに戸惑うかもしれません。でも、こうして「実務の痛み(データの消失)」を解決するコードを書くことで、あなたのスキルは飛躍的に向上します。
「もし、ここでサーバーが落ちたらどうなるか?」
常にこの問いを自分に投げかけてみてください。その思考こそが、あなたを伝説的なエンジニアへと導くのです。
さあ、次はどんな自動化に挑戦しますか?応援していますよ!
