こんにちは!AutoCAD VBAの世界へようこそ。
日々、膨大な図面と格闘する中で「この線分にだけは、後から検索できる『材質』や『管理番号』を持たせられたらどれほど楽だろう……」と思ったことはありませんか?
マクロの記録から一歩進み、真の「業務自動化エンジニア」への扉を開くとき、私たちが直面するのは「オブジェクトのライフサイクルとデータの紐付け」という壁です。
今回は、AutoCADの図面内にある図形(Entity)に、外部データベースに頼ることなく、図面ファイルそのものにカスタムプロパティ(拡張データ)を自動付与し、管理・検索するプロフェッショナルなソリューションを授けましょう。
ここをクリアすれば、あなたのAutoCAD VBAスキルは間違いなく一線級になります。さあ、一緒に本質を紐解いていきましょう!
—
1. なぜ「拡張データ(XData)」を使うのか?
AutoCADの図形(線分や円など)には、標準でレイヤーや色、線種といったプロパティがありますが、ユーザー独自の「材質(例: SUS304)」や「管理番号(例: MN-2023-001)」をそのまま保持する標準プロパティはありません。
ここで登場するのが、AutoCADが持つ隠し武器「XData(拡張データ / Extended Data)」です。
XDataの本質を理解するためのポイントをまとめました。
- 図形と運命を共にする: 図形をコピーすればXDataもコピーされ、削除すれば一緒に消滅します(オブジェクトのライフサイクルと完全同期)。
- アプリケーション名で管理される: どのプログラムが書き込んだデータかを識別する「レジストリ(AppName)」を持つため、他のアドインとデータが衝突しません。
- 図面(DWG)に保存される: 外部のExcelやCSVとリンクさせなくても、DWGファイルをメールで送るだけでデータが保持されます。
—
2. 【全体像】今回構築するVBAソリューション
今回のプログラムでは、以下の2つのステップを自動化するマクロを作成します。
1. データ付与(Writer): 選択したオブジェクトに、指定した「材質」と「管理番号」のカスタムプロパティをXDataとして書き込む。
2. データ検索・読取(Reader): 図面内から特定の「管理番号」を持つオブジェクトを一発でハイライト(選択)し、プロパティを読み取る。
—
3. 実装コード:プロフェッショナル仕様のVBAモジュール
以下のコードを、AutoCADのVBAエディタ(`Alt + F11`)の標準モジュールにそのまま貼り付けてください。実務でそのまま使えるよう、エラーハンドリングとオブジェクトの解放処理(メモリ管理)を徹底しています。
Option Explicit
‘ =================================================================================
‘ テーマ: AutoCAD VBAによるオブジェクトへのカスタムプロパティ付与・管理ソリューション
‘ 著者: チーフアーキテクト
‘ =================================================================================
Private Const APP_NAME As String = “MY_COMPANY_DATA” ‘ 拡張データを識別するアプリケーション名
‘ — 1. カスタムプロパティを付与するプロシージャ —
Public Sub SetCustomProperties()
Dim acadObj As AcadEntity
Dim pickPoint As Variant
On Error GoTo ErrorHandler
‘ ユーザーにオブジェクトを1つ選択させる
ThisDrawing.Utility.GetEntity acadObj, pickPoint, vbCr & “プロパティを付与するオブジェクトを選択してください: ”
‘ 拡張データを格納するための変数群(AutoCAD VBAではDataTypeとDataValueの配列ペアを使う)
Dim dataTypes(1) As Integer
Dim dataValues(1) As Variant
‘ データの定義(グループコードの設定)
‘ 1000は「文字列」を意味するDXFグループコード
dataTypes(0) = 1000: dataValues(0) = “材質: SUS304”
dataTypes(1) = 1000: dataValues(1) = “管理番号: MN-2023-9999”
‘ 1. アプリケーション名を登録(未登録の場合は自動登録される)
ThisDrawing.RegApp APP_NAME
‘ 2. オブジェクトにXDataを書き込む
acadObj.SetXData dataTypes, dataValues
MsgBox “オブジェクトにカスタムプロパティを正常に付与しました!”, vbInformation, “成功”
CleanUp:
Exit Sub
ErrorHandler:
If Err.Number <> -2147352567 Then ‘ ユーザーがESCキーでキャンセルした場合のエラー(-2147352567)は無視
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “エラー”
End If
Resume CleanUp
End Sub
‘ — 2. 拡張データを読み取り・検索するプロシージャ —
Public Sub FindObjectByCustomProperty()
Dim ent As AcadEntity
Dim foundCount As Long
foundCount = 0
On Error GoTo ErrorHandler
‘ モデル空間内のすべてのエンティティを走査
For Each ent In ThisDrawing.ModelSpace
Dim typeArray As Variant
Dim valArray As Variant
‘ オブジェクトからXDataを取得
ent.GetXData APP_NAME, typeArray, valArray
‘ XDataが存在するかチェック(配列が初期化されているか)
If Not IsEmpty(valArray) Then
‘ 格納されているデータの中に目的の文字列が含まれているかチェック
Dim i As Long
For i = LBound(valArray) To UBound(valArray)
If InStr(valArray(i), “MN-2023-9999”) > 0 Then
‘ 該当オブジェクトをハイライト(選択状態)にする
ent.Highlight True
foundCount = foundCount + 1
End If
Next i
End If
Next ent
MsgBox foundCount & “件のオブジェクトが条件に一致しました。”, vbInformation, “検索完了”
CleanUp:
Exit Sub
ErrorHandler:
MsgBox “検索中にエラーが発生しました: ” & Err.Description, vbCritical, “エラー”
Resume CleanUp
End Sub
—
4. コードの深掘り解説:ここがエンジニアの急所
初心者から抜け出すために、このコードの重要なポイントを3つ解説します。
① DXFグループコード(`1000`)の正体
`dataTypes(0) = 1000` という記述があります。これはAutoCADの内部データベース(DXF形式)における「文字列データ」を表すコード番号です。XDataを扱う際、AutoCADは「今から何のデータを送るのか」を型番(グループコード)で厳密に管理しています。カスタムプロパティを文字として持たせる場合は、基本的に `1000` を指定すると覚えておけば間違いありません。
② アプリケーション名(`RegApp`)の儀式
`ThisDrawing.RegAPP APP_NAME` を実行している部分に注目してください。
XDataは、どのプログラムが書き込んだものかを示す「名札(AppName)」を必ずセットで持ちます。AutoCADはこの名札がないとXDataを受け入れてくれません。データベースへの「書き込み権限の申請」のようなものだとイメージしてください。
③ 処理の総なめ(モデル空間のイテレーション)
検索処理(`FindObjectByCustomProperty`)では、`For Each ent In ThisDrawing.ModelSpace` を使って図面内の全図形を総当たりでチェックしています。
「数万個の図形がある図面では重くなるのでは?」と思ったあなた、鋭い視点です!実務でパフォーマンスが問題になる規模(数万〜数十万オブジェクト)の図面を扱う場合は、ここで解説した線形探索ではなく、AutoCADの「画期的な選択セット(SelectionSet)のフィルター機能」を組み合わせるのがプロの手法です。これについてはまた別の機会にお話ししましょう。
—
5. 陥りやすい罠とエラー回避の知見
AutoCAD VBA開発で最も多い失敗が、「オブジェクト変数の解放忘れとエラーハンドリングの欠如」です。
- エラー:型が一致しません(Error 13)
- 原因: `GetXData` で取得した `valArray` が、データを持たないオブジェクトに対しては「空(Empty)」として返されるため、そのまま `UBound` やループを回そうとするとクラッシュします。必ず `If Not IsEmpty(valArray) Then` でガードをかけましょう。
- ESCキーによる中断のケア
- ユーザーが図形選択中に `ESC` キーを押すと、VBAは容赦なく実行時エラーを吐いて停止します。上記のコードのように `On Error GoTo` を必ず記述し、優しく安全にプロシージャを抜け出す設計にすることが、プロフェッショナルたる所以です。
—
まとめ:ここをクリアすれば、AutoCAD VBAの基本はバッチリです!
お疲れ様でした!今回は「図形に独自のプロデータを宿らせる」という、一歩進んだAutoCAD VBAの領域を体験していただきました。
- オブジェクトが持つ標準プロパティの限界を XData で突破すること
- データの書き込みと、安全な検索・イテレーションの仕組み
この2つを自分のものにできたあなたは、単なる「マクロの記録が使える人」から、図面データを意のままに操る「AutoCAD業務自動化エンジニア」へと確実にステップアップしています。
日々の退屈な手作業をコードで駆逐し、エンジニアリングの醍醐味を存分に味わってください。あなたのVBAライフが最高のものになることを応援しています!
