こんにちは!AutoCAD VBAの世界へようこそ。
日々、大量の図面整理やバッチ処理に追われていませんか?「マクロの記録」から一歩踏み出し、自らコードを書くようになったあなたなら、きっとこう思ったことがあるはずです。
「VBAで図面を連続保存するプログラムを書いたのに、なぜか時々ファイルが破損する…」
「保存した直後のファイルを別のプログラムで処理しようとしたら、エラーで弾かれた…」
もし心当たりがあるなら、おめでとうございます。あなたは今、AutoCAD VBAの「本当の壁」、そしてプログラミング中級者への扉の前に立っています。
今回は、AutoCADの裏側でうごめく「非同期書き込み」の罠を暴き、それを完璧に手なずけるための「保存完了検知ループ」の極意を伝授します。ここをクリアすれば、あなたの作ったマクロは一気に「実務レベルの堅牢性」を手に入れますよ。一緒にマスターしていきましょう!
—
なぜ図面の保存でエラーが起きるのか?(非同期書き込みの正体)
私たちがVBAから `ThisDrawing.Save` や `SaveAs` を実行したとき、AutoCADはどう動いているでしょうか?
初心者のうちは、コードの実行が終わった瞬間に、ハードディスクへの書き込みも完全に終わっていると思いがちです。しかし、これが大きな誤解。
AutoCADはパフォーマンスを維持するため、保存命令を受け取ると、OSに対して「裏側でよしなにファイル書き込みよろしく!」(非同期処理 / Async)と投げ、VBAのプログラムには「保存命令出したよ!」と即座に制御を返します。
つまり、VBA側は「保存が終わった」と勘違いしているのに、実際にはハードディスクの上ではまだガリガリとデータ書き込みの真っ最中というタイムラグ(隙間)が生まれるのです。
この絶妙なタイミングで、保存されたばかりのファイルを開こうとしたり、次の処理(例えばPDF変換や外部サーバーへのアップロードなど)を行ったりすると……はい、お馴染みの「ファイルが使用中です」エラーや、最悪の場合は「データ破損(ゼロバイトファイルの生成)」を引き起こすわけです。
—
解決策:VBAの「待ち」の美学
この非同期の闇に対抗するためには、VBA側に「本当に書き込み終わるまで、行儀よくその場で待つ(ポーリングする)」という処理を実装する必要があります。
ただ待つといっても、`Application.Wait` でただボーッと時間を潰すのは、プログラミングの世界では「ダサい」とされています。図面の大きさによって保存にかかる時間はバラバラだからです(数MBの図面と、外部参照てんこ盛りの500MBの図面では、完了時間が全く異なりますよね)。
私たちが実装すべきなのは、「ファイルのロック状態」や「AutoCADのデータベース状態」を監視し、安全が確認できたら一瞬で次の処理へ移行するスマートな待機ループです。
—
【実践】保存完了を検知する堅牢なVBAコード
それでは、実務の現場でそのまま使える完全版のコードをお見せします。
今回は、安全に名前をつけて保存(SaveAs)を行い、完全に書き込みが完了したことを確認してから次のステップに進むプロシージャです。
Sub SafeSaveAndVerify()
Dim targetDoc As AcadDocument
Set targetDoc = ThisDrawing
‘ 保存先のパスとファイル名を指定
Dim savePath As String
savePath = “C:\AutoCAD_Data\Sample_Completed.dwg”
On Error GoTo ErrorHandler
‘ 1. 保存命令の実行(AutoCADに非同期の保存を指示)
‘ ※ACAD2004形式で保存する場合の例
targetDoc.SaveAs savePath, ac2004_dwg
‘ 2. 【核心】書き込み完了を検知する待機ループ
Debug.Print “図面の保存処理を開始しました。完了を待っています…”
Dim isSaved As Boolean
isSaved = False
Dim startTime As Double
startTime = Timer ‘ タイムアウト計測用
Do While Not isSaved
‘ AutoCADに他のイベント処理を譲る(これがないとAutoCADがフリーズしたように固まります)
DoEvents
‘ 【チェック方式A】ファイルが独占排他制御(書き込み中)から解放されたか確認
If IsFileReady(savePath) Then
isSaved = True
End If
‘ タイムアウト処理(万が一の無限ループ防止:30秒で打ち切り)
If Timer – startTime > 30 Then
Err.Raise vbObjectError + 1000, “SafeSave”, “保存処理がタイムアウトしました。ファイル容量を確認してください。”
End If
‘ CPUの負荷を下げるためにわずかにウェイトを入れる(約0.1秒待機)
AppActivate Application.Caption
Application.Wait (Now + TimeValue(“0:00:01”) / 10)
Loop
MsgBox “図面の保存と書き込み完了の確認に成功しました!”, vbInformation
Exit Sub
ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
End Sub
‘ ==========================================================
‘ 補助関数:ファイルが他のプロセスから占有されておらず、
‘ 読み書き可能な状態(=書き込み完了)かを判定する関数
‘ ==========================================================
Private Function IsFileReady(filePath As String) As Boolean
Dim fileNum As Integer
‘ ファイルが存在しない場合はまだ保存されていないとみなす
If Dir(filePath) = “” Then
IsFileReady = False
Exit Function
End If
On Error GoTo FileIsBusy
‘ 試しにバイナリモードで排他オープンしてみる
fileNum = FreeFile
Open filePath For Binary Access Read Write Lock Read Write As #fileNum
‘ エラーなく開けたら、書き込みは完了している(ロックが外れた)
Close #fileNum
IsFileReady = True
Exit Function
FileIsBusy:
‘ エラー番号 70 は「書き込み許可ン拒否(Permission denied)」
‘ まだAutoCADがファイルをつかんで書き込んでいる最中
IsFileReady = False
Exit Function
End Function
—
コードの解説:ここがエンジニアのこだわりポイント!
1. `DoEvents` の魔法
ループの中に必ず `DoEvents` を入れてください。これを忘れると、VBAがループの渦中でフリーズし、AutoCADの画面が真っ白になって操作を受け付けなくなります。「OSに息継ぎのタイミングを与える」ための必須呪文です。
2. `Open … For Binary Access Read Write` による排他チェック
補助関数 `IsFileReady` のミソは、「実際にそのファイルをVBAから開けるか試してみる」という力技でありながら非常に確実なアプローチです。AutoCADが書き込みを行っている間は、OSがファイルに鍵(ロック)をかけているため、VBAから開こうとするとエラー(番号70)になります。この「エラーが出なくなる瞬間=書き込み完了」とみなすわけです。
3. タイムアウト機構の搭載
プログラミングにおいて「無限ループ」は最大の悪です。何らかの原因で保存がスタックしたときに、マクロが永遠に終わらなくなるのを防ぐため、`Timer` 関数を使って「30秒過ぎたら強制終了(エラー発生)」させる安全弁を必ず仕込んでおきましょう。
—
陥りやすい罠と注意点
- ネットワークドライブ(共有サーバー)での注意
社内のファイルサーバー(NASなど)に対してこのコードを実行する場合、ネットワークの遅延によって `IsFileReady` が正常に機能するまでに少し時間がかかることがあります。その場合は、タイムアウトの時間を少し長めに(60秒など)設定してください。
- アンチウイルスソフトの干渉
保存された瞬間に、バックグラウンドで動いているセキュリティソフト(Windows Defenderなど)がファイルをスキャンするために一瞬ファイルをロックすることがあります。このループ処理は、そうした「予期せぬ外部要因による一時的なファイルロック」をも華麗にやり過ごせるのが最大の強みです。
—
まとめ:ここをクリアすれば、もう怖くない!
今回は、AutoCAD VBAにおける「非同期書き込みの罠」と、それを鮮やかに回避する「保存完了検知ループ」の実装方法を解説しました。
最初は少し難しく感じたかもしれませんが、
- 「保存を命令する」
- 「ファイルが自由に触れるようになるまで賢く待つ」
この2ステップを意識するだけで、あなたの作るAutoCADマクロの信頼性はプロのエンジニアが作ったツールと同等のレベルに跳ね上がります。
ここをクリアしたあなたなら、もう「マクロの記録」の卒業生ではありません。立派なAutoCAD自動化エンジニアです。ぜひ、日々の業務効率化にこの知見を役立ててくださいね。それでは、次回の極意でお会いしましょう!
