【AutoCAD VBA】ネットワーク上のDWGを安全に開くための「絶対原則」と実装テクニック
こんにちは。AutoCADの自動化の世界へようこそ。
「マクロの記録」から一歩踏み出し、自らコードを書こうとするあなたのその姿勢、素晴らしいですね。
業務でよくあるのが、「ネットワーク共有フォルダ(UNCパス)にあるDWGファイルを、VBAで一括処理したい」というケースです。しかし、実はここには初心者が見落としがちな「落とし穴」がいくつか存在します。
今日は、私が現場で培ってきた「エラーを回避し、堅牢にファイルを扱うための極意」を伝授します。
—
1. なぜ「UNCパス」が問題になるのか?
まず、ファイルパスの指定方法について整理しましょう。
- ローカルパス: `C:\Project\Drawing.dwg`
- UNCパス: `\\ServerName\SharedFolder\Drawing.dwg`
AutoCAD VBAでファイルを操作する際、多くの初心者が陥るのが「ファイルが存在しているか確認せずに開こうとしてエラーになる」、あるいは「AutoCADがファイルを開く準備ができる前に次の処理に進んでしまい、処理が失敗する」という現象です。
特にネットワーク越しの場合、通信速度やサーバーの負荷によって、ファイルが開くまでの時間は変動します。これを制御するのが、プロのエンジニアの仕事です。
—
2. 現場で使える「安全なオープン」コード
それでは、実際に堅牢なコードを見ていきましょう。このコードをコピーして、あなたのモジュールに貼り付けてください。
Sub OpenDrawingFromNetwork()
Dim dwgPath As String
Dim targetDoc As AcadDocument
‘ ネットワーク上のファイルパス(UNC形式)
dwgPath = “\\ServerName\SharedFolder\Project\Sample.dwg”
‘ 1. ファイルの存在確認(これを怠ると致命的なエラーになります)
If Dir(dwgPath) = “” Then
MsgBox “ファイルが見つかりません。パスを確認してください。” & vbCrLf & dwgPath, vbCritical
Exit Sub
End If
‘ 2. 読み取り専用で開く(他者の編集ロック回避のため)
‘ Application.Documents.Open メソッドを使用
On Error Resume Next ‘ 万が一のロックエラーを捕捉
Set targetDoc = Application.Documents.Open(dwgPath, True)
If Err.Number <> 0 Then
MsgBox “ファイルを開く際にエラーが発生しました。” & vbCrLf & “原因: ” & Err.Description, vbCritical
Err.Clear
Exit Sub
End If
On Error GoTo 0
‘ 3. ファイルが開かれるまで待機する(ここが重要!)
‘ ファイルが大きい場合、開いた直後のオブジェクトにアクセスすると失敗します
Do While targetDoc.ActiveSpace = acPaperSpace And targetDoc.ActiveSpace = acModelSpace
DoEvents ‘ 処理を一旦OSに渡し、AutoCADの読み込みを待つ
Loop
MsgBox “図面を開きました: ” & targetDoc.Name
‘ 終了処理(テスト後はCloseしてください)
‘ targetDoc.Close False
End Sub
—
3. ここをクリアすれば一人前!3つの重要ポイント
① `Dir` 関数での存在確認は必須
`Open` メソッドをいきなり叩くのは、目隠しをして道を歩くようなものです。`Dir` 関数を使えば、そのパスにファイルが実在するかを即座にチェックできます。ネットワーク環境では「実はファイルが移動していた」というケースが頻発するため、この一手間が信頼性を高めます。
② `ReadOnly`(読み取り専用)の活用
ネットワーク上のファイルは、他の誰かが開いている可能性があります。`Application.Documents.Open(dwgPath, True)` の `True` は、「読み取り専用で開く」という指定です。書き込みの必要がない集計・確認作業であれば、常に `True` を指定することで、他ユーザーとの競合によるエラーを未然に防げます。
③ `DoEvents` の魔法
AutoCAD VBAはシングルスレッドで動いています。巨大な図面を開く際、OSは「図面を開く」という重い作業にリソースを集中させます。その間、VBAコードが次の行を高速で実行しようとすると、まだ準備できていないメモリ領域にアクセスしてしまい、AutoCADごとクラッシュすることがあります。`DoEvents` を適度に挟むことで、AutoCADの処理を邪魔せず、スムーズにバトンを渡すことができます。
—
最後に:エンジニアとしてのマインドセット
AutoCAD VBAにおいて、最も大切なのは「期待通りに動くこと」ではなく「例外が起きてもシステムが壊れないこと」です。
ネットワーク越しの操作は、不安定な要素の塊です。「ファイルがないかもしれない」「誰かが開いているかもしれない」「サーバーが重いかもしれない」。そうした「~かもしれない」という不安を一つずつコードで潰していく作業こそが、自動化エンジニアとしての醍醐味です。
まずはこのコードをベースに、ご自身の環境で試してみてください。ここをクリアすれば、あなたはもうマクロの記録から卒業し、確かな一歩を踏み出したことになります。
応援していますよ。困ったことがあれば、またいつでも聞きに来てください。
