【入門編】【上級プロフェッショナル】AcadApplicationオブジェクトを活用した、複数図面の図面プロパティ(カスタムプロパティ含む)の一括更新 – AutoCAD VBA解析バイブル

スポンサーリンク

こんにちは! AutoCAD VBAの世界へようこそ。
図面のマニュアル作業に追われ、「これを何とか自動化できないか……」と悩んでこのブログに辿り着いたなら、大正解です。

今日は、マクロの記録の延長から抜け出し、AutoCADの神髄である「オブジェクトモデル」を自在に操るための第一歩を踏み出します。テーマは「複数図面の図面プロパティ(カスタムプロパティ含む)の一括更新」です。

現場で何百枚もの図面を管理していると、「すべての図面のプロジェクト番号を書き換えなきゃいけない」「カスタムプロパティのステータスを一括で変えたい」という絶望的な状況に直面しますよね。これを手作業でやっていたら、あなたの貴重な時間が溶けてしまいます。

今回は、AutoCADの頂点に君臨する `AcadApplication` オブジェクトを駆使し、図面を開いて・書き換えて・保存して閉じる、という一連のライフサイクルを美しく自動化するプロフェッショナルなコードを授けましょう。

ここをクリアすれば、あなたのAutoCAD VBAスキルは確実に「初級者」から「実践的な自動化エンジニア」へとシフトします。さあ、一緒に扉を開けましょう!

1. なぜ「AcadApplication」なのか?(オブジェクトモデルの核心)

AutoCAD VBAを語る上で絶対に外せないのが、オブジェクトの階層構造です。

[AcadApplication] (AutoCADアプリそのもの)
└─ [Documents] (現在開いている、または開く図面のコレクション)
└─ [AcadDocument] (個別の図面ファイル)
└─ [SummaryInfo] (図面プロパティの管理棟)

多くの初心者は、今目の前で開いている図面(`ThisDrawing`)を操作することしか考えません。しかし、プロのエンジニアは違います。「アプリ(`AcadApplication`)を司令塔にして、裏側で図面を次々と召喚・退場させる」のです。

このアプローチを取ることで、AutoCADの画面を描画する無駄なコスト(画面更新の負荷)を削ぎ落とし、圧倒的なパフォーマンスで大量の図面を料理できるようになります。

2. 実装:複数図面のプロパティを一括書き換えする魔術

それでは、開発の現場でそのままコピペして使える実用コードを公開します。
このコードは、指定したフォルダ内にあるすべての `.dwg` ファイルを対象に、標準プロプロパティ(タイトル、作成者など)と、現場でよく使われる「カスタムプロパティ」を一網打尽に書き換えます。

VBAのIDE(Alt + F11)を開き、標準モジュールに以下のコードを貼り付けてください。

Option Explicit

‘ =================================================================================
‘ 処理名: 複数図面プロパティ一括更新マクロ
‘ 概要: 指定フォルダ内のDWGファイルを開き、標準&カスタムプロパティを書き換えて保存・閉じる
‘ =================================================================================
Sub BatchUpdateDrawingProperties()
Dim acadApp As AcadApplication
Dim targetDir As String
Dim fileName As String
Dim targetDoc As AcadDocument
Dim sumInfo As AcadSummaryInfo

‘ 1. 司令塔である AcadApplication を取得(すでに動いているAutoCADを掴む)
On Error Resume Next
Set acadApp = GetObject(, “AutoCAD.Application”)
If Err.Number <> 0 Then
MsgBox “AutoCADが起動していません。AutoCADを起動してから実行してください。”, vbCritical, “エラー”
Exit Sub
End If
On Error GoTo 0

‘ 2. 対象の図面フォルダを指定する(※環境に合わせて書き換えてください)
targetDir = “C:\AutoCAD_Work\TargetDrawings\”
If Dir(targetDir, vbDirectory) = “” Then
MsgBox “指定されたフォルダが存在しません: ” & targetDir, vbCritical, “パスエラー”
Exit Sub
End If

‘ 3. フォルダ内のDWGファイルを総検索
fileName = Dir(targetDir & “.dwg”)

If fileName = “” Then
MsgBox “対象のDWGファイルが見つかりませんでした。”, vbExclamation, “通知”
Exit Sub
End If

‘ 画面描画をロックして処理速度を爆上げする(プロの技)
acadApp.Visible = True ‘ 必要に応じてFalseにすると完全バックグラウンド化も可能

Dim fileCount As Long
fileCount = 0

Do While fileName <> “”
‘ 4. 図面をサイレント(またはバックグラウンド)で開く
‘ Documents.Open は重い処理なので、エラーハンドリングを厳重に
On Error GoTo OpenError
Set targetDoc = acadApp.Documents.Open(targetDir & fileName)

