こんにちは!AutoCAD VBAの海原へようこそ。
マクロの記録ボタンを押して「動いた!」と喜んでいた時期を通り越し、「図面ファイルそのものに、自分たちの管理データをスマートに隠し持たせたい」「外部のテキストやExcelと紐付けなくても、図面単体で情報を完結させたい」そう思ったことはありませんか?
今回は、実務で一歩先を行く中級者へ向けて、AutoCADの奥深くに眠る「辞書(Dictionaries)」と「拡張レコード(XRecords)」を完全網羅する極意を伝授します。
ここをクリアすれば、あなたのAutoCAD VBAスキルは「お絵描き自動化ツール」から「本格的なCADデータベース構築」へと劇的に進化します。さあ、一緒に扉を開けましょう!
—
1. なぜ「拡張データ」ではなく「辞書と拡張レコード」なのか?
AutoCADで図面に独自のデータを埋め込む方法として、古くから「拡張データ(XData)」という仕組みが存在します。しかし、XDataには「容量が最大16KBまで」「データ構造がレジストリ的で扱いにくい」という致命的な弱点があります。
そこで現代のAutoCAD VBAエンジニアが使うべきなのが、「Dictionaries(辞書)」と「XRecords(拡張レコード)」のコンビネーションです。
- AcadDictionaries(辞書): 図面という巨大な本棚の中にある「鍵付きの引き出し」のようなものです。固有の名前(キー)でデータを管理します。
- AcadXRecord(拡張レコード): その引き出しの中にしまえる「自由帳」です。文字、整数、実数など、多種多様なデータをリスト構造(DXFグループコード)で無限に詰め込むことができます。
これらを使えば、図面の中に「プロジェクトID」「設計担当者」「最終承認日」「専用のステータスフラグ」などを完璧に、しかもユーザーに見えない形で安全に保存できるのです。
—
2. 図面へメタデータを「書き込む」極意
まずは、アクティブな図面(`ThisDrawing`)のルート辞書に、独自のカスタム辞書を作成し、そこにデータを書き込むコードを見てみましょう。
実務でそのままコピペして使えるよう、エラーハンドリングの骨組みも意識した設計にしています。
Sub SaveCustomMetadataToDrawing()
Dim appName As String
Dim customDict As AcadDictionary
Dim xRec As AcadXRecord
Dim dataTypes(0 To 2) As Integer
Dim dataValues(0 To 2) As Variant
‘ 辞書の名前(一意のキー名にすること)
appName = “MY_COMPANY_METADATA”
On Error GoTo ErrorHandler
‘ 1. 図面のルート辞書(Dictionaries)を取得し、自社用のカスタム辞書を追加/取得する
‘ ※ すでに存在する場合はエラーになるため、エラー回避または存在確認が必要ですが、
‘ 今回はシンプルに「なければ作成、あれば取得」の定番パターンを実装します。
On Error Resume Next
Set customDict = ThisDrawing.Dictionaries.Item(appName)
If Err.Number <> 0 Then
Err.Clear
Set customDict = ThisDrawing.Dictionaries.Add(appName)
End If
On Error GoTo ErrorHandler
‘ 2. 拡張レコード(XRecord)の名前を定義し、すでにあれば削除して作り直す
Dim xRecName As String
xRecName = “ProjectInfo”
Dim existingObj As AcadObject
On Error Resume Next
Set existingObj = customDict.Item(xRecName)
If Err.Number = 0 Then
‘ すでに存在する場合は一度削除してクリーンな状態にする
customDict.Remove (xRecName)
End If
On Error GoTo ErrorHandler
‘ 3. 新しく拡張レコードを作成
Set xRec = customDict.AddXRecord(xRecName)
‘ 4. 保存したいデータを「DXFグループコード」の作法に従って配列に格納する
‘
‘ 【DXFグループコードの基本】
‘ 1 = 文字列 (String)
‘ 70 = 整数 (Integer / Long)
‘ 40 = 浮動小数点数 (Double)
dataTypes(0) = 1: dataValues(0) = “PRJ-2023-9999” ‘ プロジェクトID
dataTypes(1) = 1: dataValues(1) = “山田 太郎” ‘ 設計担当者
dataTypes(2) = 70: dataValues(2) = 2 ‘ ステータス(2: 承認済み)
‘ 5. 拡張レコードにデータを流し込む
xRec.SetXRecordData dataTypes, dataValues
MsgBox “図面へのメタデータの埋め込みに成功しました!”, vbInformation, “成功”
Exit Sub
ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “異常終了”
End Sub
ここがエンジニアのこだわりポイント
AutoCADのXRecordは、データを書き込む際に「データの種類(DXFグループコード)」と「実際の値」をペアの配列で渡す必要があります。
「文字列なら `1`」「整数なら `70`」というお作法さえ守れば、Variant型配列のパワーを借りて、あらゆるデータをひとまとめに飲み込ませることができます。
—
3. 埋め込んだメタデータを「読み出す」極意
データを書き込めるようになったら、次は「読み出し」です。
「図面を開いたときに、自動で前回の担当者やプロジェクトIDをロードしたい」といった要件で必ず使います。
Sub ReadCustomMetadataFromDrawing()
Dim appName As String
Dim xRecName As String
Dim customDict As AcadDictionary
Dim xRec As AcadXRecord
Dim dataTypes As Variant
Dim dataValues As Variant
appName = “MY_COMPANY_METADATA”
xRecName = “ProjectInfo”
On Error GoTo NotFound
‘ 1. ルート辞書からカスタム辞書を取得
Set customDict = ThisDrawing.Dictionaries.Item(appName)
‘ 2. カスタム辞書から目的の拡張レコードを取得
Set xRec = customDict.Item(xRecName)
‘ 3. 拡張レコードからデータを配列として取り出す
xRec.GetXRecordData dataTypes, dataValues
‘ 4. 取得したデータをメッセージボックスで表示(確認用)
Dim msg As String
msg = “【図面メタデータ読込結果】” & vbCrLf & _
“・プロジェクトID: ” & dataValues(0) & vbCrLf & _
“・設計担当者: ” & dataValues(1) & vbCrLf & _
“・ステータスID: ” & dataValues(2)
MsgBox msg, vbInformation, “メタデータ抽出完了”
Exit Sub
NotFound:
MsgBox “この図面には目的のメタデータが埋め込まれていません。”, vbExclamation, “データなし”
End Sub
—
4. 現場でやりがちな「落とし穴」と回避の極意
AutoCAD VBAでこの領域に踏み込むと、いくつかの「罠」にハマりがちです。先輩エンジニアからのアドバイスとして、心構えをシェアしておきます。
罠その1: オブジェクトのライフサイクルとエラーハンドリング
`ThisDrawing.Dictionaries.Item(…)` は、指定した名前の辞書が存在しない場合に容赦なく実行時エラー(エラー番号: 5 等)を発生させてクラッシュします。
そのため、必ず `On Error Resume Next` を適切に挟むか、事前に辞書の存在チェックを行う防衛的プログラミング(Defensive Programming)を徹底してください。
罠その2: 変数型のミスマッチ
`GetXRecordData` で取り出した `dataValues` は、`Variant` 型の配列として返ってきます。
例えば整数型(70)として保存したはずのデータも、Variant型として入っているため、他のプロシージャに渡す際に型の不一致(Type Mismatch)を起こすことがあります。必要に応じて `CInt()` や `CStr()` で明示的に型変換して使いましょう。
—
まとめ:ここをクリアすればAutoCAD VBAの基本はバッチリです!
お疲れ様でした!
「図面内の辞書と拡張レコード」という、一見すると難解なテーマをここまで読み進めたあなたなら、もう単なる「マクロ記録の使い手」ではありません。立派なAutoCADアプリケーション・エンジニアです。
図面という閉じた空間の中に、自分だけのデータベースを持たせる。この技術をマスターすれば、図面管理システムとの連携や、自動バッチ処理における進捗フラグの付与など、実務で無双できる自動化ツールが次々と生み出せるようになります。
ぜひ、日々の業務にこのテクニックを取り入れて、まわりをあっと言わせるようなスマートなシステムを構築してみてください。あなたのVBAライフが、より一層充実したものになることを応援しています!
