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

スポンサーリンク

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

開発現場のリーダーである私に、よくこんな相談が持ち込まれる。
「数百枚ある図面ファイルの『プロジェクト番号』や『作成者』が一斉に変更になった。手動で開いてプロパティを書き換えていたら今週が終わってしまう。VBAで一括処理できないか?」

答えは「YES」だ。しかし、ただ動くだけの安易なコードを書けば、メモリリーク、COM例外、あるいは「開いていないつもりの図面がバックグラウンドで残骸化する」という、CADエンジニアなら誰もが恐れる悪夢に見舞われる。

今回は、`AcadApplication`オブジェクトの真価を引き出し、複数図面の標準プロパティおよび「カスタムプロパティ」を、極限まで堅牢かつ高速に一括更新するプロダクションコードを伝授する。

1. なぜ「雑なループ処理」では実務で破綻するのか?

多くの初学者が陥る罠がこれだ。
「指定フォルダ内のファイル名をループさせ、次々と図面を開いて保存・閉じる」――一見、正しく見える。しかし、実務の現場では以下の問題が必ず牙をむく。

1. COMオブジェクトの解放漏れ(メモリリーク)
VBAからAutoCADを操作する場合、背後でCOM(Component Object Model)が稼働している。`Document`や`Database`を適切に解放しないと、見えないプロセスがタスクマネージャーに居座り続け、PCのメモリを食いつぶす。
2. エラーハンドリングの欠如
破損した図面や、パスワード保護された図面、誰かが編集中で「読み取り専用」になっているファイルに当たった瞬間、プログラムは容赦なくクラッシュする。
3. カスタムプロパティの複雑性
標準プロパティ(Title, Author等)と異なり、カスタムプロパティ(`SummaryInfo`オブジェクト経由)は、存在しないキーを指定した瞬間に実行時エラーを吐く。

これらを完全にコントロールし、「止まらない、汚さない、速い」コードを書くのがプロフェッショナルの仕事だ。

2. アーキテクチャ設計のポイント

今回のツールで担保すべき要件は以下の3点だ。

  • 非表示一括処理(Silent Batch Processing)

図面を画面上にいちいち描画(画面描画・ウィンドウ表示)させると、処理速度が何十倍も遅くなる。`Application.Documents.Open`を駆使し、バックグラウンドに近い状態で効率よく回す。

  • トランザクション的アプローチ

変更があった場合のみ `SaveAs` または `Save` を実行し、不要なI/O負荷を避ける。

  • 堅牢なエラーフック

1ファイルの不具合で全体のバッチ処理が中断しないよう、ファイル単位でエラーをトラップする。

3. 【プロダクションコード】複数図面プロパティ一括更新マクロ

以下のコードを、ExcelのVBAモジュール、またはAutoCADのVBA IDE(VBAMACRO)に実装してほしい。今回は、汎用性を考慮し「Excel側からAutoCADを操作してバッチ処理を行う」最も実務で需要の高い構成で記述する。

Option Explicit

‘ ==============================================================================
‘ 業務自動化プロフェッショナル向け:複数図面プロパティ一括更新モジュール
‘ 対象: AutoCAD 標準プロパティ & カスタムプロパティ
‘ ==============================================================================

Public Sub BatchUpdateDrawingProperties()
Dim acadApp As Object
Dim targetDir As String
Dim fileName As String
Dim fso As Object
Dim fileCount As Long
Dim successCount As Long

‘ — 1. 更新データの定義(現場の要件に合わせて書き換えてください) —
Const NEW_AUTHOR As String = “BIM/CAD Solution Dept.”
Const NEW_PROJECT As String = “PJ-202X-A01”
Const CUSTOM_PROP_NAME As String = “承認ステータス”
Const CUSTOM_PROP_VALUE As String = “承認済”

‘ — 2. フォルダの選択 —
targetDir = GetTargetDirectory()
If targetDir = “” Then
MsgBox “処理がキャンセルされました。”, vbExclamation, “中断”
Exit Sub
End If

‘ — 3. AutoCADアプリケーションの取得・起動 —
On Error Resume Next
Set acadApp = GetObject(, “AutoCAD.Application”)
If acadApp Is Nothing Then
Set acadApp = CreateObject(“AutoCAD.Application”)
End If
On Error GoTo 0

If acadApp Is Nothing Then
MsgBox “AutoCADの起動に失敗しました。”, vbCritical, “致命的エラー”
Exit Sub
End If

‘ 可視化するかどうか(完全バックグラウンドならFalseだが、安定性のためにTrue推奨)
acadApp.Visible = True

‘ — 4. ファイル走査と一括処理の実行 —
Set fso = CreateObject(“Scripting.FileSystemObject”)
If Not fso.FolderExists(targetDir) Then
MsgBox “指定されたフォルダが存在しません: ” & targetDir, vbCritical
Exit Sub
End If

fileCount = 0
successCount = 0

Dim targetFile As Object
Dim doc As Object
Dim summaryInfo As Object

‘ 処理開始のタイムスタンプ
Dim startTime As Double
startTime = Timer

Application.ScreenUpdating = False

For Each targetFile In fso.GetFolder(targetDir).Files
If LCase(fso.GetExtensionName(targetFile.Name)) = “dwg” Then
fileCount = fileCount + 1

