AutoCAD VBAを掌握する極限の知見:図面メタデータをXML化し、外字システムと完全同期させる設計思想
こんにちは。チーフアーキテクトの私だ。
日々のCADオペレーション、あるいは重厚長大な図面管理に疲弊していないか?
「図面の中に眠る設計進捗や承認ステータスを、外部の工程管理システムからリアルタイムで参照したい」
「カスタムプロパティを目視で転記させるという、エンジニアの誇りを傷つける手作業を今すぐ根絶したい」
実務でAutoCAD VBAを使うなら、単に画層を操作したり線を引くだけのスクリプトで満足していてはいけない。AutoCADを「データソース」として捉え、企業内の他システムとシームレスに連携させることこそが、中級者から真の自動化エンジニアへ脱却するための試金石となる。
今回は、`AcadDocument.Database.SummaryInfo`(図面のプロパティ)に刻まれたカスタムプロパティを抽出し、堅牢なXML構造体として書き出すことで、外部の工程管理システムとの完全なデータ同期を実現するプロダクトコードを伝授しよう。
—
なぜ「文字のハードコード」や「場当たり的なファイル操作」は破綻するのか?
実務の現場でよく見かけるアンチパターンとして、図面内の特定の文字(MTextやDText)を「進捗ステータス」の代わりとして配置し、それをVBAで強引に読み取ろうとするアプローチがある。
これは最悪の設計だ。理由は明白である。
1. データの整合性リスク: オペレーターがうっかり文字を消去したりフォントを変更したりしただけで、連携プログラムが沈黙する。
2. メタデータと形状の混同: 図面上の「図形」と、管理上の「属性」はレイヤーを完全に分けるべきである。
AutoCADには、図面そのものにメタデータを付与する公式の仕組みとして「図面プロパティ(Database.SummaryInfo)」が用意されている。特に「カスタムタブ」に格納されるキーバリューペアは、外部システムとの連携において最強のインターフェースとなる。
これらを安全に取得し、厳密なスキーマを持つXMLとして出力する――このパイプラインを構築することが、最も保守性が高くバグの起きないアプローチなのだ。
—
実装の全体設計と堅牢なエラーハンドリング
今回構築するモジュールは、以下の要件を満たすプロダクションクオリティとする。
- 遅延バインディングと型安全のバランス: AutoCADのバージョン差異(2021〜2024+)に耐えうるオブジェクト参照。
- DOM(Document Object Model)によるXML生成: 文字列結合によるXML生成は特殊文字(`&`, `<`, `>`など)で即座に破綻するため、`MSXML2.DOMDocument`等の正統派パーサーを使用する。
- トランザクション的安全性: ファイル書き込み時のロック競合や、カスタムプロパティが未定義である場合(ゼロ件例外)の完全なガード。
—
プロダクションコード:XMLエクスポート・エンジン
以下のコードを、ExcelやAutoCADのVBAエディタ(標準モジュール)にそのまま実装してほしい。実務での即戦力となるよう、エラーハンドリングと詳細なコメントを施してある。
Option Explicit
‘ ==============================================================================
‘ 処理名 : ExportDrawingMetadataToXML
‘ 概要 : アクティブなAutoCAD図面のカスタムプロパティを抽出し、XMLファイルへ出力する
‘ 備考 : 外部の工程管理システムとの連携インポート用データソースとして利用
‘ ==============================================================================
Public Sub ExportDrawingMetadataToXML()
Dim acadApp As Object
Dim acadDoc As Object
Dim summaryInfo As Object
‘ 1. AutoCADアプリケーションのセーフティな取得 (Running Instance)
On Error Resume Next
Set acadApp = GetObject(, “AutoCAD.Application”)
If Err.Number <> 0 Then
MsgBox “AutoCADが起動していません。図面を開いてから実行してください。”, vbCritical, “連携エラー”
Exit Sub
End If
On Error GoTo 0
Set acadDoc = acadApp.ActiveDocument
If acadDoc Is Nothing Then
MsgBox “アクティブな図面が存在しません。”, vbCritical, “連携エラー”
Exit Sub
End If
‘ 2. Database.SummaryInfo の取得
‘ Databaseオブジェクト経由でサマリー情報(標準プロパティ・カスタムプロパティ)にアクセス
Set summaryInfo = acadDoc.Database.SummaryInfo
‘ 3. XMLドキュメントの構築 (MSXML2.DOMDocumentを使用)
Dim xmlDoc As Object
Dim rootElem As Object
Dim nodeDrawing As Object
Dim nodeCustomProps As Object
Set xmlDoc = CreateObject(“MSXML2.DOMDocument.6.0”)
xmlDoc.async = False
xmlDoc.preserveWhiteSpace = True
‘ XML宣言とルート要素の作成
Dim decl As Object
Set decl = xmlDoc.createProcessingInstruction(“xml”, “version=’1.0’ encoding=’UTF-8′”)
xmlDoc.appendChild decl
Set rootElem = xmlDoc.createElement(“EngineeringDataSync”)
xmlDoc.appendChild rootElem
‘ 図面基本情報の付与
Set nodeDrawing = xmlDoc.createElement(“DrawingMetadata”)
nodeDrawing.setAttribute “FileName”, acadDoc.Name
nodeDrawing.setAttribute “FullPath”, acadDoc.FullName
nodeDrawing.setAttribute “ExportTimestamp”, Format(Now, “yyyy-mm-ddThh:nn:ss”)
rootElem.appendChild nodeDrawing
‘ 4. カスタムプロパティの列挙とXMLノードへのマッピング
Set nodeCustomProps = xmlDoc.createElement(“CustomProperties”)
nodeDrawing.appendChild nodeCustomProps
Dim numKeys As Long
Dim i As Long
Dim keyName As String
Dim keyValue As String
‘ 登録されているカスタムプロパティの総数を取得
summaryInfo.GetNumCustomKeys numKeys
If numKeys > 0 Then
For i = 0 To numKeys – 1
‘ キーとバリューを安全に取得
summaryInfo.GetCustomByIndex i, keyName, keyValue
Dim propElem As Object
Set propElem = xmlDoc.createElement(“Property”)
propElem.setAttribute “Name”, keyName
‘ テキストノードとして値を格納(特殊文字のエスケープはDOMが自動処理)
propElem.Text = keyValue
nodeCustomProps.appendChild propElem
Next i
Else
‘ プロパティがゼロ件の場合のハンドリング
Dim emptyElem As Object
Set emptyElem = xmlDoc.createElement(“Notice”)
emptyElem.Text = “Custom properties are not defined.”
nodeCustomProps.appendChild emptyElem
End If
‘ 5. 出力先パスの決定と保存
‘ ※実運用では、工程管理システムがウォッチしている共有フォルダ等に変更すること
Dim outputPath As String
outputPath = acadDoc.Path & “\” & Left(acadDoc.Name, InStrRev(acadDoc.Name, “.”) – 1) & “_sync.xml”
‘ パスが空(未保存図面)の場合のフォールバック
If acadDoc.Path = “” Then
outputPath = “C:\Temp\DrawingSync_” & Format(Now, “yyyymmddhhnnss”) & “.xml”
End If
‘ ファイル上書き保存のエラー対策
On Error GoTo SaveError
xmlDoc.Save outputPath
On Error GoTo 0
‘ 成功通知
MsgBox “図面メタデータのXMLエクスポートが完了しました。” & vbCrLf & _
“保存先: ” & outputPath, vbInformation, “同期処理成功”
Exit Sub
SaveError:
MsgBox “XMLファイルの保存に失敗しました。アクセス権限やパスを確認してください。” & vbCrLf & _
“詳細: ” & Err.Description, vbCritical, “I/Oエラー”
End Sub
—
コードの急所:なぜこの実装がプロフェッショナルなのか?
ここで採用しているアーキテクチャ上のこだわりをいくつか解説しておこう。
1. `MSXML2.DOMDocument.6.0` の採用
古い `Microsoft.XMLDOM` はセキュリティ上の脆弱性があり、現代のWindows環境では推奨されない。バージョン6.0系を指定することで、厳密なXMLスキーマ準拠と高速なメモリ処理を保証している。
2. 自動エスケープ処理の恩恵
もし文字列結合でXMLを作ろうとすると、ユーザーがカスタムプロパティのメモ欄に `&` や `<` などの記号を入力した瞬間にXMLパースエラー(構文崩壊)を起こす。DOMオブジェクトの `.Text = keyValue` を経由することで、XMLエンジンが自動的に特殊文字を安全に実体参照へエスケープしてくれる。
3. 未保存図面への耐性(フォールバック)
新規作成しただけで一度も保存していない(`acadDoc.Path = “”`)図面で実行した場合でも、処理がクラッシュせず `C:\Temp\` 等へ退避させるロジックを組み込んでいる。こうした細かな配慮が、現場で「使えないツール」と言われないための必須条件だ。
—
外部システム連携への展開:ここからどう広げるか
このVBAスクリプトによって出力されたXMLファイルは、以下のようなワークフローの起点となる。
- RPA(UiPathやPower Automate)との連携:
共有フォルダにXMLが生成されたトリガーを検知し、数秒で基幹の生産管理データベース(SQL ServerやOracle、kintoneなど)に自動インポート。
- Pythonスクリプトによるサマリーダッシュボード:
複数の図面から出力されたXMLを一括パースし、プロジェクト全体の進捗率(例:「設計完了」ステータスの図面数 / 総図面数)を社内ポータルに自動描画。
VBAを単なる「図面内のお手伝いツール」で終わらせるな。
図面という巨大な設計資産から、ビジネスに必要なデータを「抽出し、構造化し、解き放つ」。そのための第一歩として、このコードをあなたの開発環境に組み込んでほしい。
現場の生産性を極限まで引き上げるのは、いつだってこういった細部へのこだわりを持つエンジニアの仕事だ。健闘を祈る。
