AutoCAD VBAの深淵へ:図面内文字列を一括置換する「至高の自動化」を実装する
こんにちは。AutoCADの自動化の世界へようこそ。
「マクロの記録」ボタンを押すだけの世界から、自分の手でAutoCADの頭脳を操作する世界へ。今日はその第一歩として、現場で最も需要が高い「テキストの一括置換」をテーマに、オブジェクトモデルの真髄を伝授します。
単にコードを動かすだけでなく、「なぜそのコードが必要なのか」という背景を理解すれば、あなたの自動化スキルは劇的に進化します。
—
1. AutoCADオブジェクトモデルの「階層」を理解する
AutoCAD VBAをマスターする鍵は、オブジェクトの「家系図」を把握することです。すべてはここから始まります。
- Application: AutoCADそのもの。
- Document: 開いている図面ファイル。
- ModelSpace: 図面の中に配置されている個々のオブジェクトの集まり。
今回やりたいことは、「ModelSpaceという名の広い部屋の中に散らばっている全オブジェクト(TEXTやMTEXT)を一つずつ拾い上げ、その中身を検査・変更する」という作業です。
—
2. 実践:文字列一括置換コード
以下のコードをVBAエディタ(Alt + F11)に貼り付けてみてください。まずは動かしてみることが成功への近道です。
Sub BulkReplaceText()
Dim objEntity As AcadEntity
Dim strTarget As String, strReplace As String
‘ 検索したい文字列と置換後の文字列を指定
strTarget = “旧名称”
strReplace = “新名称”
‘ 図面内のすべてのオブジェクトをループ処理
For Each objEntity In ThisDrawing.ModelSpace
‘ 1. オブジェクトが文字系かチェック(TEXT, MTEXT, ATTRIBに対応)
‘ TypeOf を使うと、オブジェクトの種類をスマートに判定できる
If TypeOf objEntity Is AcadText Or TypeOf objEntity Is AcadMText Then
‘ 2. 文字列を含んでいるか確認して置換
If InStr(objEntity.TextString, strTarget) > 0 Then
‘ Replace関数で文字列を入れ替える
objEntity.TextString = Replace(objEntity.TextString, strTarget, strReplace)
‘ 更新を反映させるためにUpdateメソッドを呼ぶのが作法
objEntity.Update
End If
End If
Next objEntity
MsgBox “置換が完了しました!”
End Sub
—
3. ここがプロのこだわり:知っておくべき「落とし穴」
コードを動かした際、あるいは応用しようとした際に必ずぶつかる壁があります。ここをクリアすれば、あなたはもう初級者ではありません。
① 「なぜ `Update` を呼ぶのか?」
AutoCADのデータベースは常に更新されていますが、画面上の表示を強制的に再描画させるために `Update` メソッドを呼ぶのが安全策です。これを忘れると、文字は書き換わっているのに画面表示が古いまま、という現象が起きます。
② 「ATTRIB(属性定義)の罠」
上記のコードは `AcadText` と `AcadMText` に対応していますが、ブロック内の属性値(ATTRIB)は含まれていません。もし属性まで置換したい場合は、`TypeOf objEntity Is AcadBlockReference` でブロックを捕まえ、その中の `GetAttributes` メソッドを叩くという、もう一段階深いループ処理が必要になります。
③ `InStr`関数の役割
`InStr`関数は「文字が見つかった位置」を返します。0が返ってくれば「存在しない」ということ。この判定を入れることで、無駄な書き込み処理を減らし、マクロの動作速度を劇的に向上させることができます。
—
4. 次のステップへ:自動化のエンジニアとして
今回学んだのは「ModelSpaceをループする」という、AutoCAD VBAにおける最も基本的かつ強力なテクニックです。
- 応用編: 特定のレイヤーにある文字だけ置換したい場合は?
- 応用編: 外部参照の中の文字も書き換えたい場合は?
これらはすべて、今回のコードの `If` 文の中に条件を追加していくだけで実現できます。
AutoCAD VBAは、あなたの「退屈な手作業」を「一瞬の快感」に変える魔法の杖です。エラーが出ても恐れないでください。そのエラーこそが、あなたがCADの深淵に触れているという証拠です。
さあ、次はどんな面倒な作業を自動化しましょうか?あなたの自動化エンジニアとしての旅は、まだ始まったばかりです。
