【入門編】【初心者向け】AcadDocument.Blocksコレクションを走査し、図図面内で使用されている「ブロック名」を重複なくリストアップする基礎コード – AutoCAD VBA解析バイブル

スポンサーリンク

AutoCAD VBA入門:図面内の「ブロック名」を重複なく一括抽出!`AcadDocument.Blocks`走査の極意

はじめまして!AutoCADの自動化世界へようこそ。
マクロの記録から一歩踏み出し、VBAを使ったプログラムで図面を自在に制御しようと決意したあなたのチャレンジを、心から歓迎します。

AutoCAD VBAをマスターするうえで、最初に理解すべき極めて重要な概念が「オブジェクトモデルの階層構造」です。そして、その構造を理解する絶好のテーマが、今回解説する「図面内のブロック名を重複なく抽出する」という処理です。

「図面の中にどんなブロックが定義されているか?」を把握することは、集計処理、自動図面チェック、Excelへのデータ書き出しなど、あらゆる実務自動化の出発点になります。

この記事を読み終える頃には、単にコードをコピペできるだけでなく、AutoCADが内部でどのようにデータを保持しているのかという「本質」までスッキリ理解できているはずです。ここをクリアすれば、AutoCAD VBAの基本はバッチリですよ!

—

1. AutoCADオブジェクトモデルの基本概念:ハンコと押印の関係

コードを書く前に、AutoCADの内部構造(オブジェクトモデル)をイメージ図解のように頭の中に組み立てましょう。

AutoCAD VBAの世界では、開いている図面全体を `AcadDocument`(コード上では `ThisDrawing`)と呼びます。この `AcadDocument` の下に、さまざまなコレクション(オブジェクトの集まり)がぶら下がっています。

今回操作するのは、図面内に存在するすべてのブロック定義を格納している `Blocks` コレクションです。

[ AcadApplication ] (AutoCAD本体)
│
└── [ AcadDocument ] (現在開いている図面:ThisDrawing)
│
└── [ Blocks コレクション ] (図面内の全ブロック定義の倉庫)
├── Block 1 (“デスク”)
├── Block 2 (“チェア”)
└── Block 3 (“Model_Space” ← ※後述する重要な罠!)

【超重要】「ブロック定義」と「ブロック参照」の違い

初心者が最も混乱しやすいポイントがここです。

  • ブロック定義(AcadBlock):図面という「倉庫」に保管されている金型(ハンコ本体)。
  • ブロック参照(AcadBlockReference):画面上のモデル空間やペーパー空間に配置された実体(紙に押されたスタンプ)。

`ThisDrawing.Blocks` を走査して取得するのは、画面上に配置されているかどうかにかかわらない「ハンコ本体(ブロック定義)のリスト」です。この違いを意識できるようになれば、あなたはもう脱初心者です!

—

2. 実務で直面する「AutoCAD特有の罠」とは?

「`Blocks` コレクションをループ処理して名前を取得するだけでしょ?」と思われたかもしれません。しかし、素直にループを回すと2つの罠にぶつかります。

罠①:モデル空間やレイアウト空間も「ブロック」である

AutoCADの内部設計では、驚くべきことにモデル空間(Model_Space)やペーパー空間(Paper_Space)自体も「特別なブロックの一種」として管理されています。
普通に走査すると、あなたが作成した「デスク」や「ボルト」といったブロック名と一緒に、`Model_Space` という名前まで抽出されてしまいます。

罠②:無名ブロック(匿名ブロック)の存在

ハッチング、寸法、動的ブロックの変化形などは、内部的に `A123` のような “ から始まる無名ブロックとして登録されます。

つまり、ユーザーが定義した純粋なブロック名だけを重複なくリストアップするには、「名前が “(アスタリスク)で始まらないものだけをフィルタリングする」 という処理が必須になります。

—

3. 実践コード:重複なくブロック名を抽出する標準マクロ

それでは、実際に動くコードを見てみましょう!
今回は、抽出した名前の重複排除と管理をスマートに行うため、VBAで標準的に使われる `Scripting.Dictionary` オブジェクトを活用した、現場でそのまま使える実践的なコードを用意しました。

Option Explicit

”
‘ 図面内のユーザー定義ブロック名を重複なく抽出し、イミディエイトウィンドウに出力する
‘
Public Sub ListUniqueBlockNames()
‘ 1. オブジェクト変数の宣言
Dim blockDef As AcadBlock
Dim blockDict As Object
Dim key As Variant
Dim count As Long

