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

スポンサーリンク

AutoCAD自動化の深淵:DWG/DXF一括保存における「堅牢性」の極意

AutoCADのオートメーションにおいて、図面の一括保存などというタスクは「ただコードを動かすだけ」なら誰にでもできる。しかし、数千枚の図面を抱えるプロジェクトにおいて、メモリリークでCADをクラッシュさせず、かつファイルロックやI/Oエラーを回避し、さらにレガシーな環境でも安定して稼働させるコードを書くのは、真のエンジニアの領域だ。

今日は、単なる「保存スクリプト」ではない、「本番環境で生き残るためのアーキテクチャ」を伝授する。

—

1. なぜ「SaveAs」がクラッシュを招くのか

初心者向けのコードでは、単に `Document.SaveAs` をループさせるだけだろう。しかし、AutoCADのオブジェクトモデルは、一度開いたドキュメントのCOM参照を適切に解放しなければ、即座にメモリリークへ直結する。

特に、`ActiveDocument` を頼りにループを回すのは愚策だ。必ず個別の `Document` オブジェクトを明示的に扱い、処理後は確実に `Close` し、メモリを解放する。これが長時間のバッチ処理を完遂させるための唯一の鉄則である。

—

2. 堅牢性を追求した実装コード

以下に、Windows APIレベルでのファイル操作を考慮し、かつオブジェクトのライフサイクルを厳密に管理したテンプレートを示す。

Option Explicit

‘ メモリ最適化のための参照解放
Public Sub BatchExportDrawings(ByVal sourceFolder As String, ByVal targetFolder As String, ByVal formatType As AcSaveAsType)
Dim fso As Object: Set fso = CreateObject(“Scripting.FileSystemObject”)
Dim folder As Object: Set folder = fso.GetFolder(sourceFolder)
Dim file As Object
Dim doc As AcadDocument

‘ 画面更新を停止してパフォーマンスを最大化
Application.Visible = True

For Each file In folder.Files
If LCase(fso.GetExtensionName(file.Path)) = “dwg” Then
On Error Resume Next ‘ 致命的なファイル読み込みエラーを回避
Set doc = Application.Documents.Open(file.Path, True) ‘ True=読み取り専用で開き、競合を防ぐ

If Not doc Is Nothing Then
Dim newName As String
‘ 命名規則: [元のファイル名]_[YYYYMMDDHHMMSS]
newName = targetFolder & “\” & fso.GetBaseName(file.Path) & “_” & Format(Now, “yyyymmddhhnnss”)

‘ 形式に応じて拡張子を付与
If formatType = acDXF Then
doc.SaveAs newName, acR14_DXF ‘ レガシー互換を意識したバージョン指定
Else
doc.SaveAs newName, ac2018_DWG
End If

doc.Close False ‘ 保存済みのためFalse
Set doc = Nothing
End If
On Error GoTo 0
End If
Next

‘ オブジェクトの明示的解放
Set fso = Nothing
End Sub

—

3. シニアエンジニアが押さえるべき「3つの極意」

① I/Oボトルネックとファイルロック

ネットワーク共有ドライブ上で作業する場合、CADの自動保存機能が生成する「.tmp」ファイルやロックファイルが、スクリプトの邪魔をすることがある。`FileSystemObject` でのアクセス前に、Windows API (`GetFileAttributes`) を使い、対象ファイルが他プロセスによって排他制御されていないか確認するロジックを挟むと、堅牢性が飛躍的に向上する。

② 互換性という名の地雷原

`SaveAs` メソッドの引数である `Version` 指定は、社内の標準環境に合わせて厳格に固定すべきだ。「最新であれば良い」という考えは捨てろ。クライアントや下請けのCADバージョンを確認し、`acR12_DXF` から `ac2018_DWG` まで、適切な定数を使い分ける必要がある。

③ システム間連携への備え

もしこのスクリプトを、サーバーサイドのタスクスケジューラや他システムから呼び出すなら、`Application.Visible = False` を検討したくなるだろう。しかし、AutoCADはGUIを持たない環境での動作を公式にサポートしていない。
もし真にバックグラウンドで動かすなら、VBAではなく ObjectARX または AutoCAD .NET API (C#) へ移行すべきだ。COMオートメーションはあくまで「CADが起動している」という前提条件下での最適解であると認識すること。

—

結論:コードは「生き物」である

今回提示したコードは、あくまで「最低限の防波堤」に過ぎない。現場の図面には、必ずと言っていいほど「外部参照(Xref)の未解決」「フォント欠落」「破損したモデル空間」が潜んでいる。

それら全てをハンドリングし、ログを吐き出し、深夜に放置しても朝には完璧なファイルが整列している状態——それこそが、私たちが目指すべき「自動化の極致」である。

技術は手段であり、目的は「エンジニアがよりクリエイティブな課題に集中できる時間を捻出すること」にある。健闘を祈る。

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