【実務・中級編】【実務中級者向け】「読み取り専用」モードでのオープン制御:他ユーザーの編集を妨げないバッチ処理 – AutoCAD VBA解析バイブル

スポンサーリンク

AutoCAD VBAを掌握せよ:共有環境で「地雷」を踏まないRead-Only開戦術

AutoCADの自動化において、最も初歩的かつ致命的なミス。それは、「何の気なしに図面をフルアクセス権限で開き、他者の業務をロックすること」だ。

集計ツールや図面情報の抽出ツールを作っている諸君。君たちの書いたコードが原因で、設計者が「ファイルがロックされていて保存できない!」と悲鳴を上げているとしたら、それはエンジニアとして失格だ。

今日は、AutoCAD VBAにおける「読み取り専用(Read-Only)」オープンの真髄を伝授する。ただコードを動かすだけでなく、「共有環境での作法」をコードに叩き込め。

—

なぜ「Read-Only」が必須なのか?

AutoCADの `Documents.Open` メソッドは、デフォルトで排他制御を行う。君のツールが図面を開いている間、そのファイルは他の設計者にとって「閲覧専用」あるいは「アクセス不可」となる。

特に、数百枚の図面を巡回して属性情報を抜き出すようなバッチ処理において、これをフルアクセスで開くのは「共有サーバーへの攻撃」に等しい。以下の3点を徹底して設計に組み込め。

1. Read-Only引数の強制: `Open` メソッドの第2引数(ReadOnly)を `True` に固定する。
2. 例外処理の構築: ファイルが開けない(既に誰かが専有している)場合、プロセスを停止させるのではなく、ログを吐いてスキップさせる。
3. メモリ解放の徹底: `Document.Close` を忘れると、AutoCADのインスタンスがゾンビ化し、PCのメモリを喰いつぶす。

—

堅牢なプロダクション・コード:安全なオープン関数

以下に、実務でそのまま使える「安全なオープン関数」のテンプレートを示す。これをモジュールとして切り出し、再利用せよ。

‘ @brief ファイルを読み取り専用で開き、オブジェクトを返す
‘ @param filePath フルパス
‘ @param doc 返り値となるドキュメントオブジェクト
‘ @return 成功時はTrue
Public Function SafeOpenDocument(ByVal filePath As String, ByRef doc As AcadDocument) As Boolean
On Error GoTo ErrorHandler

‘ ファイルの存在確認(基本中の基本)
If Dir(filePath) = “” Then
Debug.Print “File not found: ” & filePath
SafeOpenDocument = False
Exit Function
End If

‘ ReadOnly:=True を明示的に指定
‘ これにより他者の編集権を侵害しない
Set doc = Application.Documents.Open(filePath, True)

SafeOpenDocument = True
Exit Function

ErrorHandler:
Debug.Print “Error opening file: ” & filePath & ” | ” & Err.Description
SafeOpenDocument = False
End Function

‘ 使用例
Sub Example_Extraction()
Dim targetDoc As AcadDocument
Dim path As String: path = “C:\Projects\Design_A.dwg”

If SafeOpenDocument(path, targetDoc) Then
‘ — ここに抽出処理を記述 —
‘ 例: targetDoc.Blocks …

‘ 処理が終わったら即座に解放
targetDoc.Close False ‘ False = 変更を保存しない
End If
End Sub

—

現場のアーキテクトが教える3つの鉄則

1. `Close False` を信仰せよ

読み取り専用で開いた場合、最後には必ず `Close False` を叩くこと。`False`を指定することで、万が一コード内で意図しないオブジェクト変更が発生しても、DWG本体を汚染するリスクを物理的にゼロにする。

2. インスタンスの生存期間を最小化する

もし数千枚の図面を処理するなら、`Application.Documents` 内に図面を溜め込むな。1ファイル処理が終わるごとに必ず `Close` し、オブジェクト変数を `Nothing` にセットしてガベージコレクションを促すこと。これを怠ると、AutoCADは数時間でメモリ不足(Out of Memory)を引き起こす。

3. ロギングこそが最強の保守ツール

共有ファイルはネットワーク環境の影響を受けやすい。`On Error Resume Next` でエラーを握りつぶすのは三流のやることだ。必ずログファイル(CSVやテキスト)に「どの図面が、なぜ開けなかったか」を記録する実装を入れろ。

—

最後に:ツールは「透明」であれ

優れた自動化ツールとは、存在を感じさせないものだ。設計者が背後で図面を開いていることに気づかないくらい、静かに、かつ確実に処理を完遂すること。

「ReadOnly」を制する者は、AutoCADの運用を制する。今日から君の書くコードが、他者の業務を止める「ボトルネック」から、業務を加速させる「黒子」へと進化することを期待している。

実装で詰まることがあれば、またこの門を叩け。さらなる最適化のヒントを与えてやる。

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