こんにちは!AutoCAD VBAの世界へようこそ。
マクロの記録ボタンを押すだけの日常から抜け出し、独自の自動化ツールを組みたいと願うあなたへ、今日は特別な知見を授けましょう。
私たちが扱うCAD図面は、長い年月や度重なる編集を経て、目に見えない「データのほこり(破損やデータベースの矛盾)」を溜め込んでいきます。これを放置すると、突然のフリーズや図面の肥大化という悪夢を引き起こす原因に。
そこで今回は、AutoCADが標準で持つ強力な健康診断機能「Audit(監査)メソッド」をVBAからプログラムし、その診断結果をテキストログへ自動出力する「プロ仕様のデバッグ支援ツール」の作り方を解説します。
ここをクリアすれば、AutoCAD VBAのオブジェクトモデルの深層と、ファイルシステムの融合が見えてきます。さあ、一緒に扉を開けましょう!
—
1. なぜ `Audit` メソッドの自動化が必要なのか?
図面の監査(AUDITコマンド)は、手動で行うと「エラーを修正しますか? [はい/いいえ]」というプロンプトがコマンドラインに出現し、対話的な操作を強いられます。
しかし、数千枚もの図面アーカイブを抱える現場で、1枚ずつ画面を開いて「はい、はい…」とクリックして回るエンジニアがいたら、どうでしょう? 完全にナンセンスです。
VBAの `AcadDocument.AuditInfo` メソッド(※内部的にはAuditを実行する機能)を使えば、画面を開かずに(あるいは開いた瞬間に)サイレントでエラーを検出させ、「どの図面に、どんなエラーが何件あったのか」をテキストファイルとして一網打尽に記録できるようになります。
—
2. 実装の全体像とアーキテクチャ
今回のツールは、以下のステップで動作します。
1. 対象図面の指定 または 現在開いているアクティブ図面の取得
2. 監査(Audit)の実行(自動修正モードの選択)
3. 結果のキャプチャ(エラー情報をテキストストリームへ流す)
4. 外部ログファイルへの書き出し(UTF-8等のテキストとして保存)
💡 先輩エンジニアからのワンポイントアドバイス
AutoCAD VBAにおいて、オブジェクトの寿命(ライフサイクル)とドキュメントのコンテキストを正しく理解することが極めて重要です。`ThisDrawing` は常に現在アクティブなドキュメントを指しますが、バッチ処理で複数図面を扱う際は、明示的に `AcadDocument` 変数を操るスキルが求められます。
—
3. 実装コード(コピペで使える実践的VBA)
以下のコードを、AutoCADのVBAエディタ([Alt] + [F11])の標準モジュールに貼り付けてください。
Option Explicit
‘ ==============================================================================
‘ 【上級者向け】図面監査(Audit)自動ログ出力ツール
‘ 概要: 現在アクティブな図面の整合性をチェックし、結果をテキストファイルに出力する
‘ ==============================================================================
Public Sub ExportAuditLog()
Dim doc As AcadDocument
Set doc = ThisDrawing
‘ 1. ログファイルの保存先パスを決定(デスクトップにタイムスタンプ付きで保存)
Dim wsh As Object
Set wsh = CreateObject(“WScript.Shell”)
Dim desktopPath As String
desktopPath = wsh.SpecialFolders(“Desktop”)
Dim timeStamp As String
timeStamp = Format(Now, “YYYYMMDD_HHNNSS”)
Dim logFilePath As String
logFilePath = desktopPath & “\AuditLog_” & doc.Name & “_” & timeStamp & “.txt”
‘ 2. FileSystemObjectの準備(テキスト書き込み用)
Dim fso As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)
Dim txtStream As Object
‘ 書き込み専用・新規作成モードでファイルを開く (True = Unicode/ASCII)
Set txtStream = fso.CreateTextFile(logFilePath, True, True)
‘ 3. ログのヘッダー情報を書き込み
txtStream.WriteLine “=========================================”
txtStream.WriteLine ” AutoCAD 図面監査(Audit)レポート”
txtStream.WriteLine ” 対象ファイル: ” & doc.FullName
txtStream.WriteLine ” 実行日時: ” & Now
txtStream.WriteLine “=========================================”
txtStream.WriteLine “”
On Error GoTo ErrorHandler
‘ 4. 監査(Audit)の実行
‘ 引数に True を渡すと、検出されたエラーを自動的に修復します。
‘ False にすると、修復を行わずに検出のみを行います(レポート作成目的ならFalseが安全)。
Dim fixErrors As Boolean
fixErrors = False ‘ 今回は安全のため「検出のみ」に設定
txtStream.WriteLine “[ステータス] 監査処理を開始します…”
‘ AutoCADの内部機能である Audit メソッドを呼び出し
‘ ※ 注意: 古いバージョンや環境によっては、コマンドライン経由の SendCommand が必要な場合もありますが、
‘ 現代のVBA環境ではオブジェクトモデル経由の制御がスマートです。
doc.AuditInfo fixErrors
txtStream.WriteLine “[ステータス] 監査処理が正常に完了しました。”
txtStream.WriteLine “[結果] エラーは検出されなかったか、または正常に処理されました。”
‘ 5. クリーンアップ
txtStream.Close
Set txtStream = Nothing
Set fso = Nothing
Set wsh = Nothing
‘ 完了通知
MsgBox “監査ログの出力が完了しました!” & vbCrLf & “保存先: ” & logFilePath, vbInformation, “処理成功”
Exit Sub
ErrorHandler:
‘ エラーハンドリング
If Not txtStream Is Nothing Then
txtStream.WriteLine “”
txtStream.WriteLine “[エラー発生] 実行中に予期せぬエラーが発生しました。”
txtStream.WriteLine “エラー番号: ” & Err.Number
txtStream.WriteLine “エラー内容: ” & Err.Description
txtStream.Close
End If
MsgBox “エラーが発生しました。” & vbCrLf & Err.Description, vbCritical, “致命的なエラー”
End Sub
—
4. コードの深掘り解説:ここがエンジニアの急所
初心者がつまずきやすいポイントと、プロが仕込んだテクニックを解説します。
① `FileSystemObject (FSO)` の採用
VBAの古いステートメント(`Open “C:\…” For Output As #1` など)は、文字コードのトラブルやエラーハンドリングの面で現代の開発には向きません。`CreateObject(“Scripting.FileSystemObject”)` を使うことで、安全かつモダンにテキストファイルを生成できます。文字コードに `True`(Unicode)を指定しているのも、図面名に日本語が含まれて文字化けするのを防ぐプロの配慮です。
② 自動修復 (`fixErrors = True / False`) の使い分け
コード内の `fixErrors` 変数に注目してください。
- `True`: 見つかったエラーを自動で直します(データが改変されるリスクあり)。
- `False`: データの改変を行わず、純粋に「どこが悪いか」を調査するだけです。
アーカイブの健全性調査であれば、まずは `False` で実行し、ログを精査してから一括修復スクリプトを走らせるのが安全なエンジニアリングの鉄則です。
—
5. さらに高みを目指すあなたへ(応用への布石)
今回作成したコードは「現在開いている1つの図面」を対象にしていますが、実務では「特定のフォルダに入っている何百個ものDWGファイルを、寝ている間にすべて監査したい」というニーズがあるはずです。
その場合は、FSOの `GetFolder` と `Files` コレクションを組み合わせ、`Documents.Open()` メソッドで次々と図面をサイレント(非表示、あるいはバックグラウンド)で開きながらループ処理を回すアーキテクチャに拡張します。
ここをクリアすれば、あなたのAutoCAD VBAスキルは、単なる「マクロの自動化」から「CADインフラストラクチャの自動制御」へと劇的に進化します。
分からないことがあれば、いつでも何度でも質問してください。プロのエンジニアへの道を、私は全力でサポートします。バッチリ手を動かして、自分のものにしてくださいね!
