【実務・中級編】【初心者向け】図面を自動保存!AutoCAD VBAで指定フォルダへのDWG/DXF一括保存 – AutoCAD VBA解析バイブル

スポンサーリンク

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」で、日々の単純作業を完全に制圧することだ。自動化の目的は「楽をすること」ではない。「人間が本来やるべきクリエイティブな設計業務に時間を割くこと」にある。

コードのコピペで終わらせず、自分の手でロジックを読み解き、現場の課題に合わせてカスタマイズしてほしい。それが君を真の自動化エンジニアへと引き上げるはずだ。

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