【AutoCAD VBA】大規模図面の「呪縛」を解く。外部参照(Xref)を無視して爆速で開く技術
AutoCADで数千枚の図面をバッチ処理する際、多くのエンジニアが直面する壁がある。そう、「外部参照(Xref)の読み込み待ち時間」だ。
大規模なプロジェクトになればなるほど、図面には無数の外部参照がリンクされている。VBAで `Documents.Open` を実行した瞬間、AutoCADは律儀にそれら全てのリンク先を探し、読み込み、再生成を行う。この「親切心」が、自動化ツールにおいては致命的なボトルネックとなる。
今日は、業務効率化の最前線に立つ君たちへ、「不要な外部参照を読み込まず、図面を瞬時に開く」ための極限のテクニックを伝授する。
—
なぜ「そのまま開く」ことが罪なのか
AutoCADは図面を開く際、デフォルトで全ての外部参照をロードしようとする。ネットワーク越しに配置された巨大な外部参照や、リンク切れの図面が混ざっている場合、タイムアウトやフリーズが頻発する。
これを解決する唯一の正攻法は、システム変数 `DEMANDLOAD` を一時的に操作し、図面オープン時の挙動を制御することだ。
—
実装のコア:`DEMANDLOAD` の制御
`DEMANDLOAD` は、外部参照の要求ロード(Demand Loading)を制御するシステム変数である。これを一時的に「0(読み込まない)」に設定することで、図面内の参照情報を無視して、ホスト図面のデータのみをメモリに展開できる。
実践的プロダクションコード
以下のコードは、エラーハンドリングを徹底し、オープン後に必ずシステム変数を復元する「堅牢な設計」を採用している。
‘ ———————————————————
‘ 目的: 外部参照をロードせずにDWGを高速オープンする
‘ ———————————————————
Public Sub OpenDrawingFast(ByVal filePath As String)
Dim doc As AcadDocument
Dim originalDemandLoad As Integer
‘ 1. 現在のシステム変数を退避
originalDemandLoad = ThisDrawing.GetVariable(“DEMANDLOAD”)
‘ 2. 外部参照の要求ロードを無効化 (0: ロードしない)
ThisDrawing.SetVariable “DEMANDLOAD”, 0
On Error GoTo ErrorHandler
‘ 3. 図面を開く
Set doc = Application.Documents.Open(filePath, False)
‘ — ここに高速処理を記述 —
Debug.Print “高速ロード完了: ” & doc.Name
‘ 終了処理へ
GoTo Finally
ErrorHandler:
MsgBox “図面のオープンに失敗しました: ” & Err.Description, vbCritical
Finally:
‘ 4. 必ずシステム変数を元に戻す(重要!)
ThisDrawing.SetVariable “DEMANDLOAD”, originalDemandLoad
End Sub
—
このコードを「業務レベル」に昇華させるための注意点
単に動くだけのコードでは、現場の運用には耐えられない。以下の3つの鉄則を守れ。
1. 状態の復元(Finallyブロックの概念)
VBAには `Try-Finally` 構文がない。そのため、`On Error GoTo` を駆使して、異常終了時であっても `SetVariable` が必ず実行される設計にしなければならない。これを怠ると、次回のAutoCAD起動時に外部参照が読み込まれなくなり、現場から「ツールを使うと図面がおかしくなる」というクレームが上がる。
2. ファイルアクセスの排他制御
大規模図面セットを連続処理する場合、ファイルのオープン状態を厳密に管理する必要がある。処理が終わるたびに `doc.Close False` を呼び出し、メモリを解放せよ。さもなくば、AutoCADの `ObjectDBX` を検討するフェーズだ。今回の手法は、図面の「見た目」や「モデル空間のデータ」をいじりたい場合にこそ真価を発揮する。
3. ネットワークトラフィックの考慮
`DEMANDLOAD` を切ることで、ネットワーク上のファイルパス探索が省略される。これは、特に低速なVPN環境下でのバッチ処理において、劇的な時間短縮(場合によっては5分かかっていた処理が数秒になる)をもたらす。
—
さらなる高みへ:ObjectDBXという選択肢
もし君が「図面を開く必要すらない(図面内の属性値抽出や特定のブロックの置換のみが目的)」のであれば、`Documents.Open` すら使うべきではない。`ObjectDBX (AxDbDocument)` を使用すれば、AutoCADのGUIを介さずに、バックグラウンドで高速かつ安全にDWGを操作できる。
しかし、「画面表示が必要なコマンドを呼び出す」あるいは「図面内の情報を確認しながら修正したい」という要件であれば、今回の `DEMANDLOAD` 制御が最も確実で、かつモダンな解である。
まとめ
- 無駄な読み込みは排除せよ: `DEMANDLOAD` を0にするだけで、世界は変わる。
- 変数は必ず戻せ: 後の自分や同僚が困らないよう、環境汚染は最小限に。
- 堅牢なエラー制御: `On Error` を使いこなし、何が起きても安全に閉じる。
このコードを君のライブラリに組み込み、今まで「処理が終わるまでコーヒーを飲みに行っていた」時間を、クリエイティブな設計業務に変えてほしい。それがエンジニアとしての真の価値だ。
