【テクニカル・上級編】【実務中級者向け】FSOを活用した「DXFからDWGへの一括変換」と完了後の元ファイル自動整理 – AutoCAD VBA解析バイブル

スポンサーリンク

DXFからDWGへの静かなる変革:FSOとオブジェクトライフサイクルが織りなす「AutoCAD一括変換」の真髄

AutoCADのAPIを叩く際、多くのエンジニアが陥る罠がある。「とりあえず動く」コードと、「堅牢に動く」コードの差だ。特にDXFからDWGへのバッチ処理のような、数千ファイルが絡む自動化において、メモリリークやCOMオブジェクトの解放漏れは、システムを確実に死に至らしめる癌となる。

今回は、FileSystemObject(以下FSO)を駆使し、単なる変換ツールを超えた「業務の棚卸し」まで完遂する、プロフェッショナルな一括変換アーキテクチャを提示する。

—

1. アーキテクチャの要諦:なぜ「直列処理」が安全なのか

AutoCADのCOMインターフェースは、驚くほど脆弱だ。特に`Application.Documents.Open`を高速に呼び出すと、プロセスがゾンビ化し、メモリを食いつぶす。

今回の設計指針は以下の3点だ。
1. FSOによる堅牢なIO制御: `Dir`関数は環境依存のバグを孕む。常に`Scripting.FileSystemObject`を使用し、フルパスを厳密に管理せよ。
2. 明示的なオブジェクト解放: `Set obj = Nothing`だけでは足りない。COMの参照カウントを意識し、ループ内で生成されるオブジェクトを確実に破棄する。
3. 安全な状態遷移: 「処理済み」フォルダへ移動させることで、二重処理の防止と、万が一のリカバリーパスを確保する。

—

2. 実装コード:堅牢性を担保するVBAエンジン

このコードは、エラーハンドリングとメモリ解放を極限まで突き詰めたものだ。

Option Explicit

‘ 参照設定: Microsoft Scripting Runtime を有効にすること
Public Sub BatchConvertDxfToDwg()
Dim fso As New FileSystemObject
Dim sourceFolder As Folder
Dim processedFolder As Folder
Dim file As File
Dim acadApp As AcadApplication
Dim doc As AcadDocument

‘ フォルダパス設定
Dim rootPath As String: rootPath = “C:\CAD_Data\Source\”
Dim donePath As String: donePath = rootPath & “Processed\”

‘ 処理済みフォルダの確保
If Not fso.FolderExists(donePath) Then fso.CreateFolder (donePath)
Set sourceFolder = fso.GetFolder(rootPath)

‘ AutoCADインスタンスの取得(起動していなければ作成)
On Error Resume Next
Set acadApp = GetObject(, “AutoCAD.Application”)
If acadApp Is Nothing Then Set acadApp = New AcadApplication
On Error GoTo 0
acadApp.Visible = True

For Each file In sourceFolder.Files
If LCase(fso.GetExtensionName(file.Path)) = “dxf” Then
‘ DXFを開く
Set doc = acadApp.Documents.Open(file.Path)

‘ DWGとして保存 (acNative: 現在のバージョン)
doc.SaveAs fso.BuildPath(donePath, fso.GetBaseName(file.Name) & “.dwg”), acNative

‘ ドキュメントを閉じる(メモリ解放の要)
doc.Close False
Set doc = Nothing

‘ 元ファイルを移動(処理の確定)
fso.MoveFile file.Path, fso.BuildPath(donePath, “Originals\”)
End If
Next

‘ 終了処理
Set sourceFolder = Nothing
Set fso = Nothing
End Sub

—

3. チーフアーキテクトからの深掘り:現場で勝つための技術的知見

オブジェクトライフサイクルの管理

`Set doc = Nothing`は、ただの儀式ではない。AutoCADのCOMサーバーは、VBA側が参照を保持している限り、バックグラウンドでその図面のメモリを保持し続ける。大規模図面を大量に変換する場合、この解放を行わないだけで、30ファイル目にはAutoCADが異常終了するだろう。

Windows APIとの連携による「フリーズ防止」

もし、極めて巨大なDXFファイルを扱う場合は、`DoEvents`だけでは不十分だ。Windows APIの`Sleep`関数を用いて、CPUに微小なインターバルを与えることを推奨する。

‘ API宣言
Private Declare PtrSafe Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As Long)

‘ ループ内に追加
Sleep 500 ‘ 0.5秒の休止を挟むことで、AutoCADのプロセス安定性を飛躍的に高める

レガシー環境におけるDXFバージョンの罠

DXFを開く際、`Open`メソッドの第2引数(パスワード等)や、CADのバージョンによる互換性問題に直面することがある。もし特定のバージョンに固執する必要があるなら、`SendKeys`でコマンドラインを叩くという「禁じ手」を検討する前に、`ObjectDBX`(AxDbDocument)の活用を検討せよ。画面描画を伴わずにDWG変換が可能であり、パフォーマンスは数倍〜数十倍になる。

—

結び:技術至上主義者への提言

自動化とは、単に人間を楽にするための作業ではない。「再現可能な品質を、システムに刻み込む行為」だ。

今回紹介した「FSOによる管理」と「明示的なメモリ解放」は、一見すると地味だが、長期間運用されるレガシーシステムにおいては、この細部こそが唯一の正義である。コードをただ動くものから、壊れないものへと昇華させること。それが、真の業務自動化エンジニアの歩む道だ。

現場で何か行き詰まったら、思い出してほしい。エラーが出ている場所ではなく、その一つ前のステップで何が「解放されずに残っているか」を。

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