序論:ネットワーク共有の深淵を制御せよ
CAD自動化における最大の障壁は、コードのロジックそのものではない。実行環境という名の「不確実性」だ。
特に、UNCパス(`\\Server\Share\Project.dwg`)を用いたネットワーク越しのファイル操作は、安易な実装をすればパフォーマンスの劣化、ゴーストプロセスの残留、あるいは予期せぬファイルロックといった致命的な欠陥を招く。多くのエンジニアがドライブレター(`Z:\`等)の割り当てに逃げるが、それは運用の硬直化を招く「負債の先送り」に過ぎない。
真のアーキテクトは、Windows OSのファイルシステムとAutoCADのCOMインターフェースが交差する一点において、いかにして「堅牢性」を担保すべきかを知っている。本稿では、ネットワーク共有上のDWGファイルを安全かつ高速に制御するための、至高のプラクティスを開示する。
—
1. Windows APIによる「先行偵察」
AutoCADの`Documents.Open`メソッドを呼び出す前に、我々がなすべきことは「OSレベルでの生存確認」である。AutoCADのオブジェクトモデルを介してファイルエラーを検知するのはコストが高すぎる。ネットワーク遅延やアクセス権限の欠如を、VBAのネイティブな`Dir`関数やAutoCADの例外処理で捌こうとするのは素人の仕事だ。
我々はWindows API `shlwapi.dll` を使い、カーネルレベルに近い層でパスの妥当性を検証する。
‘ Windows APIの宣言:ネットワークパスの存在確認を高速化する
Private Declare PtrSafe Function PathFileExistsW Lib “shlwapi.dll” (ByVal pszPath As LongPtr) As Long
Private Declare PtrSafe Function GetFileAttributesW Lib “kernel32.dll” (ByVal lpFileName As LongPtr) As Long
”’
”’
Public Function IsFileAccessible(ByVal strPath As String) As Boolean
‘ PathFileExistsWはUNCパスを正しく解釈する
If PathFileExistsW(StrPtr(strPath)) = 0 Then
IsFileAccessible = False
Exit Function
End If
‘ 読み取り専用属性等のチェック(必要に応じて拡張)
Dim attrs As Long
attrs = GetFileAttributesW(StrPtr(strPath))
If attrs = -1 Then
IsFileAccessible = False
Else
IsFileAccessible = True
End If
End Function
—
2. 実装:UNCパスを掌握する「セーフ・オープン」
AutoCAD VBAにおいて、ネットワーク上のファイルを開く際に最も警戒すべきは、「誰かが既に開いている(Read-Only)」状態と、「ネットワークの瞬断」である。
以下のコードは、単にファイルを開くだけではない。読み取り専用で開くべきかどうかの制御、そしてAutoCAD Applicationのビジー状態を考慮した設計となっている。
プロフェッショナルなオープン処理の実装
”’
”’
”’ UNCパスを含むフルパス
”’ 読み取り専用で開く場合はTrue
Public Function SecureOpenDWG(ByVal dwgPath As String, Optional ByVal readOnly As Boolean = False) As AcadDocument
On Error GoTo ErrorHandler
Dim objDoc As AcadDocument
‘ 1. 事前検証(APIによる低レイヤチェック)
If Not IsFileAccessible(dwgPath) Then
Err.Raise 53, “SecureOpenDWG”, “指定されたUNCパスにアクセスできないか、ファイルが存在しません: ” & dwgPath
End If
‘ 2. AutoCADのドキュメントコレクションへアクセス
‘ 既に開いている場合はそのオブジェクトを返す(多重オープン防止)
For Each objDoc In ThisDrawing.Application.Documents
If LCase(objDoc.FullName) = LCase(dwgPath) Then
Set SecureOpenDWG = objDoc
Exit Function
End If
Next
‘ 3. オープン実行
‘ 第2引数をTrueにすることで、ネットワーク越しの競合を回避する
Set objDoc = ThisDrawing.Application.Documents.Open(dwgPath, readOnly)
‘ 4. インスタンスの返却
Set SecureOpenDWG = objDoc
Exit Function
ErrorHandler:
‘ エラーログの記録(社内システム管理者が追跡できるよう詳細に)
Debug.Print “Error: ” & Err.Number & ” – ” & Err.Description
Set SecureOpenDWG = Nothing
End Function
—
3. メモリ最適化とオブジェクトのライフサイクル管理
AutoCAD VBAにおける「メモリリーク」や「ゾンビプロセス(AutoCAD終了後もプロセスが残る現象)」の多くは、オブジェクト参照の不適切な解放に起因する。特にネットワーク上のファイルを扱う場合、I/O待ちが発生するため、COM参照の管理は極めてシビアに行わなければならない。
黄金の解放ルール
1. Set Nothingの徹底: プロシージャを抜ける前に、必ずローカルの`AcadDocument`変数を解放せよ。
2. Closeメソッドの明示: 保存が不要なら `False` を明示して閉じよ。
Public Sub BatchProcessNetworkFiles()
Dim targetPath As String
targetPath = “\\192.168.1.100\Shared\Projects\Standard_Detail.dwg”
Dim doc As AcadDocument
Set doc = SecureOpenDWG(targetPath, True) ‘ 読み取り専用で安全に取得
If Not doc Is Nothing Then
‘ — ここに自動化ロジックを記述 —
Debug.Print “Processing: ” & doc.Name
‘ 処理が終われば即座に閉じる(ネットワークリソースの解放)
doc.Close False
Set doc = Nothing ‘ COMリファレンスカウントを減少させる
End If
End Sub
—
4. レガシー環境とモダンインフラの架け橋
社内システム管理者が直面する問題として、古いNAS(SMB 1.0/2.0)とWindows 10/11の認証仕様の不一致がある。VBA側でこれに対処することは不可能だが、「遅延(Latency)」に対してはコードで抗うことができる。
ネットワーク越しに大量の図面を走査する場合、`Application.ScreenUpdating = False`(VBA一般的手法)ではなく、AutoCAD特有の「バックグラウンド処理」を意識すべきだ。可能であれば、`AcadApplication`自体を非表示(`Visible = False`)でインスタンス化し、サイドプロセスとして処理を完遂させるのが、シニアエンジニアの流儀である。
—
結論:システムとしての「美しさ」とは
UNCパスを扱うことは、単なる文字列操作ではない。それは、ネットワークプロトコル、Windowsのファイルシステム、そしてAutoCADという巨大なCOMサーバーの三者を調停する行為である。
本稿で示したAPIによる先行チェックと、厳密なオブジェクト管理を徹底すれば、共有フォルダ上の図面操作で致命的なクラッシュを招くことはない。コードの裏側に潜む「物理的なネットワーク」を想像せよ。それができて初めて、あなたはVBAという道具を真に掌握したと言えるのだ。
