【AutoCAD VBA極意】図面を開かずに一瞬で属性を書き換える「ObjectDBX」の魔法
皆さん、こんにちは。AutoCADの自動化の世界へようこそ。
現場で「数百枚の図面を開いて、タイトルブロックの属性値を書き換えて保存する」という作業、もしGUI(画面)上で一つずつ開いて行っていたら、どれほどの時間がかかるでしょうか? PCのスペックにもよりますが、数時間単位の貴重な時間が溶けてしまいますよね。
今日は、そんな非効率な作業を「一瞬」で終わらせる、ObjectDBX(Object Database)という技術の極意を伝授します。
—
1. なぜ「ObjectDBX」が最強なのか?
通常のVBAコードで図面を開くとき、`Documents.Open` メソッドを使いますよね。これは「AutoCADのGUI上に図面を描画し、メモリに展開する」という非常に重いプロセスを伴います。
一方、ObjectDBXは、AutoCADの「裏側」にあるデータベースへ直接アクセスする技術です。画面に図面を表示しないため、グラフィック描画の負荷が一切かかりません。 驚くほど高速に、かつバックグラウンドで処理が完結します。
—
2. 実践:図面を開かずに属性を書き換えるコード
さあ、理屈よりもまずはコードを見てみましょう。このコードは、指定したフォルダ内の全DWGファイルを読み込み、特定のタグを持つ属性値を書き換えて保存します。
‘ ObjectDBXを使うための事前準備
‘ 参照設定: “ObjectDBX Type Library” (axdb19enu.tlb 等) を追加してください
‘ ※バージョンによりファイル名は異なります
Public Sub UpdateTitleBlock_Batch()
Dim dbx As Object
Dim folderPath As String
Dim fileName As String
Dim fso As Object
‘ 処理するフォルダを指定
folderPath = “C:\Drawings\ProjectA\”
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ ObjectDBXのインスタンス作成 (AutoCADのバージョンに合わせてProgIDを調整)
Set dbx = CreateObject(“ObjectDBX.AxDbDocument.19”)
fileName = Dir(folderPath & “.dwg”)
Do While fileName <> “”
‘ 1. 図面を裏側で開く(GUIには出ない)
dbx.Open folderPath & fileName
‘ 2. ブロックを探して属性を書き換える
UpdateAttributes dbx, “TITLE_BLOCK”, “DRAWING_NO”, “2023-A001”
‘ 3. 上書き保存
dbx.SaveAs folderPath & fileName
fileName = Dir
Loop
MsgBox “全図面の属性更新が完了しました!”
End Sub
‘ 属性書き換え用ヘルパー関数
Private Sub UpdateAttributes(dbx As Object, blockName As String, tag As String, newValue As String)
Dim ent As Object
Dim atts As Variant
Dim i As Integer
‘ モデル空間の全オブジェクトを走査
For Each ent In dbx.ModelSpace
‘ ブロック参照かどうかを判定
If ent.ObjectName = “AcDbBlockReference” Then
If ent.Name = blockName Then
‘ 属性値の配列を取得
atts = ent.GetAttributes
For i = LBound(atts) To UBound(atts)
‘ 指定したタグと一致したら値を変更
If atts(i).TagString = tag Then
atts(i).TextString = newValue
atts(i).Update
End If
Next i
End If
End If
Next ent
End Sub
—
3. ここで陥りやすい「落とし穴」
この技術をマスターする上で、注意すべき点がいくつかあります。
- 参照設定の罠:
コード冒頭で触れた「ObjectDBX Type Library」の参照設定は必須です。これを行わないと`CreateObject`が失敗します。また、AutoCADのバージョン(2023, 2024など)によって末尾の数値(19, 24など)が変わるため、環境に合わせて調整が必要です。
- モデル空間とペーパー空間:
上記のコードは `dbx.ModelSpace` を走査していますが、タイトルブロックが「レイアウト(ペーパー空間)」にある場合は、`dbx.Layouts` をループして各レイアウト内のオブジェクトを走査する必要があります。
- 保存のタイミング:
ObjectDBXは「開く」→「編集」→「保存」のサイクルが非常に速いです。エラーハンドリングを怠ると、開いたままの状態(ロック状態)でプログラムが終了してしまうことがあります。必ず `On Error Resume Next` 等でエラー処理を組み込むことを推奨します。
—
4. プロへの道:次に進むべきステップ
ObjectDBXを使いこなせるようになると、図面管理だけでなく、「全図面から特定のレイヤのみを抽出して統計を取る」「図面内の文字情報をリスト化してExcelに書き出す」といった、高度なデータ抽出が可能になります。
AutoCAD VBAは、単なる「作図の手間を省くツール」ではありません。「図面データという資産を、自由に操るための言語」です。
まずはこのコードをコピペして、お手元のテスト用フォルダで動かしてみてください。一瞬で図面が更新される瞬間の感動を味わえば、あなたももう自動化の虜(とりこ)になっているはずです。
何か分からないことがあれば、いつでも聞いてください。応援していますよ!