‘ 2. 重複を防止するためのDictionaryオブジェクトを作成(参照設定不要の遅延結合)
Set blockDict = CreateObject(“Scripting.Dictionary”)

‘ 3. Blocksコレクション(図面内の全ブロック定義倉庫)をループ処理
For Each blockDef In ThisDrawing.Blocks

‘ 【ポイント】AutoCAD内部の特殊ブロック(Model_Space等)や無名ブロック(A…)を除外
‘ 名前の先頭が “” でないものだけを対象とする
If Left(blockDef.Name, 1) <> “” Then

‘ Dictionaryのキーとして登録(キーの重複は自動的に上書き・回避される)
‘ すでに存在していてもエラーにならず、安全に一意なリストが作れる
If Not blockDict.Exists(blockDef.Name) Then
blockDict.Add blockDef.Name, True
End If

End If
Next blockDef

‘ 4. 結果の出力(VBAエディタのイミディエイトウィンドウに表示)
Debug.Print “—————————————-”
Debug.Print “【図面内ブロック定義リスト】 計: ” & blockDict.Count & ” 件”
Debug.Print “—————————————-”

count = 1
For Each key In blockDict.Keys
Debug.Print Format(count, “000”) & “: ” & key
count = count + 1
Next key

Debug.Print “—————————————-”

‘ メッセージボックスでも通知
MsgBox “ブロック名の抽出が完了しました。” & vbCrLf & _
“検出された一意のブロック数: ” & blockDict.Count & ” 件” & vbCrLf & _
“(詳細はイミディエイトウィンドウを確認してください)”, vbInformation, “処理完了”

‘ オブジェクトの解放
Set blockDict = Nothing
End Sub

—

4. プログラミング解説:ここがプロのコードのポイント!

上記のコードで使われている重要なテクニックを噛み砕いて解説します。

① `For Each blockDef In ThisDrawing.Blocks`

コレクション処理の王道です。`ThisDrawing.Blocks` の中に存在するすべてのブロック定義を、ひとつずつ `blockDef` 変数に取り出して処理します。インデックス番号を指定する `For i = 0 To …` より読みやすく、実行スピードも高速です。

② `Left(blockDef.Name, 1) “”`

これが先ほど解説した「罠の回避策」です。
文字列の先頭1文字をチェックし、“ で始まるAutoCADのシステム用ブロック(モデル空間、レイアウト、無名ブロック)を綺麗に振り落とします。

③ `Scripting.Dictionary` による重複排除

一意な(重複のない)リストを作成する場合、配列を使って「すでに配列に存在するか?」を毎回ループで探すのは非効率です。
`Dictionary`(連想配列)は、「キーの重複を許さない」 という強力な性質を持っています。`blockDict.Exists(blockDef.Name)` を使うことで、一瞬で重複チェックを行い、スマートに一意なリストを構築できます。

—

5. 次のステップ:このコードをどう応用するか?

この基礎コードが書けるようになると、以下のような高度な自動化への扉が一気に開きます!

1. 特定のブロックが存在するかチェックする
`If blockDict.Exists(“図面枠_A3”) Then` のように、必要なブロックが図面内に読み込まれているか判定するガード処理。
2. 図面内のブロック使用数を集計する
今回の「定義(ハンコ)」のリストを元に、今度は `ModelSpace` 内を走査して「各ブロックが何個配置されているか(押印の数)」をカウントする集計ツールへの発展。
3. Excelへの自動書き出し
抽出したブロック名を `Excel.Application` オブジェクトを使ってExcelシートにパーツリストとして出力。

—

6. まとめ:AutoCAD VBA掌握への第一歩

お疲れ様でした!今回は `AcadDocument.Blocks` コレクションの基本的な扱い方と、AutoCAD特有のブロックの仕組みについて解説しました。

  • `ThisDrawing.Blocks` は「ブロック定義(ハンコ)」の倉庫。
  • モデル空間やレイアウトも内部的にはブロックなので “ でフィルタリングする。
  • 一意なリスト作成には `Dictionary` オブジェクトが最適。

この3つのポイントを押さえれば、AutoCAD VBAのオブジェクトモデルの扱いはグッと身近なものになったはずです。

最初から複雑なプログラムを書く必要はありません。まずはこのコードをご自身のAutoCAD環境(VBAコンパイラ)に貼り付けて動きを試してみてください。イミディエイトウィンドウにずらりとブロック名が並んだ瞬間、AutoCADをプログラムで支配する楽しさが実感できるはずです!

あなたの業務改善とプログラミングの挑戦を、心から応援しています!

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