こんにちは!AutoCAD VBAの世界へようこそ。
「マクロの記録」ボタンを押して図形を描いてみたものの、「ここからどうやって複雑な処理を自動化すればいいんだろう?」と立ち止まっていませんか?
大丈夫、ここをクリアすれば、あなたのAutoCAD VBAスキルは一気に「実務レベル」へと駆け上がります。
今回は、図面の中に散らばる膨大なオブジェクト(線や円、文字など)の中から、「特定の条件(画層や色、種類など)に一致するものだけを瞬時に見つけ出し、リスト化する」という、実務で100%直面する課題を鮮やかに解決するテクニックを伝授します。
AutoCADのオブジェクトモデルの心臓部である `AcadDocument` と `AcadObject` の連携をマスターし、現場で即戦力となるコードを一緒に組み立てていきましょう。
—
1. なぜ「全オブジェクトの走査」でつまずくのか?
AutoCAD VBA初学者が最初にぶ
かる壁、それは「図面の中身をどうやって覗き見ればいいのかわからない」という点です。
人間の眼であれば、図面を開いて「あ、この赤い線はレイヤーAだな」と一目でわかります。しかし、VBAのプログラムにとっては、図面ファイルはただの「果てしないデータの海」です。この海を効率よく泳ぐためのパスポートが、`AcadDocument.ModelSpace`(モデル空間)というコレクションオブジェクトです。
オブジェクトの階層構造をイメージしよう
AutoCAD VBAの構造は、マトリョーシカのような階層構造になっています。
- `AcadApplication` (AutoCADソフトそのもの)
- `AcadDocument` (現在開いている図面ファイル)
- `ModelSpace` (図面の中のキャンバス)
- `AcadObject` (一本の線、一つの円などの個別の図形)
この「ModelSpace」という箱の中には、作成したすべての図形がごちゃまぜに入っています。ここから「特定の条件に合うものだけをピックアップする」ためには、箱の中身を一つずつ取り出してチェックする「ループ処理(For Each文)」と、条件分岐の「If文」のコンビネーションが不可欠になります。
—
2. 実践!属性フィルタリング・マクロの全貌
それでは早速、図面内の全オブジェクトを走査し、「特定の画層(Layer)」かつ「特定のタイプ(例:円)」のオブジェクトだけを抽出して、VBAのイミディエイトウィンドウにリストアップする実用コードを公開します。
開発環境(VBE)を開き、標準モジュールに以下のコードを貼り付けてみてください。
Sub FilterObjectsByLayerAndType()
Dim acadDoc As AcadDocument
Dim ent As AcadEntity
Dim targetLayer As String
Dim targetTypeName As String
Dim matchCount As Long
‘ — 1. 検索条件の設定(必要に応じて書き換えてください) —
targetLayer = “0” ‘ 抽出したい画層名
targetTypeName = “AcDbCircle” ‘ 抽出したいオブジェクトのクラス名(例:円なら AcDbCircle)
‘ — 2. 現在アクティブな図面を取得 —
Set acadDoc = ActiveDocument
‘ エラー対策:モデル空間が空っぽの場合の考慮
If acadDoc.ModelSpace.Count = 0 Then
MsgBox “モデル空間にオブジェクトが存在しません。”, vbExclamation
Exit Sub
End If
matchCount = 0
‘ — 3. モデル空間の全オブジェクトを走査(ここが核心!) —
Debug.Print “=== フィルタリング結果開始 ===”
For Each ent In acadDoc.ModelSpace
‘ 条件A: 画層が一致するか?
If StrComp(ent.Layer, targetLayer, vbTextCompare) = 0 Then
‘ 条件B: オブジェクトの型(EntityName)が一致するか?
If StrComp(ent.EntityName, targetTypeName, vbTextCompare) = 0 Then
‘ 条件クリア!カウンターをインクリメント
matchCount = matchCount + 1
‘ 情報をイミディエイトウィンドウに出力
Debug.Print matchCount & “番目: Handle=” & ent.Handle & ” / 画層=” & ent.Layer & ” / タイプ=” & ent.EntityName
‘ 【応用】ここでプロパティを変更することも可能です!
‘ 例:抽出したオブジェクトの色を「赤(1)」に変更する場合
‘ ent.Color = acRed
End If
End If
Next ent
Debug.Print “=== フィルタリング完了 (合致件数: ” & matchCount & “件) ===”
MsgBox “処理が完了しました。合致件数: ” & matchCount & “件”, vbInformation
End Sub
—
3. コードの急所を徹底解説!
このコードには、現場のプロが必ず押さえている「安全かつスマートに動かすための知見」が詰まっています。いくつか重要なポイントを解説しましょう。
① `For Each ent In acadDoc.ModelSpace` の魔力
コレクション(集まり)を総当たりで調べる際、`For Each` 文は最強の味方です。配列のインデックスを気にすることなく、モデル空間にいるすべての住人に「君の画層はなに?」と順番に話しかけていくことができます。
② なぜ `AcadEntity` を使うのか?
変数 `ent` の宣言に `AcadEntity` という型を使っています。
AutoCADの図面には、線(Line)、円(Circle)、文字(Text)など、多種多様な形状が存在します。これらを個別の型(`AcadLine` や `AcadCircle` 等)で受けようとすると、オブジェクトの種類ごとにコードを書かなければならなくなり、破綻します。
すべての図形の共通の親である `AcadEntity`(または `AcadObject`) で受けることで、どんな図形であっても一つのループでまとめて処理できるようになります。
③ 大文字・小文字を無視する `StrComp`
画層名やオブジェクトの判定に `UCase` 関数を使ったり、単純に `=` で比較していませんか?
実務の図面では、「Layer1」と「layer1」のように大文字・小文字が混在していることがよくあります。文字列比較には `StrComp(str1, str2, vbTextCompare)` を使うことで、大文字・小文字の違いを完全に無視して安全に比較できます。これがバグを防ぐプロの技です。
—
4. 陥りやすい罠とエラー回避の知見
AutoCAD VBAで図形を操作するとき、初心者が必ずと言っていいほどハマる「罠」があります。事前に知っておくだけで、開発スピードが何倍も変わります。
罠1:ロックされた画層や非表示画層のオブジェクトも触ってしまう
上記のコードは、「画面に見えていようが、ロックされていこうが、モデル空間に存在する限り容赦なくヒット」します。
もし「画面上で選択可能なものだけ」「ロックされていないものだけ」を対象にしたい場合は、条件分岐に `ent.Lock`(ロック状態)や `ent.Visible`(表示状態)のチェックを挟む必要があります。
罠2:オブジェクトの「ハンドル(Handle)」を味方につける
コード内で `ent.Handle` というプロパティを出力しています。これは、AutoCADが図面内のすべてのオブジェクトに割り振っている「世界に一つだけの固有ID(背番号)」です。
「どの図形がヒットしたのか」を後から図面上で特定したい場合、このHandle番号を記録しておけば、次回の処理で迷子になることがなくなります。
—
おわりに:ここをクリアすれば、基本はバッチリ!
お疲れ様でした!
今回学んだ `AcadDocument` からの `ModelSpace` の走査、そして `For Each` と条件分岐を組み合わせたフィルタリングの仕組みは、AutoCAD VBAにおける「全自動化の基本パターン」そのものです。
このベースさえ頭に入っていれば、
- 「図面内の特定の文字を一括置換する」
- 「特定の色の線だけを別の画層に移動させる」
- 「図面内の特定のブロックの個数を集計してCSVに書き出す」
といった、あらゆる実務の自動化に応用できるようになります。
「マクロの記録」の向こう側にある、自由自在なAutoCADのコントロールを楽しんでください。あなたの業務自動化の旅を、これからも応援しています!
