【入門編】【上級プロフェッショナル向け】ネットワーク切断時の「トランザクション保存」:ローカルへの一時書き出しと復旧同期システム – AutoCAD VBA解析バイブル

スポンサーリンク
スポンサーリンク

「保存ボタン」を信じるな。ネットワーク切断を想定した、プロフェッショナルな図面保護システムを構築する

こんにちは。現場の自動化を支えるエンジニアの皆さん。
今日も図面との格闘、お疲れ様です。

皆さんは、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の基本はバッチリですよ。
自信を持って、より堅牢な自動化ツールを作り上げてください。応援しています!

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