‘ 5. SummaryInfo(プロパティ管理オブジェクト)を取得
Set sumInfo = targetDoc.SummaryInfo

‘ — A. 標準プロパティの書き換え —
sumInfo.Title = “自動化された極限の図面”
sumInfo.Author = “AutoCAD VBA Architect”
sumInfo.Subject = “フェーズ2 構造設計”

‘ — B. カスタムプロパティの書き換え(存在する場合は更新、なければ追加) —
‘ ※例として「設計ステータス」というカスタムプロパティを操作
Dim customKey As String
Dim customVal As String
customKey = “設計ステータス”
customVal = “承認済み(自動処理)”

Dim i As Long
Dim propFound As Boolean
propFound = False

‘ 既存のカスタムプロパティを走査
Dim numKeys As Integer
sumInfo.GetNumCustomKeys numKeys

Dim key As String
Dim val As String

For i = 0 To numKeys – 1
sumInfo.GetCustomByIndex i, key, val
If key = customKey Then
‘ 既存のキーが見つかった場合は値を更新
sumInfo.SetCustomByKey key, customVal
propFound = True
Exit For
End If
Next i

‘ 見つからなかった場合は新しく追加
If Not propFound Then
sumInfo.AddCustomKeyValue customKey, customVal
End If

‘ 6. 変更を保存して図面を閉じる(SaveChanges = True)
targetDoc.Close True
fileCount = fileCount + 1
fileName = Dir ‘ 次のファイルへ

GoTo NextFile

OpenError:
‘ 万が一、図面が破損していて開けない場合の暴走を防ぐ
MsgBox “ファイル名: ” & fileName & ” の処理中にエラーが発生しました。” & vbCrLf & Err.Description, vbExclamation
On Error GoTo 0

NextFile:
Loop

‘ 完了通知
MsgBox “処理が完了しました。” & vbCrLf & “処理ファイル数: ” & fileCount & ” 件”, vbInformation, “一括更新完了”
Exit Sub

End Sub

コードのここが重要!プロの解説

1. `GetObject(, “AutoCAD.Application”)` の魔法
新規にAutoCADのプロセスを立ち上げるのではなく、現在立ち上がっているAutoCADのインスタンスを「捕まえて」利用します。これにより、ライセンスの競合や無駄なメモリ消費を防げます。
2. `SummaryInfo` という専用の小部屋
図面のプロパティ(タイトルや作成者、カスタム項目)は、実は `AcadDocument` の直下にあるわけではなく、`SummaryInfo` という専用の管理オブジェクトの中に格納されています。ここを知っているかどうかが、初心者と中上級者の分水嶺です。
3. `targetDoc.Close True` によるスマートな保存
図面を閉じる際に `True` を渡すことで、「変更を保存して閉じる」という命令になります。これを忘れると、せっかく書き換えたプロパティが闇に消えるので注意してください。

3. 現場でありがちな「陥りやすいエラー」と回避策

AutoCAD VBAで複数図面をいじる際、必ずと言っていいほど以下の罠にハマります。事前に防衛策を張っておきましょう。

罠①:図面が「読み取り専用(Read-Only)」で開かれてしまう

  • 原因: ネットワークドライブ上の図面や、誰かがすでに開いている図面を `Documents.Open` しようとすると、読み取り専用で開かれ、保存時にエラーや保存漏れが発生します。
  • 解決策: 必要に応じてファイル属性をチェックするか、開いた後に `targetDoc.ReadOnly` プロパティを監視して、読み取り専用ならスキップするロジックを組み込みましょう。

罠②:開いた図面がアクティブ図面(`ThisDrawing`)と混同する

  • 原因: 複数図面をループ処理している最中に、コード内で `ThisDrawing` を使ってしまうと、「今どの図面を指しているのか」が分からなくなり、予期せぬ図面が書き換わります。
  • 解決策: ループ内では絶対に `ThisDrawing` を使わず、必ず `targetDoc`(変数で明示的に保持したオブジェクト)を主語にして操作してください。

4. さあ、あなたの業務を自動化のステージへ

今回紹介したコードは、単なるプロパティの書き換えだけに留まりません。
「フォルダ内の全図面をループし、開いて、何かを処理し、保存して閉じる」という、AutoCADバッチ処理の完全なテンプレートです。

ここをクリアしたあなたなら、レイアウトの一括削除、特定画層のパージ、文字の置換など、あらゆる一括処理へと応用できるはずです。

「手作業の地獄」から抜け出し、クリエイティブな設計業務に集中するための武器を手に入れましたね。
AutoCAD VBAをマスターして、周囲をあっと言わせる自動化エンジニアになりましょう!質問があればいつでもコメント欄でお待ちしています。

タイトルとURLをコピーしました