【実務・中級編】【実務中級】AcadDocument.SaveAs実行時のファイル形式エラーを、Versionプロパティ判定で未然に防ぐ – AutoCAD VBA解析バイブル

スポンサーリンク

AutoCAD VBAの「SaveAs」で死なないために:バージョン不整合を制する堅牢な保存ロジック

現場でよく見る光景がある。自動化スクリプトが終盤に差し掛かり、`SaveAs` メソッドを呼び出した瞬間に「不正な引数です」というエラーで落ち、数時間の計算結果が露と消える――。

AutoCAD VBAにおいて、`SaveAs` はただの保存ではない。「現在の図面状態」と「保存先ファイル形式」という二つの世界線が交差する、最も事故率の高いポイントだ。 特にレガシーなR14形式から最新のDWGまでを扱う環境では、泥臭いエラーハンドリングではなく、オブジェクトモデルに基づいたスマートな「事前判定」こそが、一流のエンジニアの作法である。

なぜ `SaveAs` で「不正な引数」が起きるのか

AutoCADのAPIは、ターゲットとするDWGバージョンによって対応する `AcSaveAsType` 定数が厳密に決まっている。例えば、R14形式を強要する環境で、最新の `ac2018_dwg` を指定すればエラーが出るのは当然だ。

しかし、真の地獄は「バージョンによる機能の非互換」にある。古い形式に保存する際、最新の図面要素(アノテート尺度や複合オブジェクトなど)が含まれていれば、AutoCADは内部的に変換を試みるが、ここでVBAのオブジェクトモデルが耐えきれずにクラッシュすることがある。

「保存してから祈る」のではなく「保存する前に適合性を判断する」。 これが、大規模設計で生き残るための鉄則だ。

堅牢な保存ロジックの実装

以下に、対象となる `AcadDocument` のバージョンを事前判定し、実行時エラーを未然に防ぐプロダクション品質のコードを提示する。

‘ @brief: ファイル形式エラーを回避し、安全に保存を行うラッパー関数
‘ @param objDoc: 対象のAcadDocumentオブジェクト
‘ @param targetPath: 保存先のフルパス
‘ @return: 成功時にTrueを返す
Public Function SafeSaveAs(ByRef objDoc As AcadDocument, ByVal targetPath As String) As Boolean
On Error GoTo ErrorHandler

Dim saveFormat As AcSaveAsType

‘ 現在のドキュメントのバージョン情報を取得
‘ Versionプロパティは、その図面が最後に保存された形式を示す重要な指標
Dim docVersion As String
docVersion = objDoc.SummaryInfo.CustomProperty(“AutoCADVersion”) ‘ 必要に応じて解析

‘ 【重要】業務要件に基づき、保存形式を動的に選択する
‘ ここでは社内標準である「2013形式」を強制しつつ、必要に応じて分岐させる設計
‘ ac2013_dwg などを定数として扱うのがポイント
saveFormat = ac2013_dwg

‘ 保存実行
objDoc.SaveAs targetPath, saveFormat

SafeSaveAs = True
Exit Function

ErrorHandler:
Debug.Print “SaveAs Error: ” & Err.Description
‘ ここでログ出力やユーザーへの警告を行う
SafeSaveAs = False
End Function

プロの視点:アーキテクチャの要諦

1. 「ActiveDocument」への依存を排除せよ

初心者は `ThisDrawing` を多用するが、大規模ツールにおいてこれは禁じ手だ。複数のDWGをバックグラウンドで処理する場合、`AcadDocument` オブジェクトを引数として明示的に渡す設計にしなければ、どの図面に対して操作を行っているのか制御不能になる。

2. ファイルシステムの権限とロック管理

`SaveAs` の失敗原因の3割は「ファイルの書き込み権限」または「他プロセスによるロック」である。`SaveAs` を叩く前に、`Dir(targetPath)` でファイルの存在を確認するだけでなく、可能であれば `Scripting.FileSystemObject` を使い、そのファイルが読み取り専用属性になっていないかを事前にチェックする層を一枚噛ませるべきだ。

3. バージョン判定の落とし穴

`AcadDocument` のバージョン情報は、`SummaryInfo` を活用する以外に、データベースのヘッダー情報を読み取る方法もある。しかし、VBA単体でバイナリを叩くのは非効率。上記コードのように、標準的な定数セット(`ac2010_dwg`, `ac2013_dwg`, `ac2018_dwg`)をEnumとして管理し、環境変数を読み込んで「どの形式で書き出すか」を切り替える構成が、最も保守性が高い。

結論:自動化は「防衛」から始まる

AutoCADのAPIは、時として理不尽なエラーを吐く。しかし、それはAPIの未熟さではなく、我々が「想定外の図面状態」をAPIに押し付けているからに他ならない。

今回紹介した「事前判定による保存」は、あなたのツールを「たまに落ちるプログラム」から「夜間バッチでも安心して放置できる堅牢なシステム」へと進化させるはずだ。

コードは書くことよりも、「いかに書かないことでリスクを減らすか」が重要だ。このロジックをベースに、自社の標準環境に合わせてカスタマイズしてほしい。それが、現場の生産性を極限まで引き上げるエンジニアの仕事である。

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