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

スポンサーリンク

AutoCAD VBA極限攻略:DXF一括変換とファイル管理の自動化アーキテクチャ

AutoCADの自動化において、最も軽視されがちなのが「ファイルI/Oの堅牢性」と「オブジェクトの生存期間(ライフサイクル)」の管理だ。ネット上に溢れる「とりあえず動くコード」を量産して、半年後にメンテナンス不能な負債を抱えるのはもう終わりにしよう。

今回は、実務で頻発する「DXFをDWGへ一括変換し、元ファイルを安全に隔離する」というワークフローを題材に、プロダクションレベルのコード設計を伝授する。

—

1. なぜ「手抜き」が現場を殺すのか

多くの初心者は、`Dir`関数をループさせ、その中で`Open`メソッドを連打する。だが、これには決定的な欠陥がある。

  • エラーハンドリングの欠如: 1ファイルが読み込みエラーを起こしただけで、マクロ全体がクラッシュする。
  • ロックファイルの放置: ファイルアクセスが競合した際に、プロセスが宙に浮く。
  • パスの不完全性: OSのルートディレクトリやUNCパスの考慮不足。

我々が目指すべきは、「何が起きても破綻せず、実行結果が明確にログとして残る」堅牢な設計だ。

—

2. 堅牢な設計のための3つの鉄則

1. FileSystemObject (FSO) の活用: `Dir`よりも強力で、パス操作や属性取得が極めて安全。
2. 遅延バインディングの回避: 参照設定を適切に行い、コンパイル時チェックを最大限に活かす。
3. トランザクション管理: 「処理完了」のフラグが立つまでファイルを移動させない。

—

3. プロダクションコード:DXF一括変換ワークフロー

このコードは、指定フォルダ内のDXFを拾い上げ、DWG保存後に「Processed」フォルダへ移動させるものだ。

Option Explicit

‘ 必要な参照設定: Microsoft Scripting Runtime
Public Sub BatchConvertDxfToDwg()
Dim fso As New FileSystemObject
Dim sourceFolder As Folder
Dim targetFile As File
Dim dwgPath As String
Dim processedFolder As String

‘ フォルダパスの設定
Dim baseDir As String: baseDir = “C:\AutoCAD_Work\Input\”
processedFolder = baseDir & “Processed\”

‘ 処理済みフォルダの確保
If Not fso.FolderExists(processedFolder) Then fso.CreateFolder (processedFolder)

Set sourceFolder = fso.GetFolder(baseDir)

‘ メインループ
For Each targetFile In sourceFolder.Files
If LCase(fso.GetExtensionName(targetFile.Path)) = “dxf” Then
On Error Resume Next ‘ 個別ファイルの失敗が全体を止めないように

‘ 図面を開く
Dim doc As AcadDocument
Set doc = Documents.Open(targetFile.Path)

If Not doc Is Nothing Then
‘ DWGとして保存 (acNative: 現在のAutoCADバージョン)
dwgPath = fso.BuildPath(baseDir, fso.GetBaseName(targetFile.Path) & “.dwg”)
doc.SaveAs dwgPath, acNative
doc.Close False

‘ 成功時のみ移動
fso.MoveFile targetFile.Path, processedFolder
End If

On Error GoTo 0
End If
Next targetFile

MsgBox “全プロセスの完了を確認しました。”, vbInformation
End Sub

—

4. コードの深層解説:なぜこの書き方なのか

オブジェクトの生存期間管理

`Set doc = Documents.Open(…)` を行った後、必ず `doc.Close` を呼ぶ必要がある。これを忘れると、メモリ上にAutoCADのインスタンスがゾンビのように残り続け、次にファイルを開く際に「ファイルが既に使用されています」というエラーでシステムが停止する。`On Error Resume Next` と組み合わせることで、万が一のクラッシュ時にもループが止まらないようガードしている。

FSO (FileSystemObject) の優位性

`fso.BuildPath` を使用している点に注目してほしい。文字列結合 (`& “\” &`) でパスを作ると、OSのパス区切り文字の重複や欠落でバグるリスクがある。FSOはOSレベルでパスを解決するため、ネットワークドライブや特殊な環境でも安定して動作する。

拡張性の担保

もし今後、特定のバージョン(例:AutoCAD 2013形式)で保存する必要が出てきたら、`acNative` の部分を `ac2013_dwg` に変更するだけで対応可能だ。定数化しておくことで、将来のAutoCADアップデートにも即座に対応できる。

—

5. 次のステージへ:さらに効率化するために

このスクリプトはあくまで「基本」である。ここからさらに現場を自動化するのであれば、以下の要素を検討してほしい。

  • ログ出力: `fso.CreateTextFile` で処理ログを残すこと。誰がいつ変換したのか、エラーで弾かれたファイルは何なのかを可視化する。
  • プログレスバー: `UserForm` を活用し、進捗を表示する。数千枚の図面を扱う際、フリーズしたのか動いているのか分からない不安を排除する。
  • データベース連携: 変換した図面情報をAccessやExcelシートに記録し、図面管理台帳と自動同期させる。

最後に:
ツールとは、作って満足するものではない。「運用者がツールを意識せずに業務が終わっている状態」こそが、エンジニアが達成すべき最終ゴールだ。

このコードを叩き台に、君自身の環境に最適化された「武器」を作り上げてくれ。質問があれば、またいつでもどうぞ。

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