AutoCAD自動化の真髄:一括保存処理を「事故ゼロ」で実装する極限の設計術
AutoCADのルーチンワークで最も無駄な時間、それは「図面を一つずつ開いて、名前をつけて保存する」という単純作業だ。これをVBAで自動化するのは初歩の入り口だが、「適当に書いたコード」は必ず本番環境で爆発する。
ファイルロック、メモリリーク、そして古いDWGバージョンの互換性問題。これらを考慮せずに書かれたコードは、業務効率化どころか、貴重な図面データの破損という最悪の結末を招く。
今日は、プロの現場で通用する「堅牢で、かつ保守性の高い」図面一括保存エンジンの設計思想と実装コードを伝授する。
—
1. なぜ「手抜きコード」は現場で死ぬのか?
初心者がやりがちなのは、`ThisDrawing.SaveAs` をループさせるだけのコードだ。これには以下の3つの「死因」が潜んでいる。
1. エラーハンドリングの欠如: 保存先に同名ファイルがある、あるいはフォルダの書き込み権限がない場合、コードは即座に停止し、AutoCADが「ゾンビプロセス」として残る。
2. バージョン制御の無視: 取引先や社内規定でDWGのバージョン(例:2010形式など)が指定されている場合、デフォルト保存では後工程で必ず不整合が起きる。
3. オブジェクトの解放漏れ: 大量ファイルを扱う際、Documentオブジェクトを適切に解放しないと、AutoCADのメモリ消費量が肥大化し、途中でクラッシュする。
これらを排除した「プロダクションレベル」のコードを見ていこう。
—
2. 実装:堅牢な一括保存エンジン
以下のコードは、指定フォルダ内の全DWGを読み込み、指定した出力先に名前を変換して保存するテンプレートだ。
Option Explicit
‘ ———————————————————
‘ 図面一括保存エンジン
‘ ———————————————————
Public Sub BatchSaveDrawings()
Dim sourceFolder As String: sourceFolder = “C:\SourceDWG\”
Dim targetFolder As String: targetFolder = “C:\OutputDWG\”
Dim fileName As String
Dim doc As AcadDocument
‘ ファイルシステムのチェック
If Dir(targetFolder, vbDirectory) = “” Then MkDir targetFolder
fileName = Dir(sourceFolder & “.dwg”)
‘ エラーハンドラを仕込み、処理中断時のリスクを最小化
On Error GoTo ErrHandler
Do While fileName <> “”
‘ Documentを開く(バックグラウンド処理を意識)
Set doc = Application.Documents.Open(sourceFolder & fileName)
‘ 命名規則の適用(例:元ファイル名_20231027.dwg)
Dim newName As String
newName = targetFolder & Left(fileName, InStrRev(fileName, “.”) – 1) & “_Processed.dwg”
‘ バージョン指定して保存(ac2013_DWG など、業務要件に合わせて変更)
doc.SaveAs newName, ac2013_DWG
‘ 閉じる前にメモリを解放
doc.Close False
Set doc = Nothing
fileName = Dir()
Loop
MsgBox “全ファイルの処理が完了しました。”, vbInformation
Exit Sub
ErrHandler:
MsgBox “エラー発生: ” & Err.Description, vbCritical
If Not doc Is Nothing Then doc.Close False
End Sub
—
3. この設計における「プロの着眼点」
1. `On Error GoTo` による安全装置
ループ内で予期せぬエラー(ファイル破損など)が発生しても、`ErrHandler`が図面を閉じてメモリをクリーンアップする設計にしている。これにより、1枚の不良ファイルが全処理を止める事態を防ぐ。
2. 保存バージョンの明示
`doc.SaveAs` の第二引数に `ac2013_DWG` を指定している。これを省略するとAutoCADのデフォルト設定に依存してしまい、特定の相手先で開けないという「地雷」を踏むことになる。必ず要件に応じた定数(`acR12_DXF` 等)を指定すること。
3. ファイル命名規則の抽象化
コード内の `newName` 作成ロジックは、必要に応じて関数化すべきだ。`Format(Now, “yyyymmdd”)` を付与するのか、あるいは図面内の「属性ブロック」から情報を抜き取って命名するのか。拡張性を考え、命名ロジックを独立した関数に切り出せる構造にしておくのが、優れたアーキテクチャというものだ。
—
4. 最後に:エンジニアとしての心構え
VBAは強力だが、OSやAutoCADのバージョンアップに弱い側面がある。もし、より大規模な図面管理やDB連携が必要になったなら、VBAの次は .NET API (C#) へ移行する準備をしておけ。
しかし、まずはこの「堅牢なVBA」で、日々の単純作業を完全に制圧することだ。自動化の目的は「楽をすること」ではない。「人間が本来やるべきクリエイティブな設計業務に時間を割くこと」にある。
コードのコピペで終わらせず、自分の手でロジックを読み解き、現場の課題に合わせてカスタマイズしてほしい。それが君を真の自動化エンジニアへと引き上げるはずだ。
