OneDrive/SharePoint環境の罠:AutoCAD VBAによる「同期失敗」を物理的に制圧する設計論
AutoCADの自動化において、ローカルディスクを前提としたコードは、もはやレガシーな遺物です。現代の設計現場は、OneDriveやSharePointによるクラウド同期が標準。しかし、この環境で何の対策もせずに `Documents.Open` を叩くのは、時限爆弾を抱えて走るようなものです。
クラウドストレージの同期エンジンは、ファイルが「書き込み中」か「同期完了」かをAPIレベルで完全には公開していません。「ファイルが開けない」「変更が反映されない」「競合ファイルが生成される」という悪夢は、コードの書き方次第で完全に排除できます。
今日は、プロの現場で必須となる「同期状態を意識した堅牢なファイル制御」の極意を伝授します。
—
1. なぜ「単純なOpen」は失敗するのか
クラウド環境では、ファイル操作時に以下のラグが発生します。
- 同期ロック: ファイルがアップロード中、または競合解決中である場合、AutoCADの `Open` メソッドは「アクセス拒否」で即死します。
- Ghostファイル: `~$FILENAME.dwg` のような一時ファイルが、同期プロセスによって作成・削除されるタイミングで衝突が起きます。
これらを「リトライ処理」だけで解決しようとするのは素人です。同期状態を検知し、物理的にアクセス可能な状態を待機する「排他制御」を設計に組み込む必要があります。
—
2. プロダクションコード:同期を待機するオープンラッパー
以下のコードは、単に開くのではなく「ファイルシステムが操作を受け入れるまで待機する」ロジックを備えた、実務直結の関数です。
‘ 必要な参照設定: Microsoft Scripting Runtime
‘ 役割: 同期状態を考慮して安全に図面を開く
Public Function SafeOpenDrawing(ByVal filePath As String, ByVal readOnly As Boolean) As AcadDocument
Dim fso As New FileSystemObject
Dim doc As AcadDocument
Dim retryCount As Integer
Const MAX_RETRIES = 10
‘ 1. ファイルの存在確認
If Not fso.FileExists(filePath) Then
Err.Raise vbObjectError + 1001, “SafeOpenDrawing”, “ファイルが見つかりません: ” & filePath
End If
‘ 2. 同期待機ループ
For retryCount = 1 To MAX_RETRIES
On Error Resume Next
Set doc = Application.Documents.Open(filePath, readOnly)
If Err.Number = 0 Then
On Error GoTo 0
Set SafeOpenDrawing = doc
Exit Function
End If
‘ 同期中や一時ファイル競合の場合は少し待機してから再試行
On Error GoTo 0
Debug.Print “同期待機中…” & retryCount
Sleep 2000 ‘ Kernel32のSleepをAPI宣言しておくこと
Next retryCount
Err.Raise vbObjectError + 1002, “SafeOpenDrawing”, “同期競合によりオープンに失敗しました。”
End Function
‘ ※モジュール冒頭で宣言が必要
‘ #If VBA7 Then
‘ Public Declare PtrSafe Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As Long)
‘ #Else
‘ Public Declare Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As Long)
‘ #End If
—
3. 設計の核心:なぜこの構成なのか
1. エラーを握りつぶさない(例外処理の明示)
`On Error Resume Next` は、同期待ちのリトライ区間のみに限定しています。それ以外でエラーが出た場合、即座に例外を発生させ、呼び出し元でログを吐かせる設計にすべきです。サイレントエラーは自動化における最大の敵です。
2. ファイル属性による判定(発展的アプローチ)
より厳密にやるなら、ファイルの `Attributes` をチェックします。OneDriveの同期ファイルは、特定の属性(`FILE_ATTRIBUTE_OFFLINE`など)を持つことがあります。ファイルがローカルにキャッシュされていない場合、強制的にダウンロードを促すトリガーを実装することで、ネットワーク環境の不安定さも克服可能です。
3. データベース連携との親和性
もしあなたが図面リストをExcelやAccessで管理しているなら、「操作の開始」と「終了」の時刻をデータベースに記録してください。クラウドストレージ上では「誰がいつ触ったか」が曖昧になりがちです。VBAからデータベースへステータスを書き込むことで、同期競合が起きた際の原因切り分けが圧倒的に早くなります。
—
4. 最後に:現場で生き残るためのマインドセット
AutoCAD VBAのコードは、単に「図面が開けばよい」わけではありません。「ネットワークが瞬断しても、同期が遅れても、図面を破壊せずにタスクを完遂する」。これがプロフェッショナルに求められるエンジニアリングです。
もし大規模なバッチ処理を行うのであれば、OneDriveの同期対象外フォルダ(ローカル一時作業領域)に一旦ファイルをコピーし、編集後に同期フォルダへ戻す「ステージング方式」を採用することを推奨します。クラウド同期の特性を「信じない」ことこそが、最も確実な自動化への近道なのです。
あなたの書いたコードが、過酷な設計現場で「止まらない自動化エンジン」として機能することを期待しています。何か技術的な壁に当たったら、またいつでも来てください。設計思想から叩き直して差し上げます。
