AutoCAD VBAの深淵へ:ブロック定義を自在に操る「コレクション走査」の技術
こんにちは。AutoCADの自動化という荒野を切り拓くエンジニアの皆さん。
「マクロの記録」ボタンを押して、生成されたコードの羅列に呆然とした経験はありませんか?
AutoCAD VBAをマスターするとは、単にコードを書くことではありません。「AutoCADという広大な宇宙に、オブジェクトという名の住人たちがどう配置されているか」を理解することです。
今日は、その最初の一歩として最も重要かつ実用的なスキル、「ブロック定義(Blocksコレクション)の抽出」を解説します。これを習得すれば、図面の中身をあなたの意のままにリストアップできるようになります。
—
1. AutoCADオブジェクトモデルの「地図」を持つ
まず、頭の中にこの階層構造を描いてください。これがプログラミングの羅列を「設計」に変える魔法の地図です。
- Application(AutoCAD本体)
- Documents(開いている図面全部)
- Document(今操作している図面)
- Blocks(図面内に定義されているブロックの全リスト)
- Block(個々のブロック定義)
私たちが今から行うのは、この `Blocks` という「宝箱」を開け、中身を一つずつ取り出して名前を確認する作業です。
—
2. 実践:ブロック名を重複なくリストアップする
ただブロック名を出すだけなら簡単ですが、プロとして気をつけるべきは「システムが自動生成する余計なブロック」の除外です。AutoCADは、ハッチングや寸法スタイルなども内部的には「ブロック」として扱います。これらを含めるとリストが汚れてしまうため、フィルタリングが重要です。
以下のコードをVBAエディタ(`Alt + F11`)に貼り付けてみてください。
Sub ListUpBlockNames()
Dim doc As AcadDocument
Dim blk As AcadBlock
Dim msg As String
‘ 現在のアクティブな図面を取得
Set doc = ThisDrawing
‘ 宝箱(Blocksコレクション)の中身を一つずつ確認
For Each blk In doc.Blocks
‘ 【重要】外部参照やシステム予約(名前がで始まる)を除外する
‘ これを入れないと、リストがゴミで埋め尽くされます
If Left(blk.Name, 1) <> “” Then
‘ 文字列を連結してリスト化
msg = msg & blk.Name & vbCrLf
End If
Next blk
‘ 結果を出力(メッセージボックスが大きすぎる場合はイミディエイトウィンドウへ)
If msg <> “” Then
MsgBox “以下のブロックが定義されています:” & vbCrLf & vbCrLf & msg
Else
MsgBox “定義されているブロックはありません。”
End If
End Sub
—
3. なぜ「(アスタリスク)」で除外するのか?
初心者が最初に陥る罠が、`Model_Space` や `U1234` といった名前がリストに混ざることです。
- “ で始まるもの: AutoCADが内部管理用に使っている「匿名ブロック」です。これらはユーザーが手動で配置するものではありません。
- 本質を見抜く: 業務で本当に必要なのは、「ユーザーが名前を付けて管理しているブロック」だけです。この `If Left(blk.Name, 1) <> “” Then` という条件分岐こそが、「素人」と「エンジニア」を分かつ境界線です。
—
4. プロの視点:次なるステップへのアドバイス
このコードをクリアしたら、次は以下のステップへ挑戦してみてください。
1. Excelへの書き出し: `MsgBox` ではなく、`Range(“A1”).Value` を使ってExcelシートにリストを流し込む。
2. 挿入数のカウント: `ModelSpace` 内を走査し、そのブロックが図面上に何個配置されているか数えてみる(`Select` を使わずに、`AcadBlockReference` をフィルタリングするのがコツです)。
最後に
コードをコピペして動かすだけでなく、「なぜこのオブジェクトはここに存在するのか?」という問いを常に持ってください。その視点があれば、あなたはどんな複雑なカスタマイズも自力で解決できるエンジニアになれます。
AutoCAD VBAの世界へようこそ。ここからが、真の自動化の始まりです。何か詰まったら、いつでも戻ってきてくださいね。応援しています!
