こんにちは!AutoCAD VBAの荒波を航海中の皆さん、先輩エンジニアの私です。
「マクロの記録」から一歩踏み出し、自分の手でCADを自在に操れるようになると、業務の景色が一変しますよね。特に、複数の図面を一括処理する「バッチ処理」の自動化は、エンジニアにとって一つのロマンであり、強力な武器です。
しかし、ここで一つ、現場でよくある悲劇を思い出してください。
「深夜に何百枚もの図面を一括処理するバッチを回したら、途中で数ギガバイトある超巨大図面を踏んでAutoCADがフリーズ。翌朝、絶望した……」
こんな経験、ありませんか?
AutoCAD VBAでバッチ処理を組むとき、一番やってはいけないのは「中身の重さを確かめずに、とりあえず図面を開くこと」です。
今回は、図面を画面に描画して開く(重たい処理)というコストを払う前に、「図面ファイルの中に、一体いくつのオブジェクト(図形)が眠っているか」をノーリスクで先読みし、処理の負荷を予測するという、実務で絶対に役立つ極限の知見を授けましょう。
ここをクリアすれば、あなたの作ったマクロは「ただ動くもの」から「プロの現場に耐えうる頑健なシステム」へと進化します。さあ、一緒に扉を開けましょう!
—
1. なぜ「開く前」にオブジェクト数を数える必要があるのか?
AutoCADの図面(DWG)は、見た目の線画の美しさとは裏腹に、内部では膨大な数の「データベース(オブジェクト)」の集合体です。
人間が図面を開くときは、AutoCADが画面を描画(グラフィックス処理)するため、オブジェクトが多いほど激重になります。しかし、VBAの裏側(バックグラウンド)であっても、重い図面を毎回 `Open` メソッドで開き、メモリに展開して処理していたら、PCのメモリはすぐパンクし、AutoCADは沈黙します。
「開かずに読む」というデータベースの裏技
実は、AutoCAD VBA(正確にはObjectDBXという技術)を使うと、図面を画面上に一切表示させず、メモリ上だけでDWGファイルのデータベースにアクセスすることができます。
これにより、以下のメリットが生まれます。
- 爆速の事前スキャン: 画面描画のオーバーヘッドがないため、一瞬で図面の中身を把握できる。
- 負荷の事前予測: 「あ、この図面はオブジェクトが10万個あるから、今日のバッチ処理では後回しにしよう」「メモリを解放しながら慎重に回そう」といったリスクヘッジ(計画的なバッチ制御)が可能になる。
—
2. 実装コード:オブジェクト数を先読みするプロの作法
それでは、実際に図面を開かずにオブジェクト数をカウントし、処理負荷を予測するVBAコードを公開します。
このコードは、AutoCADの標準機能だけではアクセスできない裏の領域(ObjectDBX)を叩くため、少しだけ高度に見えますが、一行ずつ意味を噛み砕けば怖くありません。
Option Explicit
‘ ==============================================================================
‘ テーマ: 図面を開かずにオブジェクト数をカウントし、処理負荷を予測する
‘ 対象読者: マクロの記録を卒業し、実務でバッチ処理を組みたい中級者
‘ ==============================================================================
Sub PredictDrawingLoad_Click()
‘ 1. 対象となる図面ファイルのパスを指定(ご自身の環境に合わせて変更してください)
Dim targetDWG As String
targetDWG = “C:\AutoCAD_Data\Sample_HeavyDrawing.dwg”
‘ ファイルの存在確認
If Dir(targetDWG) = “” Then
MsgBox “指定されたファイルが存在しません: ” & targetDWG, vbCritical, “エラー”
Exit Sub
End If
‘ 2. ObjectDBXのデータベースオブジェクトを生成
‘ ※画面を開かずにDWGをメモリ上にロードするための魔法のインターフェースです
Dim dbxDoc As Object
‘ AutoCADのバージョンに応じたDBXホストを生成(AutoCAD 2004以降に対応)
Dim cadVersion As String
cadVersion = Left(Application.Version, 2)
On Error Resume Next
‘ バージョン違いによるエラーを防ぐため、動的に生成を試みる
Set dbxDoc = AcadApplication.GetInterfaceObject(“ObjectDBX.AxDbDocument.” & cadVersion)
If dbxDoc Is Nothing Then
‘ フォールバックとして一般的なProgIDを指定
Set dbxDoc = AcadApplication.GetInterfaceObject(“ObjectDBX.AxDbDocument”)
End If
On Error GoTo 0
If dbxDoc Is Nothing Then
MsgBox “ObjectDBXの初期化に失敗しました。AutoCADが正しくインストールされているか確認してください。”, vbCritical
Exit Sub
End If
‘ 3. 画面を開かずにファイルをバックグラウンドで読み込み
On Error GoTo ErrorHandler
dbxDoc.Open targetDWG
‘ 4. モデル空間(ModelSpace)のオブジェクト数をカウント
Dim entityCount As Long
entityCount = dbxDoc.ModelSpace.Count
‘ ※もしペーパー空間やブロック定義も含めたい場合は、さらに走査を拡張できますが、
‘ まずは一番負荷の大部分を占める「モデル空間の図形数」を指標にします。
‘ 5. オブジェクト数に基づく「処理負荷予測」の判定
Dim loadLevel As String
Dim estimatedTime As String
If entityCount < 1000 Then loadLevel = "【軽負荷】一瞬で処理可能です。" estimatedTime = "約 1秒未満" ElseIf entityCount < 10000 Then loadLevel = "【中負荷】通常のバッチ処理ルートで問題ありません。" estimatedTime = "約 3秒〜10秒" ElseIf entityCount < 50000 Then loadLevel = "【重負荷】注意が必要です。メモリ解放を挟んでください。" estimatedTime = "約 30秒〜1分" Else loadLevel = "【超絶ヘビー級】警告:自動処理中にフリーズの危険性あり!" estimatedTime = "数分以上(または手動確認推奨)" End If ' 6. 結果の出力 Dim msg As String msg = "■ 図面事前診断レポート" & vbCrLf & _ "ファイル名: " & Dir(targetDWG) & vbCrLf & _ "モデル空間オブジェクト数: " & Format(entityCount, "#,
0″) & ” 個” & vbCrLf & _
“—————————————-” & vbCrLf & _
loadLevel & vbCrLf & _
“予想処理時間: ” & estimatedTime
MsgBox msg, vbInformation, “負荷予測完了”
‘ 7. クリーンアップ(メモリの解放はエンジニアの美学です)
Set dbxDoc = Nothing
Exit Sub
ErrorHandler:
MsgBox “図面の読み込み中にエラーが発生しました。” & vbCrLf & Err.Description, vbCritical, “致命的エラー”
Set dbxDoc = Nothing
End Sub
—
3. コードのキモ:初心者が陥りがちな罠と解説
このコードには、実務で生き抜くための知見がいくつも詰まっています。ポイントを整理しておきましょう。
① `GetInterfaceObject` という「裏技」
通常、VBAで図面を操作するときは `ThisDrawing` や `Documents.Open` を使いますが、これらは「AutoCADの画面に図面を表示する」という重い処理を伴います。
一方、`ObjectDBX.AxDbDocument` を使うと、AutoCADのUIをバイパスして、純粋なデータ(データベース)だけを裏でメモリに読み込めます。これが「画面を開かずに数える」ことの正体です。
② バージョン依存問題への配慮
コード内で `Left(Application.Version, 2)` とやっている部分があります。AutoCADはバージョン(2021, 2022, 2023など)によって内部のライブラリ名が微妙に変わることがあるため、現在の実行環境のバージョンを動的に取得して安全にObjectDBXを呼び出しています。こういう細かな配慮が、現場で壊れないマクロを作ります。
③ メモリの解放(クリーンアップ)を忘れない
VBAで `GetInterfaceObject` や外部オブジェクトを扱う際、処理の最後に `Set dbxDoc = Nothing` でメモリをきれいスッキリ掃除してあげるのがプロの作法です。これをサボると、大量の図面をループ処理したときにメモリリーク(メモリが徐々に食いつぶされる現象)を起こし、途中でAutoCADが落ちる原因になります。
—
4. ここをクリアすれば、あなたももう中級者!
いかがでしたでしょうか?
「図面を開く」という当たり前の手順を疑い、「開く前に中身を覗き見る」というアプローチを取ることで、業務自動化の信頼性は劇的に向上します。
- 大量図面の一括印刷バッチ
- 夜間バッチでの属性データ一括抽出
- 異常に重い不良図面の事前フィルタリング
これらはすべて、今回紹介した 「ObjectDBXによる事前スキャン」 をベースに応用可能です。
「ここをクリアすれば、AutoCAD VBAの基本はバッチリですよ」と言った意味が、少し伝わったのではないでしょうか。ぜひご自身の開発環境にこのコードを貼り付け、手元の重たい図面で試してみてください。
あなたのAutoCAD自動化ライフが、より快適で知的なものになることを応援しています!それではまた、次回の極限知見でお会いしましょう。
