【実務・中級編】【初心者向け】UNCパスを用いたネットワーク共有上のDWGファイルを安全に開く方法 – AutoCAD VBA解析バイブル

スポンサーリンク

AutoCAD VBAを掌握する極限の知見
第1章:ネットワーク社会の罠と生きていく——UNCパスで図面を制圧せよ

開発プロジェクトの現場で、こんなコードを見たことはないだろうか。

‘ 【反面教師となる危険なコード】
Dim targetFile As String
targetFile = “D:\Drawings\2023\P-101.dwg”
Workbooks.Open targetFile ‘ ※Excel脳の混入は論外としても
Application.Documents.Open targetFile

一見、何の問題もないように見える。だが、このコードを書いた瞬間、あなたの自動化ツールは「使えない不良品」の烙印を押される。なぜなら、社内ネットワークの共有サーバー運用において、「ドライブレター(`D:`や`Z:`など)」の割り当ては個人のPC環境によってバラバラだからだ。

ある設計者のPCでは共有フォルダが `Zドライブ` としてマウントされていても、別の設計者の環境では `Xドライブ` であったり、あるいはネットワークドライブとして割り当てられてすらいないかもしれない。この環境依存性こそが、実務におけるバグの温床であり、情シスへの問合せを増大させる最大の癌である。

今回は、AutoCAD VBAを用いた図面ファイルのオープン制御において、UNCパス(Universal Naming Convention)を完全に手なずけ、ネットワーク上のDWGファイルを頑健(ロバスト)に開くための極意を伝授する。

—

1. なぜUNCパスなのか? ――物理アドレスを直叩きする優位性

UNCパスとは、ネットワーク上のリソースを `\\サーバー名\共有フォルダ名\ファイルパス` という形式で一意に特定する記述方式だ。

  • × ドライブレター依存: `Z:\PJ_A\DWG\01.dwg` (PCごとのマウント状況に左右される)
  • 〇 UNCパス指定: `\\cad-server01\projects\PJ_A\DWG\01.dwg` (ネットワーク上の位置を絶対的に指し示す)

AutoCAD VBAでバッチ処理や自動化スクリプトを組む場合、対象図面がNASやファイルサーバーなどのネットワーク上に存在することは日常茶飯事である。ドライブレターに頼る設計は、チームメンバーのPC環境が変わっただけで即座に「ファイルが見つかりません (Error 53)」を吐き出す脆弱なコードを生む。

プロのエンジニアであれば、最初からUNCパスを前提とした設計を行うべきだ。

—

2. ネットワーク越しのファイル操作における3大リスク

サーバー上のDWGファイルを扱う際、ローカル環境とは比較にならないほどのトラブル要因が潜んでいる。

1. レイテンシーとタイムアウト: ネットワークの負荷やサーバーの省電力モード(スリープ)により、ファイルアクセスの応答が遅延する。
2. 排他制御(ファイルロック): 他のユーザーがすでにその図面を開いている場合、読込専用(Read-Only)で開くか、処理をスキップするハンドリングが必須となる。
3. 存在確認の欠落: パスが存在しない状態で `Documents.Open` を実行すると、容赦なく実行時エラーでVBAの処理がクラッシュする。

これらをすべてクリアし、実務の荒波に耐えうる「プロダクションコード」を次項で公開する。

—

3. 【コピペ即採用】堅牢なUNCパスオープン・プロシージャ

以下のコードは、エラーハンドリング、UNCパスのバリデーション、そしてファイルロックの考慮を組み込んだ、実務レベルのテンプレートだ。そのままモジュールに貼り付けて利用してほしい。

Option Explicit

” =================================================================
” 概要: UNCパスを用いてネットワーク上のDWGファイルを安全に開く
” 備考: エラーハンドリングとファイル存在確認を徹底したプロダクションコード
” =================================================================
Public Sub OpenDrawingFromNetwork()

Dim serverPath As String
Dim targetDoc As Document

‘ 【重要】必ず “\\サーバー名\共有名\…” のUNCパス形式で指定すること
serverPath = “\\cad-server01\drawings\2024\Structural\ST-001.dwg”

‘ 1. パスの構文チェック(簡易的に先頭が “\\” で始まっているか確認)
If Not IsUncPath(serverPath) Then
MsgBox “エラー: UNCパス形式(\\サーバー名\…)で指定してください。”, vbCritical, “パス形式不正”
Exit Sub
End If

