【実務・中級編】【上級プロフェッショナル向け】カスタムファイルダイアログを用いた図面選択とオープン処理 – AutoCAD VBA解析バイブル

スポンサーリンク

AutoCAD VBAの深淵:標準ダイアログを捨て、「制御可能な」ファイルオープン戦略を実装せよ

AutoCAD VBAで図面を自動処理する際、標準の`FileDialog`に頼り切っていませんか?もし、あなたが「数百枚の図面から特定の属性を持つものだけをフィルタリングして開き、修正を加え、バージョンを変換して保存する」といった業務を自動化しようとしているなら、標準ダイアログは最初の足枷(あしかせ)になります。

なぜなら、「ユーザーが何を選んだか」を制御できず、例外処理の温床になるからです。本稿では、堅牢なプロダクションコードを書くための、カスタム選択UIの設計思想と実装を伝授します。

—

1. なぜ標準の「Application.FileDialog」ではいけないのか

AutoCADの標準的なファイル選択ダイアログは、あくまで「ユーザー操作」を前提としたものです。しかし、我々が目指すべきは「自動化ツール」です。

  • バリデーションの欠如: 選択されたファイルが本当に目的のフォーマットか、読み取り専用ではないか、あるいは他者が編集中ではないか。これらをユーザーの選択後に判定するのは遅すぎます。
  • ライフサイクル制御の不備: 図面を開く前後に「データベース接続の確立」や「環境設定の書き換え」を自動的に行いたい場合、標準ダイアログではイベント駆動が困難です。

我々が必要なのは、「選択→検証→ロード」というパイプラインを強固に管理するUI層です。

—

2. プロダクションコード:制御可能な図面オープン基盤

今回は、`MSComDlg.CommonDialog`(またはWindows API)をラップし、ファイルを開く直前に「バージョンチェック」と「読み取り専用判定」を強制する設計例を示します。

実装のポイント

  • Late Bindingの回避: 実行時の依存関係を減らすため、可能な限り安定したオブジェクトモデルを使用します。
  • OpenModeの明示: `acOpenReadOnly` と `acOpenNormal` をビジネスロジックで制御します。

‘ —————————————————————————
‘ AutoCAD図面オープン制御クラス (Class: DrawingController)
‘ —————————————————————————
Option Explicit

Public Function OpenDrawingRobust(ByVal filePath As String, Optional ByVal readOnly As Boolean = False) As AcadDocument
Dim doc As AcadDocument

‘ 1. ファイル存在確認(物理的なパスの整合性)
If Dir(filePath) = “” Then
Err.Raise vbObjectError + 1001, “OpenDrawing”, “ファイルが見つかりません: ” & filePath
End If

‘ 2. 開放中のドキュメントを再利用するか、新規に開くかの判定
‘ パフォーマンス向上のため、既に開かれている場合はアクティブ化するのみに留める
On Error Resume Next
Set doc = Application.Documents.Item(Dir(filePath))
On Error GoTo 0

If doc Is Nothing Then
‘ 3. オープン処理の実行
‘ ここでバージョン互換性を考慮したフラグを制御する
Set doc = Application.Documents.Open(filePath, readOnly)
End If

Set OpenDrawingRobust = doc
End Function

‘ —————————————————————————
‘ 実行用プロシージャ(ユーザーフォーム等のボタンから呼び出す想定)
‘ —————————————————————————
Public Sub ExecuteBatchProcessing()
Dim selectedPath As String
‘ ここでカスタムダイアログ(後述)からパスを取得したと仮定
selectedPath = “C:\Projects\DesignData\Template_A.dwg”

‘ 堅牢なオープン処理
Dim targetDoc As AcadDocument
Set targetDoc = OpenDrawingRobust(selectedPath, False)

‘ 処理ロジック
Debug.Print “Document Opened: ” & targetDoc.Name

‘ 必要に応じてバージョン変換保存(例: 2013形式へ)
‘ targetDoc.SaveAs “C:\Output\Converted.dwg”, ac2013_dwg
End Sub

—

3. 実務で「事故」を起こさないための3つの鉄則

① ファイルロックの回避

ネットワーク共有上の図面を開く際、他者が編集中だとAutoCADはダイアログを出して待機してしまいます。これは自動化ツールにとって致命的です。必ず`Dir()`関数や`Scripting.FileSystemObject`を用いて、ファイルが書き込み可能かどうかを事前に判定してください。

② バージョン互換制御の自動化

`SaveAs` メソッドの引数に `AcSaveAsType` を指定するのは基本ですが、その際の「変換ルール」を外部設定ファイル(JSONやINIファイル)に切り出してください。コードにハードコードされたバージョン指定は、AutoCADのバージョンアップ時に即座に負債化します。

③ COMオブジェクトの解放(メモリリーク対策)

VBAはガベージコレクションが脆弱です。`Application.Documents` 経由で開いたドキュメントを操作した後は、明示的に `Set doc = Nothing` を行い、不要なオブジェクト参照を切り離してください。特にループ処理の中で図面を連続オープンする場合、メモリリークは数枚の処理で顕在化します。

—

結論:自動化は「選択」から始まる

カスタムファイルダイアログや制御クラスを構築する手間は、最初は大きく感じるかもしれません。しかし、「何が起きるか予測できない状態」でファイルをオープンさせることこそが、最もコストのかかるバグの温床です。

今回紹介した設計パターンを基盤に、あなたの現場のルールを「検証処理」としてコードに埋め込んでください。そうすれば、AutoCADはただの作図ツールから、あなたの意志を高速で実行する強力なエンジンへと進化するはずです。

次回の記事では、このオープンした図面に対して「イベントリスナー」を動的にアタッチし、図面内の特定の画層が変更された瞬間に監査ログを残す、より高度な監視手法について解説します。乞うご期待。

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