ネットワーク障害に殺されないAutoCAD VBA:ローカル一時保存による「止まらない設計」の構築術
AutoCADのVBA開発において、ネットワークドライブ上のDWGを直接編集し続けることは、エンジニアにとっての「ロシアンルーレット」だ。VPNの瞬断、サーバーの負荷、あるいは排他制御の競合。これらによって引き起こされる「保存失敗による数時間の徒労」は、我々プロフェッショナルが最も避けるべきリスクである。
今回は、ネットワークの不安定さをシステム的に「無視」し、ローカルをバッファとして活用する堅牢な同期アーキテクチャを伝授する。
—
1. アーキテクチャの真髄:サーバー直接参照からの脱却
多くの現場では、`ThisDrawing.SaveAs`をネットワークパスに対して直接実行しているが、これが諸悪の根源だ。
真の解決策は、「作業ディレクトリのローカル化(サンドボックス)」である。
1. ファイルオープン時にローカルへコピーし、ローカルDWGを開く。
2. 保存時はローカルへ書き出し、並行してバックグラウンドでサーバーへ同期する。
3. 終了時に最終同期を行い、ローカルをクリーンにする。
このプロセスを自動化することで、VPNの断絶は「同期の遅延」にはなっても「作業の停止」にはならなくなる。
—
2. 実装の極限:APIによるネットワーク監視と同期
VBA単体ではネットワーク状態の判定に限界があるため、`WinINet.dll`を使用して通信状態を監視する。また、COMオブジェクトの解放漏れはAutoCADのメモリリークの最大の要因となるため、徹底した`Set = Nothing`を遵守すること。
ローカル同期クラスの実装例
‘ Win32 APIによるオンライン状態チェック
Private Declare Function InternetGetConnectedState Lib “wininet.dll” (ByRef lpdwFlags As Long, ByVal dwReserved As Long) As Long
Public Sub SmartSave(targetLocalPath As String, targetServerPath As String)
On Error GoTo ErrorHandler
‘ 1. ローカルへ保存
ThisDrawing.SaveAs targetLocalPath
‘ 2. ネットワーク状態確認
If IsNetworkAvailable() Then
‘ 3. ファイル同期(FileSystemObject使用)
Dim fso As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)
fso.CopyFile targetLocalPath, targetServerPath, True
Set fso = Nothing
Else
‘ ネットワーク切断時はイベントログやローカルDBに記録し、後で同期させる
Call LogPendingSync(targetLocalPath, targetServerPath)
End If
Exit Sub
ErrorHandler:
‘ メモリ最適化:エラー発生時も確実にオブジェクトを解放
‘ ここで終了処理を厳密に行うのがアーキテクトの矜持
MsgBox “同期失敗: ” & Err.Description
End Sub
Private Function IsNetworkAvailable() As Boolean
IsNetworkAvailable = (InternetGetConnectedState(0&, 0&) <> 0)
End Function
—
3. レガシー環境を生き抜くメモリ管理術
VBAはガベージコレクションが極めて脆弱だ。特にAutoCADの`AcadDocument`オブジェクトや`SelectionSet`を多用する場合、明示的な解放を怠ると、数時間の連続稼働でメモリ使用量が肥大化し、最悪の場合「致命的なエラー」でAutoCADごとクラッシュする。
- `Set obj = Nothing` の徹底: スコープを抜ける前に必ず記述せよ。
- SelectionSetの削除: `SelectionSets.Item(“Name”).Delete` を忘れれば、図面内のメモリは永遠に解放されない。
- イベントハンドラの解除: `WithEvents` で定義したイベントは、破棄時に明示的に `Nothing` にしないと、幽霊のようなプロセスが残り続ける。
—
4. プロフェッショナルへの提言:同期システムの「次」
上記の実装はあくまで基礎である。真に「止まらないシステム」を構築するのであれば、以下の戦略を推奨する。
1. SQLiteによるトランザクション管理: 同期漏れを防ぐため、どのファイルがどのサーバーパスと同期されるべきかをSQLite等のローカルDBで管理する。
2. バックグラウンド同期: VBAのメインスレッドを止めないよう、同期処理は `Windows Script Host (WSH)` や `PowerShell` を呼び出し、別プロセスで実行させる。
3. バージョン互換のガードレール: `SaveAs` 時に `ac2018_dwg` などの定数を明示的に指定し、将来的なフォーマット変更による破損を未然に防ぐ。
結びに代えて
AutoCAD VBAは、現代ではレガシーな技術と見なされがちだ。しかし、その環境を熟知し、Windowsの根幹であるAPIと組み合わせることで、最新のクラウドアプリ以上に堅牢な「現場の武器」へと昇華させることが可能だ。
「不安定な環境」を嘆くのではなく、「不安定であっても止まらないシステム」を設計すること。それが、我々エンジニアの仕事である。
コードが書けるだけのプログラマーで終わるな。システムを掌握するアーキテクトであれ。
