こんにちは!AutoCAD VBAの世界へようこそ。
日々、膨大な図面と格闘し、自動化のスキルを磨いているあなたなら、きっとこんな経験があるのではないでしょうか。
「ローカルの時は完璧に動いたマクロなのに、OneDriveやSharePoint(クラウドストレージ)に保存先を変えた途端、突然エラーで止まる……」
実はこれ、現場のエンジニアたちが今最も頭を悩ませている「クラウド特有の同期競合」という罠なんです。今回は、この現代のCAD開発における最大の難所をスマートに突破する、上級プロフェッショナル向けの極限知見を授けましょう。
ここをクリアすれば、あなたのVBAスキルは間違いなく一段上のステージに到達します。さあ、一緒に本質を紐解いていきましょう!
—
なぜクラウド環境ではAutoCADの保存が失敗するのか?
まず、敵を知ることから始めましょう。
私たちが普段何気なく使っている `ThisDrawing.SaveAs` や `Save` メソッド。これはAutoCADがローカルのHDDや社内サーバー(SMB)に書き込みを行うためのものです。
しかし、保存先が OneDrive や SharePoint の同期フォルダーだった場合、裏側で何が起きているでしょうか?
1. AutoCADがファイルにロックをかけて書き込みを開始する
2. OSの同期クライアント(OneDrive.exeなど)が「ファイルの変更」を検知する
3. クラウドへのアップロード(同期)がバックグラウンドで走る
この時、もし「前の保存の同期が終わっていないうち」に次のマクロが走ったり、連続して上書き保存をかけたりすると、クラウド側でファイルのロックが衝突し、「アクセスが拒否されました (Permission Denied)」 や 「ファイルを保存できませんでした」 という残酷なエラーが吐き出されるのです。
これを力技で「少し待つ(Sleep)」だけでは、ネットワークの重さやファイルの大きさに依存してしまい、完全な解決にはなりません。必要なのは、「本当にOSとクラウドがそのファイルの書き込み権限を解放したか」をプログラム自身に見極めさせることです。
—
解決の鍵:FileSystemObjectによる「書き込みロック検知」
今回紹介するアプローチは、VBAから Scripting.FileSystemObject (FSO) を利用し、対象のDWGファイルが「他のプロセス(=同期クライアントやAutoCAD自身)に占有されていないか」を安全にテストする方法です。
ファイルを開こうとして(または排他制御モードでアクセスを試みて)エラーが出なければ、それは「安全に次の処理へ進んで良い」という合図になります。
実装コード:安全な同期待機セーブ関数
以下のコードを、あなたのVBAプロジェクトの標準モジュールにそのまま貼り付けてみてください。現場でそのまま使える、極めて堅牢なセーブ&同期待機ルーチンです。
Option Explicit
‘ Windows APIのSleep関数(ミリ秒単位の待機用)
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
”’
”’
”’ 保存対象のAcadDocument
”’ 保存先のフルパス
”’
Public Function SaveToCloudSafely(ByVal targetDoc As AcadDocument, ByVal filePath As String) As Boolean
Dim fso As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)
On Error GoTo ErrorHandler
‘ 1. まず通常通りAutoCADの機能で保存を実行
‘ ※すでに別名で保存されている場合は Save、新規や別名なら SaveAs を使い分けてください
targetDoc.Save
‘ 2. クラウド同期が落ち着くまでファイルの「占有チェック」をループで監視
Dim isLocked As Boolean
isLocked = True
Dim retryCount As Long
retryCount = 0
Const MAX_RETRY As Long = 30 30回までリトライ(計約15秒)
Const WAIT_INTERVAL As Long = 500 ‘ 1回あたり0.5秒待機
Do While isLocked And (retryCount < MAX_RETRY)
' 少しウェイトを入れてCPU負荷を下げつつ、同期の完了を待つ
Sleep WAIT_INTERVAL
' ファイルに排他アクセスを試みることで、ロックが解除されたかテストする
If TestFileAccess(filePath) Then
isLocked = False ' ロックが外れた!
Else
retryCount = retryCount + 1
End If
Loop
If isLocked = True Then
' タイムアウト発生
Err.Raise 9999, "CloudSave", vbCrLf & "警告: クラウドストレージの同期競合により、保存後のファイル確認がタイムアウトしました。" & vbCrLf & "パス: " & filePath
End If
SaveToCloudSafely = True
Exit Function
ErrorHandler:
MsgBox "セーブ処理中にエラーが発生しました。" & vbCrLf & Err.Description, vbCritical, "同期セーブ・エラー"
SaveToCloudSafely = False
End Function
'''
”’
Private Function TestFileAccess(ByVal filePath As String) As Boolean
Dim fileNum As Integer
On Error GoTo CheckFailed
‘ ファイルが存在しない場合はテスト不能
If Dir(filePath) = “” Then
TestFileAccess = False
Exit Function
End If
‘ バイナリモードでファイルを開いてみる(排他ロックがかかっていればエラーになる)
fileNum = FreeFile
Open filePath For Binary Access Read Write Lock Read Write As #fileNum
Close #fileNum
TestFileAccess = True
Exit Function
CheckFailed:
‘ エラーが発生した場合は、まだファイルがロックされている(または同期中)とみなす
TestFileAccess = False
On Error GoTo 0
End Function
—
コードの解説:なぜこのロジックが最強なのか?
初心者の方や、マクロの記録からステップアップしたばかりの方は、「なぜこんな回りくどいことをするの?」と思われるかもしれません。このコードのキモを分かりやすく解説します。
1. `Open … For Binary … Lock Read Write` の魔術
`TestFileAccess` 関数の中身がこのコードの肝です。VBAのファイル入出力機能を使って、強制的に「読み書き禁止のロック」をかけた状態でファイルを開こうとしています。
もしOneDriveやAutoCADがまだファイルを掴んで(ロックして)いれば、この `Open` ステートメントは確実にエラーを起こします。つまり、「エラーになる = まだ同期中や処理中」、「エラーにならない = 安全に触れる状態」という判定を完璧に行えるのです。
2. 無限ループを防ぐリトライカウンター
クラウドの同期スピードは、社内Wi-Fiの環境やファイルの容量によって変動します。そのため、`MAX_RETRY = 30`(0.5秒 × 30回 = 最大15秒)というリトライ制限を設けています。これにより、万が一ネットワークが切断された場合でも、AutoCADが永遠にフリーズしてしまうのを防いでいます。
—
陥りやすいエラーと実務での注意点
最後に、この仕組みを現場に導入する際につまづきやすいポイントを先回りしてクリアしておきましょう。
- Q: SharePointの「ファイルのチェックアウト」が有効な場合は?
- A: チェックアウトが必須なライブラリの場合、事前にVBAからWebDAV等でチェックアウト状態にするか、あらかじめユーザー側でチェックアウトさせておく必要があります。このコードはあくまで「ファイル自体の同期競合(ロック)」を防ぐものです。
- Q: ローカル環境で実行しても遅くなりませんか?
- A: ローカル環境であれば、ファイルは一瞬でロック解除されるため、実質的にリトライ1回目(0.5秒未満)でループを抜け出します。パフォーマンスへの悪影響はほとんどありません。
—
まとめ
今回は、OneDriveやSharePointなどのクラウド環境における「保存競合」をスマートに回避する、極限の同期待機ロジックを解説しました。
「動けばいいや」のコードから卒業し、こうしたインフラの特性まで考慮した堅牢なプログラムが書けるようになると、周囲からの見る目がガラリと変わります。あなたも立派な「AutoCAD自動化のアーキテクト」です。
明日からの図面バッチ処理や自動保存マクロに、ぜひこの知見を取り入れてみてください。あなたのVBAライフが、より快適でエラーのないものになることを応援しています!