On Error GoTo ErrorHandler
‘ 図面を開く(読み取り専用ではなく、書き込み用に開く)
Set doc = acadApp.Documents.Open(targetFile.Path, False)

‘ SummaryInfoオブジェクトの取得(標準・カスタムプロパティを内包)
Set summaryInfo = doc.SummaryInfo

‘ A. 標準プロパティの更新
summaryInfo.Author = NEW_AUTHOR
summaryInfo.Project = NEW_PROJECT

‘ B. カスタムプロパティの更新(存在確認・追加または上書き)
Call UpdateCustomProperty(summaryInfo, CUSTOM_PROP_NAME, CUSTOM_PROP_VALUE)

‘ 保存して閉는다
doc.Save
doc.Close False

successCount = successCount + 1
Debug.Print “成功: ” & targetFile.Name
GoTo NextFile

ErrorHandler:
‘ 1ファイルのエラーで全体を止めない
Debug.Print “エラー [” & targetFile.Name & “]: ” & Err.Description
If Not doc Is Nothing Then
On Error Resume Next
doc.Close False
On Error GoTo 0
End If

NextFile:
Set doc = Nothing
Set summaryInfo = Nothing
On Error GoTo 0
End If
Next targetFile

Application.ScreenUpdating = True

‘ — 5. 完了レポート —
MsgBox “図面プロパティの一括更新が完了しました。” & vbCrLf & _
“対象ファイル数: ” & fileCount & vbCrLf & _
“成功件数: ” & successCount & vbCrLf & _
“処理時間: ” & Format(Timer – startTime, “0.00”) & ” 秒”, _
vbInformation, “処理完了”

Set fso = Nothing
Set acadApp = Nothing
End Sub

‘ ==============================================================================
‘ サブプロシージャ: カスタムプロパティの安全な更新・追加ロジック
‘ ==============================================================================
Private Sub UpdateCustomProperty(ByRef summaryInfo As Object, ByVal propName As String, ByVal propVal As String)
Dim numProps As Integer
Dim i As Integer
Dim key As String
Dim val As String
Dim found As Boolean

found = False
numProps = summaryInfo.NumCustomProperties

‘ 既存のカスタムプロパティを走査し、一致すれば値を更新
For i = 0 To numProps – 1
summaryInfo.GetCustomByIndex i, key, val
If key = propName Then
summaryInfo.SetCustomByIndex i, key, propVal
found = True
Exit For
End If
Next i

‘ 存在しない場合は新規追加
If Not found Then
summaryInfo.AddCustomProperty propName, propVal
End If
End Sub

‘ ==============================================================================
‘ フォルダ選択ダイアログ関数
‘ ==============================================================================
Private Function GetTargetDirectory() As String
Dim fd As Object
Set fd = Application.FileDialog(3) ‘ msoFileDialogFolderPicker
With fd
.Title = “処理対象のDWGフォルダを選択してください”
.AllowMultiSelect = False
If .Show = -1 Then
GetTargetDirectory = .SelectedItems(1)
Else
GetTargetDirectory = “”
End If
End With
Set fd = Nothing
End Function

4. コードの深掘りとエンジニアリングの勘所

① `SummaryInfo` オブジェクトの活用

AutoCADの図面プロパティ(「図面のプロパティ」ダイアログの「概要」および「カスタム」タブ)を操作する場合、`AcadDocument.SummaryInfo` プロパティがすべての鍵を握る。
標準プロパティ(タイトル、主題、作成者、会社名など)はプロパティとして直叩きでき、カスタムプロパティはインデックスベース(`GetCustomByIndex` / `SetCustomByIndex` / `AddCustomProperty`)で安全に操作できる。この抽象化層を理解しているかどうかが、プロとアマの分かれ道だ。

② エラーハンドリングの境界線(Isolation)

バッチ処理において、「1つの不良品が全体のラインを止めること」は絶対に避けなければならない。
ループ内に `On Error GoTo ErrorHandler` を配置し、特定の図面が開けなかったり破損していたりしても、当該ファイルをスキップして次の図面へ処理を継続する設計(エラーの局所化)にしている。これにより、夜間に数千枚の図面を流しても朝には完璧に終わっている状態が担保される。

③ メモリの厳格な解放

ループの最後で `Set doc = Nothing` とし、COM参照の参照カウンタを確実にデクリメントしている。これを怠ると、大量の図面を開閉する過程でAutoCADがフリーズしたり、メモリ不足(Out of Memory)エラーを引き起こす。

5. まとめ:手作業の迷宮から脱却せよ

プロパティの書き換えという、創造性の欠片もない単調作業にエンジニアの貴重な時間を割かせるべきではない。
今回提供したアーキテクチャをベースに組まれたスクリプトは、あなたの部署の業務効率を劇的に改善するだけでなく、「ヒューマンエラーの完全排除」という強力な武器をもたらす。

現場のリーダーであるあなたなら、このコードを組織の資産として組み込み、真に価値のある設計・開発業務にリソースを集中させられるはずだ。今すぐ自社の環境に導入し、その圧倒的な処理速度と安定性を体感してほしい。

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