【実務・中級編】【実務中級者向け】保存時の「ファイル名禁止文字」を自動置換:OS互換性を考慮したセーフ・セーブ機能 – AutoCAD VBA解析バイブル

スポンサーリンク

【AutoCAD VBA】ファイル保存の「落とし穴」を塞ぐ:堅牢なセーフ・セーブ・ロジックの極意

AutoCADの自動化ツールを開発していて、図面タイトルからファイル名を自動生成する機能を実装したことはあるだろうか?
「図面内の属性情報を取得して、そのまま `SaveAs` メソッドに渡す」——初心者がやりがちなこの設計は、実務において最も手痛いバグの温床だ。

Windowsのファイルシステムにおいて、`/ : ? ” < > |` は使用禁止文字である。これらが図面内の文字列(図面タイトルやプロジェクトコードなど)に含まれていた場合、プログラムは例外を吐いてクラッシュする。

本稿では、単なるコード提供に留まらず、プロフェッショナルな現場で求められる「堅牢なファイル保存ロジック」の設計思想を伝授する。

—

なぜ「そのまま」保存してはいけないのか

AutoCADのVBAから `ThisDrawing.SaveAs` を呼び出す際、渡されたパスに不正文字が含まれていれば、当然ながら実行時エラーが発生する。
現場でよくある「エラーハンドリング不足によるツール停止」は、開発者としての信頼を損なうだけでなく、業務フローを分断させる。

我々が実装すべきは、「不完全な入力データを、システムが許容できる形へと強制的に最適化(サニタイズ)する」レイヤーだ。

—

実装コード:堅牢性を担保する SafeSave 関数

以下のロジックは、ファイル名の禁止文字をアンダースコア `_` に置換し、さらにファイル名の長さ制限(255文字)や余分なスペースのトリミングまで考慮したプロダクション品質のコードである。

Option Explicit

‘ ———————————————————
‘ @brief ファイル名として安全な文字列に変換する
‘ @param inputName 元となるファイル名の候補
‘ @return 安全に処理されたファイル名
‘ ———————————————————
Public Function GetSafeFileName(ByVal inputName As String) As String
Dim invalidChars As Variant
Dim char As Variant
Dim result As String

‘ Windowsファイルシステムにおける禁止文字の定義
invalidChars = Array(“/”, “:”, “”, “?”, “”””, “<", ">“, “|”)

result = Trim(inputName)

‘ 禁止文字をアンダースコアに置換
For Each char In invalidChars
result = Replace(result, char, “_”)
Next

‘ 制御文字の除去(念のため)
result = Replace(result, vbCr, “”)
result = Replace(result, vbLf, “”)

‘ Windowsの最大パス長制限を考慮し、極端に長い場合は切り詰める
If Len(result) > 200 Then
result = Left(result, 200)
End If

GetSafeFileName = result
End Function

‘ ———————————————————
‘ @brief 図面を安全に保存するメインルーチン
‘ ———————————————————
Public Sub SafeSaveDrawing(ByVal targetFolder As String, ByVal baseName As String)
On Error GoTo ErrorHandler

Dim safeName As String
Dim fullPath As String

‘ 安全なファイル名を取得
safeName = GetSafeFileName(baseName)
fullPath = targetFolder & “\” & safeName & “.dwg”

‘ 保存処理(acNativeは現在のDWGバージョン)
ThisDrawing.SaveAs fullPath, acNative

MsgBox “保存完了: ” & safeName, vbInformation
Exit Sub

ErrorHandler:
MsgBox “保存失敗: ” & Err.Description, vbCritical
End Sub

—

プロフェッショナルが意識すべき3つの設計ポイント

1. 入力の正規化(サニタイズ)を疎結合にする

ファイル名の変換ロジックを `SafeSaveDrawing` の中に直接書くのは悪手だ。上記のように `GetSafeFileName` 関数として分離しておくことで、将来的に「特定の記号は別のルールで置換したい」といった仕様変更が起きた際も、1箇所を修正するだけでシステム全体に適用できる。

2. ファイルパスの連結と存在チェック

`targetFolder` が存在しない状態で `SaveAs` を実行すれば、AutoCADはエラーを返す。
実務レベルでは、保存前に `Dir(targetFolder, vbDirectory)` を使ってフォルダの存在を確認し、なければ `MkDir` で作成する動的なディレクトリ生成ロジックを前段に組み込むべきだ。

3. バージョン互換性の管理

今回のコードでは `acNative` を使用しているが、もし「古いバージョンのAutoCADでも開けるように」という要件があるなら、`ac2010_DWG` や `ac2018_DWG` などの定数を明示的に指定する必要がある。業務自動化ツールにおいて「意図しないフォーマットで保存されてしまった」という事故は、設計ミス以外の何物でもない。

—

まとめ:自動化の真髄は「例外の排除」にある

コードが「正常に動く」ことは当たり前だ。真のエンジニアは、「異常なデータが入力されたとき、いかにシステムを壊さず、かつユーザーに伝わる形で処理を完結させるか」を設計する。

今回の `GetSafeFileName` は、あなたのツールをより堅牢で、現場から愛される存在にするための小さな、しかし不可欠な歯車だ。ぜひ、自身のライブラリに組み込んで活用してほしい。

次に目指すべきは、ファイル保存時のログ記録(いつ、誰が、どの名前で保存したか)を外部テキストやデータベースに書き出す拡張機能だ。これについても、いずれ深く掘り下げていこう。

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