AutoCAD VBAの深淵へ:ObjectDBXで「図面を開かずに」高速かつ安全に処理する方法
こんにちは。AutoCADの自動化を極めんとする皆さん、今日は少しハードな、しかし現場で喉から手が出るほど求められる「聖杯」のようなテクニックを授けましょう。
皆さんは「数百枚の図面を一つずつ開いて編集し、閉じる」という作業をしていませんか? それはCPUとメモリを無駄に食う、エンジニアとしては避けたい低効率なルーチンです。
今回は、「ObjectDBX」という魔法の技術を使って、図面を画面に表示せず(バックグラウンドで)処理し、万が一の図面破損時にも慌てないための「自動エラーログ生成システム」を構築します。
—
1. なぜObjectDBXなのか?(ライフサイクルの理解)
通常、AutoCADで `Documents.Open` を行うと、その図面がエディタ上に読み込まれ、グラフィックの再描画が発生します。これは非常に重い。
一方、ObjectDBX (AxDbDocument) は、図面ファイルをメモリ上に「データ構造」としてだけ読み込みます。画面表示を伴わないため、処理速度は劇的に向上します。しかし、この「画面がない」という特性が、エラーハンドリングを難しくさせます。図面が破損しているとき、ダイアログも出せずにVBAが沈黙して強制終了…なんて事態は避けなければなりません。
—
2. 実践:エラーログ自動生成エンジンの構築
以下のコードは、指定したフォルダ内のDWGを順次読み込み、処理成功・失敗をCSVに書き出すプロフェッショナルな設計です。
‘ 必要な参照設定: AutoCAD ObjectDBX Common Type Library
Public Sub BatchProcessWithLogging()
Dim fso As Object: Set fso = CreateObject(“Scripting.FileSystemObject”)
Dim dbx As AxDbDocument
Dim logPath As String: logPath = “C:\Temp\ProcessLog.csv”
Dim logFile As Object
Set logFile = fso.CreateTextFile(logPath, True)
logFile.WriteLine “FileName,Status,ErrorMessage”
Dim folderPath As String: folderPath = “C:\TargetDrawings\”
Dim file As Object
‘ フォルダ内の全DWGをスキャン
For Each file In fso.GetFolder(folderPath).Files
If LCase(fso.GetExtensionName(file.Path)) = “dwg” Then
Set dbx = New AxDbDocument
‘ 【重要】エラーハンドリングの境界をここに設定
On Error Resume Next
dbx.Open file.Path
If Err.Number <> 0 Then
‘ エラー発生!詳細を記録して次へスキップ
logFile.WriteLine file.Name & “,FAILED,” & Err.Description
Err.Clear
Else
‘ ここに実際の処理(例:レイヤー削除やブロック置換)を記述
Call ProcessDrawing(dbx)
‘ 保存処理
dbx.SaveAs file.Path
logFile.WriteLine file.Name & “,SUCCESS,”
End If
On Error GoTo 0
Set dbx = Nothing ‘ メモリを確実に解放する
End If
Next
logFile.Close
MsgBox “全処理完了。ログを確認してください。”
End Sub
‘ 個別の編集ロジックを分離させるのが保守の鉄則です
Private Sub ProcessDrawing(dbx As AxDbDocument)
‘ 例:モデル空間の全エンティティをループ処理するロジックなど
End Sub
—
3. コードの解説と「陥りやすい罠」
① `On Error Resume Next` の正しい使い方
「エラーを無視する」ために使うのではありません。「エラーが起きたことを検知するために、プログラムを止めない」ために使います。`Err.Number <> 0` を判定することで、どのファイルが「開けないほど壊れているか」を正確に特定できます。
② `Set dbx = Nothing` の重要性
`AxDbDocument` は非常に強力ですが、巨大な図面を扱うとメモリ消費が激しいです。ループ内で明示的に `Nothing` を代入してメモリを解放しないと、数百枚の処理の途中でメモリ不足(メモリリーク)が発生します。これはプロとしての「作法」です。
③ 互換性の罠
ObjectDBXは、実行しているAutoCADのバージョンよりも「新しい形式」のDWGは開けません。もし2024版の図面を2020版で開こうとすると、このコードはエラーを吐きます。現場の環境に合わせて、DWG変換ツールを併用するか、例外処理に「バージョン不一致」の判定を組み込むのが賢いアーキテクトの道です。
—
4. 最後に:現場で生き残るために
このコードをベースにすれば、あなたのPCは数千枚の図面処理を裏側で黙々とこなす「最強の作業員」になります。
「プログラムが止まらないこと」こそ、自動化における最大の価値です。ログファイルさえあれば、翌朝出社したときに「どの図面が壊れていたか」を一目で把握できる。この安心感こそが、手作業から脱却したエンジニアの武器なのです。
さて、次は「レイアウトごとのPDF出力自動化」に挑戦してみますか? それとも「ブロック属性の抽出」について深掘りしましょうか。あなたの技術が、現場の未来をより良く変えていくことを期待しています。
何か不明点があれば、いつでも聞いてください。ここをクリアすれば、あなたはもう立派なAutoCAD自動化の専門家です。
