ネットワーク上のDWGを「無傷」で開く:AutoCAD VBAにおける堅牢なファイルハンドリング術
AutoCAD VBAで業務を自動化する際、ローカルのファイル操作は「遊び」に過ぎません。真の戦場は、ネットワーク共有フォルダ(UNCパス)です。
「なぜか共有フォルダのファイルが開けない」「たまにVBAがフリーズする」。これらは運が悪いのではなく、あなたのコードが「ネットワークの不安定さ」を考慮していないからです。
今日は、AutoCAD VBAを掌握し、現場のインフラ環境に左右されない「鋼鉄のファイル制御」を伝授します。
—
1. なぜUNCパスで「ファイルが見つからない」と怒られるのか
初心者が陥る最大の罠は、パスの扱いをOS任せにすることです。
ネットワークパス(`\\Server\Folder\Drawing.dwg`)は、ローカルドライブと異なり、以下の要素が不確定です。
- 名前解決の遅延: サーバー応答が0.1秒遅れるだけで、VBAは「ファイル不在」と判断してエラーを吐きます。
- 権限の揺らぎ: CADがファイルを開く際、ロックファイル(.dwl)の生成権限が一時的に失われることがあります。
- カレントディレクトリの罠: VBAの`ThisDrawing.Open`は、カレントディレクトリの状態に左右されることがあります。
これらを解決するための「唯一の正解」は、「絶対パスを厳密に生成し、存在確認を物理的に行ってから開く」という3段階の防衛策です。
—
2. 現場で使える「最強のファイルオープン・アーキテクチャ」
以下のコードは、単にファイルを開くだけではありません。ファイルロックの有無、パスの妥当性、AutoCADのドキュメント状態を網羅的にチェックするプロダクションレベルの関数です。
‘ —————————————————————————
‘ 関数名: SafeOpenDrawing
‘ 用途: UNCパスのDWGを堅牢に開く
‘ —————————————————————————
Public Function SafeOpenDrawing(ByVal fullPath As String) As AcadDocument
Dim doc As AcadDocument
‘ 1. ファイルの存在確認(FileSystemObjectを使用)
Dim fso As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)
If Not fso.FileExists(fullPath) Then
Err.Raise vbObjectError + 1001, “SafeOpenDrawing”, “ファイルが存在しません: ” & fullPath
End If
‘ 2. 既に開いているか確認(パフォーマンス低下を防ぐ)
For Each doc In Application.Documents
If StrComp(doc.FullName, fullPath, vbTextCompare) = 0 Then
Set SafeOpenDrawing = doc
Exit Function
End If
Next
‘ 3. エラーハンドリングを伴うオープン処理
On Error Resume Next
Set SafeOpenDrawing = Application.Documents.Open(fullPath)
If Err.Number <> 0 Then
MsgBox “開けませんでした。ネットワーク接続を確認してください。” & vbCrLf & Err.Description, vbCritical
Set SafeOpenDrawing = Nothing
End If
On Error GoTo 0
End Function
—
3. 失敗しないための「極限の設計」3ヶ条
① UNCパスは必ず「完全修飾パス」で記述する
`”\\Server\Project\File.dwg”`のように、必ずフルパスで指定してください。ドライブレター(`Z:\…`)に依存するのは、ネットワークが切断された瞬間にツールが全滅するリスクを抱えるのと同じです。
② ファイルロック(DWLファイル)を無視しない
ネットワーク環境では、他の誰かがファイルを開いている可能性があります。`Open`メソッドの引数を工夫するか、上記コードのように`On Error`で適切にトラップし、ユーザーに「誰かが開いています」と警告を出せるフローを組み込んでください。
③ データベース連携時の注意点
もしDWGから情報を抽出してExcelやDBに書き込む処理をする場合、「開くたびに保存せず、読み取り専用で開く」という戦略が極めて有効です。
`Application.Documents.Open(fullPath, True)` とすることで、ロックのリスクを最小化できます。
—
4. 最後に:プロのエンジニアとしてのマインドセット
AutoCAD VBAは古くから存在する言語ですが、その挙動を「運」に頼っているうちは、いつまで経っても「初心者」です。
- 「開けるはずだ」という性善説を捨てること。
- ネットワークは常に切断されると想定すること。
- エラーハンドリングを「面倒な作業」ではなく「品質の証明」と捉えること。
この視点を持つだけで、あなたの書くツールは「たまに動くおもちゃ」から「現場を支えるインフラ」へと昇華します。
あなたのコードが、今日もどこかの誰かの業務を救うことを願っています。次のステップとして、このコードをクラスモジュールに組み込み、エラーログをCSVに吐き出す仕組みを作ってみてください。それだけで、あなたのエンジニアとしての価値は一段階跳ね上がります。
