【入門編】AutoCAD図面を開かずに情報を取得!AcadApplicationの活用で図面管理を効率化 – AutoCAD VBA解析バイブル

スポンサーリンク

こんにちは!AutoCADの自動化の海へようこそ。
マクロの記録ボタンを押すだけの時代はもう卒業しましたね。今日、あなたがこの扉を叩いたのは、数ある図面管理の地獄――「大量の図面を開いては閉じ、開いては閉じを繰り返す無間地獄」から抜け出すためでしょう。

よく聞いてください。プロのエンジニアは、図面を目で見ません。コードで読ませます。
AutoCADのウィンドウすら立ち上げずに、バックグラウンド(非表示)で図面の魂を抜き取る方法。これをマスターすれば、あなたの図面管理業務は劇的に、音速に変わります。

ここをクリアすれば、AutoCAD VBAの本質を掴んだも同然です。さあ、私と一緒に、ワンランク上のエンジニアへステップアップしましょう!

なぜ「図面を開かずに」情報を取らなければならないのか?

想像してください。100枚の図面から「特定のレイアウト名」や「特定のブロックの有無」を調べたいとします。
手作業でやったらどうなりますか?
1. 図面をダブルクリックする。
2. AutoCADが起動するのをコーヒーを飲みながら待つ(これが遅い!)。
3. 目視で確認する。
4. AutoCADを閉じる。
これを100回……考えただけで発狂しそうですね。

AutoCAD VBAには、`Documents.Open`を使わずに、メモリ上だけで図面をいじめる(解析する)禁断の技術が存在します。それが `AcadApplication` と `AxDbFiler`(あるいは `Type Library` の活用)を用いた、Databaseオブジェクトの直接操作です。

正確には、VBA単体では純粋な外部DWGの直接読み込みに少しクセがありますが、今回は「画面を表示させずに(バックグラウンドで)超高速処理する」ための最も現実的かつ強力なアプローチを授けましょう。

基礎知識:AcadApplicationとDocumentの階層構造

まずは、AutoCADのオブジェクトモデルの「地図」を頭に叩き込んでください。すべてはこのピラミッド構造で動いています。

[ AcadApplication ] (AutoCAD本体の神)
┗━━ [ Documents ] (開いている図面たちのコレクション)
┗━━ [ AcadDocument ] (個別の図面ファイル)
┣━━ [ ModelSpace / PaperSpace ] (空間)
┗━━ [ Layouts ] (レイアウトタブ)

通常、私たちは `Documents.Open “C:\path\to\drawing.dwg”` として画面に図面を表示させます。しかし、これだとグラフィックの描画コスト(メモリとCPUの無駄遣い)が発生します。

「画面を見せない」= `Application.Visible = False` または、裏でこっそりドキュメントを開いて閉じる高速処理を行うことで、PCのエンジンをフル回転させずに目的のデータを抜き取ることができるのです。

実践!図面を開かずに(画面を描画せずに)情報を一網打尽にするコード

お待たせしました。現場でそのままコピペして使える実用的なVBAコードをプレゼントします。
このコードは、指定したフォルダ内にあるすべてのDWGファイルを画面描画を完全にフリーズ(非表示に準ずる高速化)させた状態で開き、図面内のレイアウト名と特定の文字(ここでは「承認」という文字など)が存在するかを調査する魔改造スクリプトです。

Sub FastDrawingChecker()
Dim fso As Object
Dim targetFolder As String
Dim targetFile As Object
Dim acadApp As AcadApplication
Dim targetDoc As AcadDocument
Dim layoutItem As AcadLayout
Dim msgLog As String

‘ 【重要】画面の更新を完全に停止し、爆速化させる秘儀
On Error GoTo ErrorHandler

‘ 1. 操作対象のフォルダパスを指定(ご自身の環境に合わせて変更してください)
targetFolder = “C:\AutoCAD_Data\”

‘ ファイルシステムオブジェクトでフォルダ内のDWGを総ざらい
Set fso = CreateObject(“Scripting.FileSystemObject”)

If Not fso.FolderExists(targetFolder) Then
MsgBox “指定されたフォルダが存在しません:” & targetFolder, vbCritical, “エラー”
Exit Sub
End If

