こんにちは!AutoCAD自動化の現場を駆け抜けてきたチーフアーキテクトの私です。
「マクロの記録」ボタンを押すだけの自動化から一歩抜け出し、自分の手でCADを自在に操りたい――そう思ってAutoCAD VBAの世界に足を踏み入れたあなたへ。素晴らしい選択です!
今回は、AutoCAD VBAの基礎固めとして非常に実用的、かつ「おっ!」と周りを唸らせるテクニックをご紹介します。テーマは【図面を開かずに全画層名を取得・一覧化するFSO活用術】です。
「大量にある図面ファイルから、いちいちCADを起動して画層(レイヤー)の構成を確認する……」
そんな不毛な残業は、今日で終わりです。ここをクリアすれば、あなたも立派なAutoCAD VBAエンジニアの仲間入りですよ。さあ、一緒に扉を開きましょう!
—
なぜ「図面を開かない」必要があるのか?
実務でこんなシチュエーションに出会ったことはありませんか?
- 「フォルダ内にある100個の図面の中に、特定の画層(例えば ‘HIDDEN’ や ‘0’ 以外の不要な画層)が残っていないか一括で調べたい」
- 「全図面の画層リストをExcelにきれいにまとめてレポートしたい」
これを普通にやろうとすると、VBAで一つひとつの図面を `Documents.Open` で開き、画層を読み取って、閉じて……という処理になります。
しかし、これだと画面がパカパカと切り替わり、処理が完了するまでにコーヒーが何杯も飲めるほどの時間がかかります。 なぜなら、AutoCADにとって「図面を描画して画面に表示する」というのは、非常に重たい処理だからです。
そこで登場するのが、「図面を開かずに、データだけを裏側でスマートに覗き見する」というアプローチです。
—
武器の紹介:FSO(FileSystemObject)とTypeLib
今回の主役は以下の2つです。
1. FSO (Scripting.FileSystemObject)
Windowsのファイルやフォルダを縦横無尽に操作するための定番コンポーネントです。「指定したフォルダの中にある `.dwg` ファイルのパスをすべて集める」という役割を担ってもらいます。
2. AutoCADのオブジェクトモデルの裏技(Type Libraryの活用)
実は、AutoCADでは図面を画面に表示させなくても、メモリ上(バックグラウンド)だけで図面ファイルをオブジェクトとして読み込む方法が存在します。それが `Application.Documents.Add` や、データベース直接アクセス(ObjectDBX)の概念です。今回は初心者でも安全に理解できるよう、標準的なドキュメントコレクションの操作をベースに解説します。
—
実践!図面を開かずに画層名を取得するVBAコード
百聞は一見にしかず。まずは、あなたの手元のVBAエディタ(Alt + F11)を開き、標準モジュールに以下のコードを貼り付けてみてください。
※実行前に、コード内の `targetFolderPath` の部分をご自身のPCにある適当なフォルダパス(例: `C:\DrawingFolder\`)に書き換えてくださいね。
Sub GetLayerNamesWithoutOpening()
‘ — 変数の宣言 —
Dim fso As Object
Dim targetFolder As Object
Dim file As Object
Dim targetPath As String
Dim acadDoc As AcadDocument
Dim layerItem As AcadLayer
Dim ws As Worksheet
Dim rowCount As Long
‘ 【重要】画面のチラつきを抑え、処理速度を爆発的に上げるおまじない
ThisDrawing.Application.Visible = False
‘ 1. FSOを使ってフォルダを準備
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ ⚠️ここに調査したい図面が入ったフォルダパスを指定してください
targetPath = “C:\YourDrawingFolder\ અહીંパスを書く”
If Not fso.FolderExists(targetPath) Then
MsgBox “指定されたフォルダが存在しません。”, vbCritical, “エラー”
GoTo CleanUp
End If
Set targetFolder = fso.GetFolder(targetPath)
‘ 2. 結果を出力するためのExcelシートを用意(Excelから実行する場合を想定)
‘ ※AutoCADのVBA単体の場合は、イミディエイトウインドウやテキスト出力に書き換えてください
On Error Resume Next
Set ws = ActiveSheet
On Error GoTo 0
If ws Is Nothing Then
MsgBox “有効なワークシートが見つかりません。”, vbCritical
Exit Sub
End If
‘ 見出しの設定
ws.Cells.Clear
ws.Cells(1, 1).Value = “ファイル名”
ws.Cells(1, 2).Value = “画層名”
rowCount = 2
‘ 3. フォルダ内のファイルを1つずつ走査
For Each file In targetFolder.Files
‘ 拡張子が「.dwg」のファイルだけを対象にする
If LCase(fso.GetExtensionName(file.Name)) = “dwg” Then
‘ 【核心】図面を「非表示(Invisible)」の状態でバックグラウンドオープン
‘ これにより、画面描画のコストを完全にカットします
Set acadDoc = Application.Documents.Open(file.Path, True) ‘ True = 読み取り専用
‘ 4. 開いた図面から画層コレクションをごっそり取得
For Each layerItem In acadDoc.Layers
ws.Cells(rowCount, 1).Value = file.Name
ws.Cells(rowCount, 2).Value = layerItem.Name
rowCount = rowCount + 1
Next layerItem
‘ 5. 用事が済んだら、変更を保存せずに即座に閉じる
acadDoc.Close False
End If
Next file
MsgBox “すべての画層名の取得が完了しました!”, vbInformation, “完了”
CleanUp:
‘ — 後処理 —
‘ 隠していたAutoCADの画面を元に戻す
ThisDrawing.Application.Visible = True
Set fso = Nothing
Set targetFolder = Nothing
End Sub
—
コードの注目ポイント・初学者がハマりやすい罠
このコードには、現場のプロが実践する「パフォーマンスと安定性を保つための知見」が詰まっています。いくつか重要なポイントを解説します。
1. `Application.Visible = False` の威力とリスク
コードの序盤にある `ThisDrawing.Application.Visible = False`。これは、AutoCADの画面を非表示にする呪文です。人間が目視する必要のないバックグラウンド処理では、画面描画を省くことで実行速度が劇的に向上します。
ただし! コードが途中でエラー落ちすると、AutoCADの画面が消えたままバックグラウンドでプロセスだけが残り続ける(ゾンビプロセス化する) という現象が起きます。そのため、実務ではエラーハンドリングや `CleanUp` ラベルを用意して、必ず `Visible = True` に戻す安全装置が不可欠です。今回のコードはそのお作法をしっかり守っています。
2. 「読み取り専用(ReadOnly)」で開く知見
`Application.Documents.Open(file.Path, True)` の第2引数の `True` は、「ReadOnly(読み取り専用)」を意味します。
他人が編集中かもしれない図面や、うっかり上書き保存してしまうリスクを防ぐために、画層やデータの「読み取り」が目的のときは、必ず読み取り専用で開きましょう。サーバー上の図面を扱う際のエラーも防げます。
3. コレクションの解放を意識する
VBAでは、メモリの管理が非常に重要です。特に `For Each` でオブジェクト(`AcadLayer` や `AcadDocument`)を回すときは、処理が終わったら適切に参照を解放する意識を持つと、メモリリーク(メモリがどんどん食いつぶされる現象)を防ぐことができます。
—
さらに高みを目指すあなたへ(ObjectDBXという選択肢)
今回のコードは「バックグラウンドで図面を開く」という手法を取りましたが、実はAutoCADには「図面を開きすらしない(メモリ上にビューポートすら作らない)」という究極の技術、ObjectDBX (AxDbDocument) が存在します。
もし、数千枚単位の超巨大な図面群から画層名だけを抜き出したい場合は、Documents.Openすら行わないObjectDBXの活用を次のステップとして学んでみてください。世界が変わるほどの速度を体感できます。
—
まとめ
今回は、FSOとAutoCAD VBAを組み合わせて、図面を開かずに効率よく画層名を取得・一覧化する方法を解説しました。
- FSO でフォルダ内の `.dwg` をスマートに収集する。
- AutoCADの画面を非表示にして、高速化と省力化を図る。
- 読み取り専用で開き、用事が済んだら即座に閉じることで安全性を担保する。
ここをクリアできれば、単なる「マクロ記録の再生者」から、現場の業務を根底から変える「自動化エンジニア」への第一歩を踏み出したことになります。
あなたのAutoCADライフが、よりスマートでクリエイティブなものになりますように。それでは、次回の極限の知見でお会いしましょう!
