【AutoCAD VBA】Dropbox/OneDriveの同期待ちを制せ!図面保存の「落とし穴」を回避する極限の同期制御術
こんにちは。AutoCADの自動化の深淵へようこそ。
現場でバリバリと図面を自動化していると、必ずぶち当たる壁があります。そう、「ファイル保存直後のロック問題」です。特に最近はDropboxやOneDriveなどのクラウドストレージ上で図面を管理するのが当たり前になりましたよね。
「保存したはずなのに、次の処理に進むとエラーになる」「ファイルが使用中と判定される」。これは、AutoCADの保存処理とクラウドの同期処理のタイミングが食い違っていることが原因です。
今日は、マクロの記録を卒業したあなたへ、「同期状態を考慮したセーブ待機ロジック」という、プロの現場でしか語られない極上のテクニックを授けます。
—
1. なぜ「保存」は不安定なのか?
AutoCADで `ThisDrawing.Save` を実行した瞬間、AutoCADはファイルシステムに対して「書き込み」を要求します。しかし、クラウドストレージは、ファイルが閉じられた(あるいは書き込みが完了した)ことを検知した瞬間に「アップロード(同期)」を開始します。
もし、同期が終わる前に次の図面を開こうとしたり、バックアップ処理を走らせたりすると、クラウド側がファイルをロックしてしまい、「アクセス拒否」や「ファイルが使用中です」という非情なエラーが返ってきます。
これを回避するには、「保存完了をただ待つ」のではなく、「ファイルが解放されたことを確認する」必要があります。
—
2. 実践!同期監視ロジックの構築
今回のロジックの肝は、`CreateObject(“Scripting.FileSystemObject”)` を使い、対象ファイルに排他アクセスを試みることで「現在ロックされているか」を判定することです。
実装コード
この関数を共通モジュールに仕込んでおけば、どんな自動化処理にも組み込めます。
Option Explicit
”’
”’
Public Sub SafeSaveAndSync(ByVal dwgPath As String, ByVal timeoutSeconds As Integer)
Dim fso As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ 1. まず保存を実行
ThisDrawing.Save
‘ 2. 同期完了までループで待機(最大timeoutSecondsまで)
Dim startTime As Double
startTime = Timer
Do While (Timer – startTime) < timeoutSeconds
' ファイルがロックされているかテスト
If IsFileReady(dwgPath) Then
Debug.Print "同期完了を確認しました。"
Exit Sub
End If
' CPU負荷を抑えるための小休止(0.5秒)
Sleep 500
DoEvents ' AutoCADがフリーズしないように制御権を解放
Loop
MsgBox "警告: 同期が完了しないままタイムアウトしました。", vbExclamation
End Sub
'''
”’
Private Function IsFileReady(ByVal filePath As String) As Boolean
On Error Resume Next
Dim fileNum As Integer
fileNum = FreeFile
‘ 排他モードで開いてみる(開けたら=ロックされていない)
Open filePath For Binary Access Read Write Lock Read Write As #fileNum
If Err.Number = 0 Then
IsFileReady = True
Else
IsFileReady = False
End If
Close #fileNum
On Error GoTo 0
End Function
‘ Windows APIを使用して正確な待機を行う
If VBA7 Then
Private Declare PtrSafe Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As Long)
Else
Private Declare Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As Long)
End If
—
3. このコードを理解するための「極意」
① `DoEvents` の魔法
AutoCADのVBAはシングルスレッドです。待機中に `DoEvents` を入れないと、AutoCAD自体が「応答なし」状態になります。プロの現場では、「処理を止めるな、でも負荷をかけるな」が鉄則です。`Sleep` と `DoEvents` の組み合わせが、その黄金比です。
② 排他アクセス判定(IsFileReady)
`Open … Lock Read Write` という記述は、ファイルに対して「自分以外に誰も触らせない」という権利を要求するものです。もしクラウドストレージが同期中であれば、ファイルシステムは「許可しません」と返してきます。この拒否反応を逆手に取って、「同期中かどうか」を判定しているのです。
③ 陥りやすいエラー:ファイルパスの罠
初心者が最もやりがちなミスは、`ThisDrawing.FullName` が空(未保存の図面)の状態でこのコードを実行することです。必ず `If ThisDrawing.Path <> “” Then` といったガード節を入れて、未保存状態を排除してから実行するようにしてください。
—
最後に:自動化の先にある世界
このコードをマスターしたあなたは、もう「マクロが時々止まる理由がわからない」という悩みからは解放されます。
AutoCADのAPIは非常に強力ですが、「外部環境(OSやネットワーク)」との境界線でいかに振る舞うかが、エンジニアとしての格を決めるのです。この同期制御ロジックは、DropboxやOneDriveだけでなく、ネットワークドライブ上の運用でもそのまま活用できます。
「安定稼働」こそが、業務自動化の最大の価値です。ぜひ、あなたの図面処理ツールにこの「待ちの技術」を組み込んでみてください。
もし、さらに高度な「バックグラウンドでのDWG解析」や「COMオブジェクトの解放制御」に興味があれば、いつでも聞いてください。AutoCADの深淵で、またお会いしましょう。