‘ 2. AutoCADのアプリケーションインスタンスを捕捉(起動していなければ自動起動)
On Error Resume Next
Set acadApp = GetObject(, “AutoCAD.Application”)
If acadApp Is Nothing Then
Set acadApp = New AcadApplication
End If
On Error GoTo ErrorHandler

‘ ★超重要:画面描画をオフにして、裏でこっそり処理させる(Invisible化の極意)
‘ ※完全な完全バックグラウンド(AXDB)は制限が多いため、
‘ 「画面を見せない・イベントを切る」実用的な最高速モードを採用します。
acadApp.Visible = False

msgLog = “— 図面高速スキャン結果 —” & vbCrLf

‘ 3. フォルダ内のすべてのDWGファイルをループ処理
For Each targetFile In fso.GetFolder(targetFolder).Files
If LCase(fso.GetExtensionName(targetFile.Name)) = “dwg” Then

‘ 図面をバックグラウンド(ウインドウ非表示に近い状態)でオープン
‘ ※Read-Only(読み取り専用)で開くことで、ファイルをロックせず安全かつ高速に!
Set targetDoc = acadApp.Documents.Open(targetFile.Path, True)

msgLog = msgLog & vbCrLf & “【ファイル】: ” & targetFile.Name & vbCrLf

‘ A. レイアウト名の列挙
msgLog = msgLog & ” ■ レイアウト一覧:” & vbCrLf
For Each layoutItem In targetDoc.Layouts
msgLog = msgLog & ” – ” & layoutItem.Name & vbCrLf
Next layoutItem

‘ B. 特定のオブジェクト(例:モデル空間のエンティティ数)の簡易チェック
msgLog = msgLog & ” ■ モデル空間のオブジェクト数: ” & targetDoc.ModelSpace.Count & ” 個” & vbCrLf

‘ 4. 変更を加えず(読み取り専用なので)速やかに閉じる(保存確認ナシ)
targetDoc.Close False

End If
Next targetFile

‘ 処理終了後、AutoCADの画面を元に戻す
acadApp.Visible = True

‘ 結果を出力
MsgBox msgLog, vbInformation, “スキャン完了”

Exit Sub

ErrorHandler:
‘ エラー時の保険:画面が消えたまま固まるのを防ぐ
If Not acadApp Is Nothing Then
acadApp.Visible = True
End If
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “致命的エラー”
End Sub

陥りやすい罠と、エンジニアが教える「現場の知恵」

このコードを動かすにあたり、初学者が必ずハマる「3つの罠」があります。先回りして回避策を授けましょう。

罠1:図面を「書き込み可能(通常)」で開いてしまう

コード内で `Documents.Open targetFile.Path` とだけ書くと、図面は「排他制御(ロック)」がかかった状態で開かれます。もし他の人がその図面を開いていたらエラーで即死します。
必ず `True`(読み取り専用フラグ) を第2引数に渡してください。これによって安全かつ、ファイルへの負担を最小限に抑えられます。

罠2:エラー時にAutoCADが透明な亡霊になる

VBAの実行中にエラー(ファイルが壊れているなど)が発生すると、`acadApp.Visible = False` のままマクロが停止し、「タスクマネージャーにはAutoCADがいるのに、画面にウィンドウがないから操作できない心霊現象」が起きます。
これを防ぐために、上記のコードのように必ず `On Error GoTo` による例外処理を書き、最後に必ず `acadApp.Visible = True` を通る動線を確保してください。これはプロの鉄則です。

罠3:巨大すぎる図面でのメモリリーク

何百MBもあるモンスター図面を何十枚もループさせると、VBAのメモリ解放が追いつかずにAutoCADがクラッシュすることがあります。
もし数千枚単位のバッチ処理を行う場合は、定期的に `DoEvents` を挟むか、VBAの外側(VB.NETの Console アプリケーションなど)へステップアップするサインだと考えてください。

さあ、次のステージへ

ここをクリアすれば、もうあなたは単なる「CADオペレーター」ではありません。AutoCADを意のままに操る「システムエンジニア」の領域に足を踏み入れています。

「図面を開かずに情報を引く」この快感を覚えてしまったら、もう手作業には戻れなくなるはずです。ぜひご自身の環境でテストし、業務効率を何倍にも跳ね上げてみてください。

それでは、次回の極限の知見でお会いしましょう。あなたの自動化ライフに栄光あれ!

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