‘ 2. ネットワーク上のファイル存在確認(FileSystemObjectを使用)
If Not CheckFileExists(serverPath) Then
MsgBox “指定された図面ファイルが見つかりません、またはネットワークに接続されていません。” & vbCrLf & _
“パス: ” & serverPath, vbExclamation, “ファイル不在”
Exit Sub
End If

‘ 3. すでにAutoCADで開かれていないかの確認(オプション)
If IsDocumentAlreadyOpen(serverPath) Then
MsgBox “この図面はすでに開かれています。”, vbInformation, “スキップ”
Exit Sub
End If

‘ 4. 安全なオープン処理(エラー監視下で行う)
On Error GoTo ErrorHandler

‘ Documents.Open メソッド
‘ 引数: 読み取り専用で開くか (True/False)
Set targetDoc = ThisDrawing.Application.Documents.Open(serverPath, False)

‘ 処理成功時の処理
MsgBox “図面のオープンに成功しました: ” & targetDoc.Name, vbInformation, “完了”

Exit Sub

ErrorHandler:
‘ ネットワーク切断やファイル破損など、予期せぬエラーのキャッチ
MsgBox “図面のオープン中に致命的なエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“詳細: ” & Err.Description, vbCritical, “致命的エラー”

End Sub

” =================================================================
” 補助関数: 文字列がUNCパス形式か判定する
” =================================================================
Private Function IsUncPath(ByVal pathStr As String) As Boolean
‘ 先頭が “\\” で始まっているか
If Left$(pathStr, 2) = “\\” Then
IsUncPath = True
Else
IsUncPath = False
End If
End Function

” =================================================================
” 補助関数: FileSystemObjectを用いたファイル存在確認
” =================================================================
Private Function CheckFileExists(ByVal filePath As String) As Boolean
Dim fso As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)

CheckFileExists = fso.FileExists(filePath)

Set fso = Nothing
End Function

” =================================================================
” 補助関数: 該当ドキュメントがすでに開かれているかチェック
” =================================================================
Private Function IsDocumentAlreadyOpen(ByVal filePath As String) As Boolean
Dim doc As Document
Dim fso As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)

Dim targetFileName As String
targetFileName = fso.GetFileName(filePath)

IsDocumentAlreadyOpen = False

For Each doc In ThisDrawing.Application.Documents
‘ ファイル名の大文字小文字を区別せずに比較
If StrComp(doc.FullName, filePath, vbTextCompare) = 0 Then
IsDocumentAlreadyOpen = True
Exit For
End If
Next doc

Set fso = Nothing
End Function

—

4. チーフアーキテクトからの実践的アドバイス

上記のコードを実装するにあたり、現場のエンジニアへ向けてさらにワンランク上の知見を共有しよう。

パフォーマンスの罠:FSOの過信は禁物

ネットワーク環境下において、`Scripting.FileSystemObject` の `FileExists` は、ネットワークの応答速度(レイテンシー)に強く依存する。もし数千枚の図面を一括処理するようなバッチツールを組む場合、ループの都度 `FileExists` を呼ぶと、それだけで途方もない時間(フリーズしたかのような遅延)が発生する。
一括処理を行う場合は、事前の接続確認を一度だけ行い、ループ内での無駄なI/Oアクセスを極力削る設計思想が求められる。

バックグラウンド処理における注意点

もしこのコードをExcelなどの外部アプリケーションから `CreateObject(“AutoCAD.Application”)` で起動したAutoCADに対してリモート実行する場合、UNCパスの解決に失敗することが稀にある。AutoCADがセキュアなコンテキストで起動している場合、ネットワークリソースへのアクセス権限(認証情報のキャッシュなど)が引き継がれないケースがあるためだ。
外部起動の場合は、必ず事前にネットワークドライブの疎通が確保されている状態、あるいはローカルに一度キャッシュを落とす設計とのハイブリッドを検討してほしい。

—

総括

ドライブレターという「ローカルな幻想」を捨て、UNCパスという「絶対的な座標」をコードに組み込むこと。
これこそが、ネットワーク共有時代のAutoCAD VBA開発における第一歩であり、保守性の高いシステム構築の絶対条件である。

あなたの書くコードが、環境の変化に怯えない、美しく強靭なものであることを期待している。

タイトルとURLをコピーしました