「保存ボタン」を信じるな。ネットワーク切断を想定した、プロフェッショナルな図面保護システムを構築する
こんにちは。現場の自動化を支えるエンジニアの皆さん。
今日も図面との格闘、お疲れ様です。
皆さんは、AutoCADで作業していて、一番「血の気が引く瞬間」はいつでしょうか?
私は断言します。「サーバーに保存している最中に、ネットワークがプツンと切れた瞬間」です。
「マクロの記録」で覚えた `ThisDrawing.Save`。これは、ネットワークが完璧に生きていることを前提とした「お花畑なコード」です。もし保存中に接続が切れたら、ファイルは破損するか、あるいは数時間の作業が泡となって消えてしまいます。
今日は、そんな「現場の恐怖」を技術でねじ伏せる、【トランザクション保存:ローカル退避&復旧同期システム】の設計思想と実装方法を伝授します。
「マクロの記録」から脱却し、本当の意味で「システム」を組めるエンジニアへの第一歩を、一緒に踏み出しましょう。
1. なぜ、普通の「Save」では足りないのか?
まず、問題の構造を理解しましょう。図面をサーバーに保存する際、コンピュータの中では以下のようなことが起きています。
1. AutoCAD: 「よし、データを書き出すぞ!」
2. OS: 「了解。ネットワーク経由でサーバーの指定場所にデータを送るね」
3. ネットワーク: (ここで断線!)
4. OS: 「……あれ? 送り先が見つからないよ? 書き込みエラー!」
5. AutoCAD: (エラーで停止、あるいはファイルが不完全な状態でロックされる)
このとき、メモリ上(AutoCADが開いている状態)にはデータがありますが、ハードディスクには「壊れた中途半端なファイル」しか残らないリスクがあるのです。
プロフェッショナルの戦略:二段構えの防御
賢いエンジニアは、サーバーを直接信じません。
「まず、手元の(絶対に切れない)ローカル環境にバックアップを取り、それからサーバーへ送る」という、二段階のプロセスを組みます。
【イメージ図】
`[作業中の図面]` $\rightarrow$ `[Step 1: ローカルの隠しフォルダへ保存]` $\rightarrow$ `[Step 2: サーバーへ保存]`
- Step 1 が成功すれば、少なくとも手元にはデータがある。
- Step 2 で失敗しても、Step 1 のデータを使って後で復旧できる。
2. 実装の鍵:ローカル・キャッシュ・システム
では、具体的なコードを見ていきましょう。今回は、初心者の方でも理解しやすいように、構造を分けて丁寧に解説します。
このコードでは、`FileSystemObject` という、ファイルの操作を専門に行う強力な道具(ライブラリ)を使います。
実装コード例 (AutoCAD VBA)
※事前にVBAエディタの [ツール] $\rightarrow$ [参照設定] から “Microsoft Scripting Runtime” にチェックを入れてください。これが、ファイル操作を「プロ級」にする魔法のスパイスです。
Option Explicit
' =================================================================
' プロフェッショナル保存システム
' 概要: ローカルに一時保存してからサーバーに保存を試みる
' =================================================================
Sub ProfessionalSafeSave()
Dim doc As AcadDocument
Set doc = ThisDrawing
Dim fso As New FileSystemObject
Dim localCacheDir As String
Dim serverPath As String
Dim timestamp As String
Dim localFilePath As String
Dim fileName As String
' --- 設定エリア ---
' 1. ローカルの退避先(ユーザーのTempフォルダ等)
localCacheDir = Environ("TEMP") & "\AutoCAD_Backup_Cache\"
' 2. 本来保存したいサーバーのパス(現在の図面パスを取得)
serverPath = doc.FullName
' ------------------
' ローカルのキャッシュフォルダがなければ作成する
If Not fso.FolderExists(localCacheDir) Then
fso.CreateFolder (localCacheDir)
End If
' タイムスタンプを作成(ファイル名の重複を防ぐシリアル番号代わり)
timestamp = Format(Now, "yyyymmdd_hhnnss")
fileName = fso.GetBaseName(serverPath) & "_" & timestamp & ".dwg"
localFilePath = localCacheDir & fileName
On Error GoTo ErrorHandler
' --- Step 1: ローカルへの緊急退避 ---
Debug.Print "Step 1: ローカルへ退避中..."
doc.SaveAs localFilePath
' --- Step 2: サーバーへの本保存 ---
Debug.Print "Step 2: サーバーへ保存中..."
doc.SaveAs serverPath
' サーバー保存に成功したら、ローカルの退避ファイルは削除してもOK(任意)
' fso.DeleteFile localFilePath
MsgBox "保存が正常に完了しました。", vbInformation
Exit Sub
ErrorHandler:
' エラーが発生した場合(ネットワーク断絶など)
Err.Raise Err.Number ' エラーを上位に投げる
' もしエラーが「パスが見つからない(76)」や「ネットワークエラー」なら
' ここで「ローカルには保存できた」という事実をユーザーに伝える
MsgBox "【警告】サーバーへの保存に失敗しました!" & vbCrLf & _
"しかし、ローカルへは退避済みです。" & vbCrLf & _
"退避先: " & localFilePath, vbCritical, "ネットワーク切断検知"
End Sub
' =================================================================
' 復旧同期システム
' 概要: ローカルに残った「未同期ファイル」をスキャンしてリストアップする
' =================================================================
Sub RecoverLostFiles()
Dim fso As New FileSystemObject
Dim localCacheDir As String
Dim file As File
Dim folder As FileSystemObject
localCacheDir = Environ("TEMP") & "\AutoCAD_Backup_Cache\"
If Not fso.FolderExists(localCacheDir) Then
MsgBox "キャッシュフォルダが見つかりません。", vbExclamation
Exit Sub
End If
Debug.Print "--- 未同期ファイルの確認開始 ---"
For Each file In fso.GetFolder(localCacheDir).Files
' ここでは単純に表示するだけですが、実際にはサーバーのファイルと
' 更新日時を比較して、新しいものだけをリストアップするロジックを組みます。
Debug.Print "発見された未同期ファイル: " & file.Path
Next file
MsgBox "未同期ファイルの確認が完了しました。詳細はイミディエイトウィンドウを見てください。", vbInformation
End Sub
3. コードの深掘り:ここが「プロ」の分かれ目
このコードを単なる「コピペ」で終わらせないために、重要なエッセンスを解説します。
① `Environ(“TEMP”)` の活用
`C:\Backup` のような固定パスを使うのは素人です。なぜなら、権限がないフォルダだったり、PCごとに構成が違ったりするからです。`Environ(“TEMP”)` を使うことで、Windowsが用意した「誰でも書き込み可能な一時作業領域」をスマートに利用できます。
② `On Error GoTo ErrorHandler`(エラーハンドリング)
マクロの記録では、エラーが起きると「実行時エラー」のダイアログが出て止まるだけです。しかし、プロのコードは「エラーが起きたときこそ、次のアクション(ユーザーへの通知やログ記録)に移る」ように設計します。
今回のコードでは、サーバー保存に失敗しても「ローカルには保存できたよ!」という救済メッセージを出すことで、ユーザーのパニックを防いでいます。
③ タイムスタンプによるシリアル化
`Format(Now, “yyyymmdd_hhnnss”)` をファイル名に含めていますね。これは、同じファイル名で何度も保存しても、上書きされずに「履歴」として残るようにするためです。万が一、保存処理自体が途中でクラッシュしても、過去の履歴が残っていれば、そこから復旧できる確率が飛躍的に上がります。
4. 陥りやすい罠(ハマりポイント)
このシステムを運用する上で、注意すべき点が2つあります。
1. ファイルロックの競合
`SaveAs` を実行すると、AutoCADはそのファイルを「使用中」としてロックします。復旧プロセスを組むときは、AutoCADがそのファイルを掴んでいないか(他のユーザーが触っていないか)をチェックするロジックが必要になります。
2. キャッシュの肥大化
「とりあえずローカルに保存」を繰り返すと、`TEMP` フォルダが図面ファイルでパンパンになります。定期的に(例えば週に一度、あるいはAutoCAD起動時に)キャッシュフォルダを掃除する仕組みをセットで考えるのが、真のアーキテクトです。
まとめ:道具を「仕組み」に変える
「マクロの記録」は、単なる操作の録画です。
しかし、今回のような「エラーを想定し、データのライフサイクルを管理するコード」は、「仕組み(システム)」です。
AutoCAD VBAの世界は、単に図面を描くためのものではありません。「いかにして、人間のミスやインフラの不安定さから、貴重な成果物を守り抜くか」という、エンジニアリングの真髄を試される場所なのです。
ここをクリアすれば、AutoCAD VBAの基本はバッチリですよ。
自信を持って、より堅牢な自動化ツールを作り上げてください。応援しています!
