こんにちは! AutoCAD VBAの世界へようこそ。
日々、大量の図面処理や自動化ツールの開発、お疲れ様です!
マクロの記録から一歩踏み出して、コードで図面を自由に操作できるようになってくると、次に必ずぶつかる「巨大な壁」がありますよね。
そう、「図面を開くのが遅すぎる問題」 です。
特に、建築・土木・プラントなどの現場で使われる図面は、何十枚もの外部参照(Xref)がネットワーク上のフォルダからリンクされており、VBAで1枚開くだけで数分間フリーズしたようになることがあります。これが数十枚、数百枚のバッチ処理(一括処理)となると、夜通しマクロを回さなければならなくなります。
でも、安心してください!
「図面の中身(本図)の情報だけをサクッと修正したいから、外部参照(Xref)の読み込みは今はいらないんだけどな…」
という場面で使える、図面オープンを極限まで高速化するVBAテクニックが存在します。
ここをクリアすれば、AutoCAD VBAの基本構造だけでなく、プログラマーとしての「例外処理」や「環境制御」のスキルもバッチリ身につきますよ。先輩と一緒に、本物のテクニックを身につけていきましょう!
—
なぜ外部参照(Xref)があると図面オープンが遅くなるのか?
まずは、AutoCAD内部で何が起きているのかをイメージしてみましょう。
通常、VBAから `Documents.Open` を実行すると、AutoCADは誠実にも以下のようなステップをすべて愚直に実行します。
【通常の図面オープン処理(遅い原因)】
[VBAコマンド発行]
│
▼
[メインDWGの解析] ─── (図面本隊のロード)
│
▼
[外部参照(Xref)の探索] ── (ネットワークパスの解決)
│
▼
[各Xrefファイルの読込] ── ★ここでネットワーク遅延や重いDWGの読み込みが発生!
│
▼
[画面の再描画・UI更新] ── (VBA処理開始まで待たされる)
図面を開く時間の8割〜9割は「Xrefの探索とロード」に費やされています。
つまり、VBA処理の最中だけこのXrefロードを「一時的にお休み」させることができれば、図面は一瞬で開くようになるわけです!
—
制御の鍵を握るシステム変数:`XLOADCTL` と `DEMANDLOAD`
AutoCADには、外部参照の読み込み(デマンドロード)を制御するためのシステム変数が用意されています。VBAからこれを操作するのが1つ目のアプローチです。
- `XLOADCTL`(外部参照のデマンドロード制御)
- `0`: デマンドロードをオフ(参照図面全体を即座に読み込まない、または読み込み方法を変更)
- `1`: デマンドロードをオン(必要に応じて読み込む)
- `2`: コピーを作成してデマンドロード(他人が編集中のXrefも開ける)
- `DEMANDLOAD`(カスタムオブジェクト/Xrefの要求時ロード)
- `0`: 要求時ロードを無効化
VBAによるアプローチの戦略
VBAから図面を開く直前にこれらのシステム変数をオフに変更し、図面を開いた後(あるいは処理終了後)に元に戻すというプログラミングパターンを使います。
—
【実践】Xrefロードをスキップして爆速オープンするVBAコード
それでは、実際のコードを見てみましょう。
現場でそのまま使えるように、「安全対策(エラー処理)」をしっかりと組み込んだ堅牢なコードを用意しました。
プロプログラムが途中で止まってもユーザーの設定を壊さないように、`On Error GoTo` を使って設定を元に戻すのが「プロの書き方」です。
Option Explicit
‘ ==============================================================================
‘ 機能: 外部参照(Xref)のロード処理を抑制し、図面を高速に開いて処理するサンプル
‘ ==============================================================================
Public Sub FastOpenDrawingSample()
Dim dwgPath As String
Dim targetDoc As AcadDocument
Dim oldXLoadCtl As Variant
Dim oldDemandLoad As Variant
‘ テスト対象の図面パス(ご自身の環境に合わせて変更してください)
dwgPath = “C:\Project\Heavy_Drawing_With_Xrefs.dwg”
‘ ファイルの存在チェック
If Dir(dwgPath) = “” Then
MsgBox “指定された図面ファイルが存在しません: ” & dwgPath, vbCritical
Exit Sub
End Sub
‘ ————————————————————————–
‘ 1. 現在のシステム変数を退避(後で元に戻すため)
‘ ————————————————————————–
oldXLoadCtl = ThisDrawing.Application.GetSystemVariable(“XLOADCTL”)
oldDemandLoad = ThisDrawing.Application.GetSystemVariable(“DEMANDLOAD”)
‘ エラーハンドリングの開始
‘ (万が一処理中にエラーが起きても、必ずシステム変数を元に戻すため)
On Error GoTo ErrorHandler
‘ ————————————————————————–
‘ 2. 高速化のためのシステム変数変更
‘ ————————————————————————–
‘ Xrefの要求時ロードを無効化
ThisDrawing.Application.SetSystemVariable “XLOADCTL”, 0
ThisDrawing.Application.SetSystemVariable “DEMANDLOAD”, 0
‘ ————————————————————————–
‘ 3. 図面をオープン (Xrefの重い読み込みがスキップされます)
‘ ————————————————————————–
Application.StatusBarText = “図面を爆速オープン中…”
Set targetDoc = ThisDrawing.Application.Documents.Open(dwgPath)
‘ ————————————————————————–
‘ 4. ここで必要な処理を実行 (例: レイヤーの修正、文字の置換など)
‘ ————————————————————————–
MsgBox “図面が超高速で開きました!” & vbCrLf & _
“ドキュメント名: ” & targetDoc.Name, vbInformation, “成功”
‘ (例)保存して閉じる場合
‘ targetDoc.Close SaveChanges:=True
‘ ————————————————————————–
‘ 5. 後処理(正常終了時も必ず通る)
‘ ————————————————————————–
CleanUp:
‘ システム変数を元の状態に復元(これ超重要です!)
ThisDrawing.Application.SetSystemVariable “XLOADCTL”, oldXLoadCtl
ThisDrawing.Application.SetSystemVariable “DEMANDLOAD”, oldDemandLoad
Application.StatusBarText = “”
Exit Sub
‘ ————————————————————————–
‘ 6. エラー発生時の処理
‘ ————————————————————————–
ErrorHandler:
MsgBox “処理中にエラーが発生しました: ” & Err.Description, vbExclamation
Resume CleanUp
End Sub
—
コードのポイント解説:初心者が脱却すべき「落とし穴」
上記のコードには、中級者へステップアップするための重要な思想が詰まっています。
ポイント①:元の環境を必ず復元する(元に戻す美学)
VBAでAutoCADの「システム変数」を変更した場合、マクロが終了してもその設定はAutoCAD全体に残ります。
もし `XLOADCTL` を `0` にしたまま放置すると、ユーザーが手動でAutoCADを使う際、「あれ?外部参照が表示されない!壊れた?」と大パニックになります。
そのため、必ず処理の最初に `GetSystemVariable` で変数を保存し、最後に `SetSystemVariable` で復元します。
ポイント②:`On Error GoTo` と `CleanUp` ラベル構造
VBAで最も恐ろしいのは、「プログラムが途中でエラー停止し、復元処理(CleanUp)が実行されないこと」です。
【エラー発生時のプログラムの流れ】
[処理実行] ──(エラー発生!)──> [ErrorHandlerへジャンプ]
│
▼
[復元処理 (CleanUp)] <━━━━━━━ [メッセージ表示]
│
▼
[システム変数が安全に元に戻る!]
上記のように `CleanUp` セクションを独立させ、エラーが起きても起きなくても絶対に変数の復元を通る設計にしています。この型を覚えておけば、今後のVBA開発でのトラブルが格段に減りますよ!
—
【さらに上を目指す方へ】最強の裏ワザ「ObjectDBX」
ここまでの解説で「システム変数を変えて `Documents.Open` する」手法を伝えましたが、実はチーフアーキテクトが画面裏で使う「真の爆速テクニック」がもう一つあります。
それが ObjectDBX (AxDbDocument) です。
もしあなたの目的が「画面に図面を表示してユーザーに見せること」ではなく、「バックグラウンドで図面の文字を書き換えたり、ブロック数を集計したいだけ」なら、図面を画面に開く必要すらありません。
【Documents.Open】
AutoCADの画面(GUI)を起動し、描画エンジンを回して図面を開く (数秒〜数分)
【ObjectDBX (AxDbDocument)】
図面データ(DWGのデータベース)だけに直接アクセスして読み書きする (数ミリ秒!)
ObjectDBXを使えば、Xrefの読み込みはもちろん、画面描画すら完全にスキップされるため、100枚の図面処理が「数分」から「数秒」に終わる世界が待っています。
ObjectDBXの簡単な書き方例
Sub ObjectDBX_SpeedDemon()
Dim dbxDoc As AxDbDocument
‘ AutoCADのバージョンに応じたProgIDを指定 (例: AutoCAD 2021-2024系)
Set dbxDoc = AcadApplication.GetInterfaceObject(“ObjectDBX.AxDbDocument.24”)
‘ Xrefも画面描画も無視してDWGデータベースのみを一瞬でロード
dbxDoc.Open “C:\Project\Heavy_Drawing.dwg”
‘ 例: モデル空間の図形数をカウント
Debug.Print “オブジェクト数: ” & dbxDoc.ModelSpace.Count
‘ 保存する場合
‘ dbxDoc.SaveAs “C:\Project\Heavy_Drawing.dwg”
Set dbxDoc = Nothing
End Sub
(※ProgIDの数字 `.24` 部分はインストールされているAutoCADのバージョンによって異なります)
「画面表示が必要な操作」なら最初に紹介したシステム変数制御パターン、「データ処理だけのバッチ作業」ならObjectDBX、というように使い分けられるようになると完璧です!
—
まとめ:AutoCAD VBAの基本を掌握しよう!
今回のテーマはいかがでしたでしょうか?
1. 図面オープンが重い最大の原因は「外部参照(Xref)のロード」
2. `XLOADCTL` や `DEMANDLOAD` をVBAから制御することでロードを回避できる
3. システム変数をいじる時は「エラー処理」と「元の設定への復元」がセット
4. 超高速なバックグラウンド処理なら「ObjectDBX」という最強の選択肢もある
「ただ動くマクロ」から、「ユーザーの時間を奪わない、エラーに強い美しいマクロ」へ。
ここをクリアできれば、あなたのAutoCAD VBAの基礎レベルは間違いなく上位クラスです!
現場の重い図面に立ち向かう際は、ぜひ今回のコードを参考にしてみてくださいね。応援しています!
