こんにちは!AutoCADの自動化の世界へようこそ。
「マクロの記録」ボタンを押して図形を描くだけの操作から一歩踏み出し、VBA(Visual Basic for Applications)のコードを自分で書けるようになると、あなたの設計業務のスピードは劇的に変わります。
今回は、実務で本当によくある悩み「大量にある古い図面(DWG)のファイルサイズが肥大化しているので、一括で綺麗に整理・軽量化したい!」という課題を、AutoCAD VBAとFSO(FileSystemObject)の連携でスマートに解決する手法を解説します。
ここをクリアすれば、AutoCAD VBAの基本オブジェクトモデルとファイル操作の組み合わせはバッチリです。一緒に一級の自動化エンジニアへの階段を上っていきましょう!
—
なぜ「FSO × AcadApplication」なのか?
実務で何百枚もの図面を処理するとき、手作業で1枚ずつ開き、コマンドを打ち込んで保存し直す……なんて、気が遠くなりますよね。
ここで登場するのが、以下の2つの強力なパートナーです。
1. FileSystemObject (FSO): Windowsのファイルやフォルダを自在に操るための名優。特定のフォルダの中にある `.dwg` ファイルのリストを、プログラムの力で一網打尽に集めてきます。
2. AcadApplication (および AcadDocument): AutoCADそのものを表す最上位オブジェクトと、個々の図面を表すオブジェクト。これを使って、図面を裏側(あるいは表側)で次々と開き、大掃除を実行させます。
この2つを組み合わせることで、「指定フォルダ内の全DWGファイルを自動巡回し、ゴミ掃除(パージ)と健康診断(監査)を自動実行して上書き保存するバッチ処理ツール」が完成します。
—
現場でそのまま使える!一括クリーンアップ・コード
まずは、開発環境(VBAエディタ:`Alt + F11`)の「参照設定」で “Microsoft Scripting Runtime” にチェックを入れてから、以下のコードを標準モジュールに貼り付けてください。(※実行前に、必ずテスト用図面フォルダのパスをご自身の環境に合わせて書き換えてくださいね)
Option Explicit
‘ ==============================================================================
‘ 処理名: 指定フォルダ内全DWGファイル一括パージ&監査バッチ
‘ 概要 : FSOでファイルを集め、AcadDocumentを操作して図面を軽量化・修復する
‘ ==============================================================================
Sub BatchPurgeAndAudit()
‘ 1. 変数の宣言 (型を明示するのがプロの第一歩です)
Dim fso As Object ‘ FileSystemObject
Dim targetFolder As Object ‘ 対象フォルダ
Dim fileItem As Object ‘ 個々のファイル
Dim targetPath As String ‘ 処理対象のフォルダパス
Dim acadDoc As AcadDocument ‘ 開いた図面データ
Dim fileCount As Long ‘ 処理したファイル数のカウント
‘ — 【重要】処理対象のフォルダパスをここに記述してください —
targetPath = “C:\AutoCAD_Work\TargetDrawers\”
‘ 2. FSOのインスタンス生成
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ フォルダの存在確認
If Not fso.FolderExists(targetPath) Then
MsgBox “指定されたフォルダが存在しません:” & vbCrLf & targetPath, vbCritical, “パスエラー”
Exit Sub
End If
Set targetFolder = fso.GetFolder(targetPath)
‘ 3. 処理開始前の確認
If MsgBox(“以下のフォルダ内の全DWGファイルに対して、Purge(名前削除)と Audit(監査)を実行します。” & vbCrLf & _
targetPath & vbCrLf & vbCrLf & “実行してもよろしいですか?”, _
vbYesNo + vbQuestion, “一括処理の確認”) = vbNo Then
Exit Sub
End If
‘ 画面描画をフリーズさせて処理速度を爆発的に上げる(お作法です)
ThisDrawing.Application.ScreenUpdating = False
fileCount = 0
‘ 4. フォルダ内の全ファイルをループ処理
For Each fileItem In targetFolder.Files
‘ 拡張子が「.dwg」(大文字小文字を問わず)のファイルか判定
If LCase(fso.GetExtensionName(fileItem.Name)) = “dwg” Then
On Error GoTo ErrorHandler ‘ 万が一のファイル破損でマクロが止まらないための防壁
‘ 図面をバックグラウンド(目に見える形)で開く
‘ ※完全非表示はリスクがあるため、Documents.Openを使用します
Set acadDoc = ThisDrawing.Application.Documents.Open(fileItem.Path)
‘ — A:監査 (Audit) の実行 —
‘ 引数 “Y” は「検出されたエラーを自動修復する」という意味です
acadDoc.AuditInfo True
‘ — B:名前削除 (Purge) のループ実行 —
‘ 未使用のブロックや画層などは、一度のパージでは消しきれないことがあるため3回回します
Dim i As Long
For i = 1 To 3
acadDoc.PurgeAll
Next i
‘ 変更を保存して閉じる
acadDoc.Save
acadDoc.Close
fileCount = fileCount + 1
On Error GoTo 0 ‘ エラー監視をリセット
End If
Next fileItem
‘ 5. 後処理と完了報告
ThisDrawing.Application.ScreenUpdating = True
MsgBox “処理が完了しました!” & vbCrLf & _
“処理ファイル数: ” & fileCount & ” 件”, vbInformation, “一括処理終了”
Exit Sub
ErrorHandler:
‘ エラーが発生した場合は、そのファイルスキップして次に進む知恵
MsgBox “ファイル ‘” & fileItem.Name & “‘ の処理中にエラーが発生しました。” & vbCrLf & _
“エラー内容: ” & Err.Description, vbExclamation, “スキップ通知”
If Not acadDoc Is Nothing Then
On Error Resume Next
acadDoc.Close False ‘ 保存せずに閉じる
On Error GoTo 0
End If
Resume Next ‘ 次のファイルのループへ強制復帰
End Sub
—
コードの核心:ここが分かれば怖くない!
初心者の方が「おっ」と躓きやすいポイントや、実務で絶対に入れておかなべき重要テクニックを解説します。
① `ThisDrawing.Application.ScreenUpdating = False` の魔力
大量の図面を次々に `Open` して `Close` しているとき、画面がパチパチ切り替わるとそれだけでPCの描画処理にリソースが奪われ、処理速度が何倍も遅くなります。
処理の最初に画面更新を止め、最後に `True` に戻す。これだけでバッチ処理の実行速度が劇的に向上します。プログラミングのちょっとした気遣いが、大きな時短を生む典型例です。
② なぜ Purge(名前削除)を3回ループさせるのか?
AutoCADの `PurgeAll` メソッドは非常に優秀ですが、構造上の理由から、1回実行しただけでは「別の要素にネスト(入れ子)されていた未使用ブロック」などが消し切れないことがあります。
実務の現場では、「念のため3回ループさせる」のが、完全な軽量化を担保するシニアエンジニアの暗黙の了解(ベストプラクティス)です。
③ `On Error GoTo ErrorHandler`(防壁の構築)
何百枚もの図面を一括処理する際、中には「ファイルが破損している図面」や「パスワードがかかっている図面」が混ざっていることがあります。
ここでエラー対策(例外処理)を入れていないと、1枚壊れたファイルに出会った瞬間にマクロが強制終了し、夜間に走らせたバッチが途中で止まってしまいます。
エラーが起きたら「そのファイルをそっと閉じて、次のファイルへ進む(`Resume Next`)」というレジリエンス(回復力)を持たせるのが、実務システムの鉄則です。
—
さらに高みを目指すあなたへ:チーフアーキテクトからのアドバイス
今回紹介したコードは、画面上で図面を開きながら処理を行う「実務中級レベル」の堅実な実装です。
もし今後、さらに図面枚数が数千枚単位になり、「画面すら表示させずに、完全にバックグラウンド(メモリ上だけ)で超高速に処理したい!」というフェーズに到達した場合は、AutoCADのCOMコンポーネントを外側から操作する VBScript や C# (.NET API) による完全なヘッドレス実行へとステップアップしていくことになります。
ですが、まずは今回学んだ FSOによるファイル列挙 と AcadDocumentオブジェクトの操作・エラーハンドリング。この3つが血肉となっていれば、どんなAutoCADの自動化案件が来ても怖くありません。
ご自身の設計環境に合わせてパスを調整し、まずは安全なテストフォルダで試してみてくださいね。あなたの業務が、退屈な単純作業から解放され、より創造的なデザインワークにシフトすることを心から応援しています!
