こんにちは!AutoCAD VBAの世界へようこそ。
マクロの記録ボタンを押すだけのステージから抜け出し、自分の手で図面を自在に操るプログラムを書こうとしているあなたへ、最高にワクワクする技術をお伝えします。
今回は、図面の中から特定の文字(たとえば「注意」という文字列)を自動で探し出し、その位置情報をゲットするという、実務でめちゃくちゃ使えるテーマを扱います。これができるようになると、図面チェックの自動化や、特定パーツの自動集計といった夢のような効率化への扉が開きます。
「VBAって難しそう……」なんて心配はいりません。
ここをクリアすれば、AutoCAD VBAの基本構造はバッチリです。優しく、そして本質的なところまでしっかりと解説していきますね。
—
1. AutoCAD VBAの根幹:オブジェクトモデルを理解しよう
まず、AutoCAD VBAの全体像を頭に思い描いてみましょう。
AutoCADの世界は、ロシアの民芸品「マトリョーシカ」のように階層構造(オブジェクトモデル)でできています。
- `AcadApplication`:AutoCADのアプリケーション全体(一番大きな親玉)
- `AcadDocument`:今あなたが開き、作業している「図面ファイル」
- `ModelSpace` / `PaperSpace`:図形が描かれている「キャンバス」
- `AcadEntity`:線、円、文字などの「個々の図形」
文字を探すということは、「モデル空間(ModelSpace)という引き出しを開け、中に入っている全ての図形を1つずつ取り出して『君、探している文字を持っているかい?』と確認していく作業」に他なりません。このイメージをまずは持ってください。
—
2. 検索の鍵:TextString と 座標プロパティ
AutoCADで文字を表すオブジェクトには、主に `AcDbText`(1行文字) と `AcDbMText`(マルチテキスト) の2種類があります。
VBAではどちらも `AcadText` や `AcadMText` というオブジェクトとして扱われます。
これらが持つ重要な武器(プロパティ)がこちらです。
- `TextString`:文字の中身(文字列)
- `InsertionPoint`:文字の挿入起点(座標:X, Y, Zの配列)
今回は最もシンプルな1行文字(`AcadText`)をターゲットにして、指定した文字列を検索し、その位置(座標)をイミディエイトウィンドウに表示するコードを見ていきましょう。
—
3. 実践!文字検索・位置情報取得マクロ
以下のコードを、AutoCADのVBAエディタ([Alt] + [F11] で起動)の標準モジュールに貼り付けてみてください。
Sub FindTextAndGetPosition()
Dim acadDoc As AcadDocument
Dim ent As AcadEntity
Dim targetText As String
Dim foundCount As Long
‘ 1. 検索したい文字列を指定
targetText = “注意”
foundCount = 0
‘ 2. 現在アクティブな図面を取得
Set acadDoc = ThisDrawing
‘ 3. モデル空間内のすべての図形をスキャン開始
For Each ent In acadDoc.ModelSpace
‘ 4. 取り出した図形が「1行文字(AcadText)」かどうかを判定
If TypeOf ent Is AcadText Then
Dim txtObj As AcadText
Set txtObj = ent
‘ 5. 文字列の中にターゲットが含まれているかチェック
‘ (InStr関数は、文字列が含まれていればその位置を、なければ0を返します)
If InStr(txtObj.TextString, targetText) > 0 Then
foundCount = foundCount + 1
‘ 6. 位置情報(挿入基点の座標)を取得
Dim insPoint As Variant
insPoint = txtObj.InsertionPoint
‘ 7. 結果をVBAのコンソール(イミディエイトウィンドウ)に出力
Debug.Print “— 見つかりました! (” & foundCount & “件目) —”
Debug.Print “文字列: ” & txtObj.TextString
Debug.Print “座標 X: ” & insPoint(0) & “, Y: ” & insPoint(1) & “, Z: ” & insPoint(2)
End If
End If
Next ent
‘ 8. 終了報告
If foundCount > 0 Then
MsgBox “検索完了: ” & foundCount & “件の文字が見つかりました。[Alt]+[F11]で結果を確認してください。”, vbInformation
Else
MsgBox “指定された文字列は見つかりませんでした。”, vbExclamation
End If
End Sub
コードのここがポイント!
- `For Each ent In acadDoc.ModelSpace`
モデル空間にある図形を端から端まで自動でループ処理します。手動で探したら目がチカチカする作業も、コンピューターなら一瞬です。
- `TypeOf ent Is AcadText`
モデル空間には線(Line)や寸法線(Dim)など色々な図形が混ざっています。「文字だけ」を正確に選別するための重要なフィルターです。ここをサボるとエラーになります。
- `insPoint = txtObj.InsertionPoint`
AutoCADの座標は、VBAでは「配列(Array)」として返ってきます。そのため、`insPoint(0)`がX座標、ビュンと飛んで`insPoint(1)`がY座標、`insPoint(2)`がZ座標になります。
—
4. 初心者がハマりやすい「3つの罠」と回避策
AutoCAD VBAを書き始めると、誰もが一度は次のような壁にぶつかります。先輩からのアドバイスとして心に留めておいてください。
1. マルチテキスト(MText)がヒットしない!
- 原因:今回のコードは `AcadText`(1行文字)専用です。図面によくある段落形式の文字は `AcadMText` という別オブジェクトになります。
- 対策:実務では `If TypeOf ent Is AcadText Or TypeOf ent Is AcadMText Then` のように、両方に対応できるように条件分岐を拡張するのがプロの技です。
2. 大文字・小文字、全角・半角の罠
- 原因:プログラムは非常に正直です。「注意」と「ちゅうい」や、半角の「ABC」と全角の「ABC」を別物として認識します。
- 対策:必要に応じて `UCase` 関数で大文字を統一したり、検索前に文字列のゆらぎをケアするロジックを入れましょう。
3. ブロック図形の中にある文字が見つからない!
- 原因:今回のコードはあくまで「モデル空間の直下」しか見ていません。ブロック(参照)の中にネストされている文字は、ブロック内部の定義(`Block`オブジェクト)まで潜り込む必要があります。
—
おわりに:図面チェック自動化への第一歩
お疲れ様でした!
今回学んだ「オブジェクトをループで総当たりし、型を判定してプロパティを引っ張ってくる」という一連の流れは、AutoCAD VBAのすべての基本であり、極意です。
ここをクリアできたあなたなら、文字の検索だけでなく、「特定の層(画層)にある線を全部数える」「図枠の文字列を読み取ってファイル名を自動変更する」といった高度な自動化へ進む実力がすでについています。
ぜひ手元のAutoCADでコードを動かし、イミディエイトウィンドウに座標がズラリと表示される快感を味わってみてください。
あなたのAutoCADライフが、もっとスマートで楽しいものになりますように!
