【実務・中級編】【実務中級者向け】図面保存時の「ファイル名禁止文字」自動クリーニング機能の実装 – AutoCAD VBA解析バイブル

スポンサーリンク

AutoCAD自動化の深淵:ファイル名「禁止文字」によるクラッシュを根絶する堅牢なアーキテクチャ

AutoCADの運用現場において、最も不毛で、かつ最も頻発するエラーの一つが「ファイル保存時のファイル名不正」だ。

「なぜか保存できない」「名前を付けて保存でエラーが出る」。現場の設計者がこれに遭遇するたび、設計の手は止まり、貴重な思考時間は奪われる。多くのエンジニアはこれを「運用の徹底(教育)」で解決しようとするが、それは敗北だ。システム側で「物理的に不正なファイル名を作らせない」設計こそが、真の業務自動化における黄金律である。

今日は、AutoCAD VBAを用いた「禁止文字自動クリーニング・バリデーター」の実装論を伝授する。これは単なる文字列置換のコードではない。AutoCADのドキュメント・ライフサイクルに介入し、不整合を未然に防ぐための防衛的プログラミングだ。

—

1. なぜ「手動チェック」は失敗するのか

多くの実装者は、ファイル保存直前に `If` 文で力任せにチェックしようとする。だが、それには大きな落とし穴がある。

  • UnicodeとOSの壁: Windowsの禁止文字(`\ / : ? ” < > |`)以外にも、社内管理システムが嫌う特殊記号や、全角/半角の混在問題が存在する。
  • イベントの競合: `SaveAs` イベント内での複雑な処理は、AutoCADの内部スタックを汚染し、最悪の場合、致命的なクラッシュ(Access Violation)を引き起こす。
  • パスの正規化: ファイル名だけでなく、フルパスの長さ(MAX_PATH)も考慮しなければ、現代のCAD運用ではどこかで破綻する。

我々が目指すべきは、「入力の浄化(Sanitization)」と「保存の抽象化」だ。

—

2. 実装:堅牢なファイル名クリーンアップ・エンジン

以下のコードは、単に文字を置換するだけでなく、将来的な保守性を考慮し、ルールを配列で管理する設計にしている。

Option Explicit

‘ プロダクションコードにおける定数定義は外出しが鉄則
Private Const ILLEGAL_CHARS As String = “\/:?””<>|”

”’

”’ ファイル名として不適切な文字を全角・半角問わず検出し、安全な文字へ置換する
”’

Public Function GetSafeFileName(ByVal targetName As String) As String
Dim i As Long
Dim charToReplace As String
Dim sanitizedName As String

sanitizedName = targetName

‘ 不正文字リストを巡回して置換
‘ 開発のヒント: 必要であれば、ここで「社内禁止文字」を配列に追加せよ
For i = 1 To Len(ILLEGAL_CHARS)
charToReplace = Mid(ILLEGAL_CHARS, i, 1)
sanitizedName = Replace(sanitizedName, charToReplace, “_”)
Next i

‘ 連続するアンダースコアを一つにまとめる(視認性向上)
Do While InStr(sanitizedName, “__”) > 0
sanitizedName = Replace(sanitizedName, “__”, “_”)
Loop

GetSafeFileName = Trim(sanitizedName)
End Function

”’

”’ AutoCADの保存イベントに組み込むためのラッパー関数
”’

Public Sub SafeSaveDocument(ByVal doc As AcadDocument, ByVal folderPath As String, ByVal fileName As String)
On Error GoTo ErrorHandler

Dim safeName As String
safeName = GetSafeFileName(fileName)

‘ フルパスの整合性チェック
Dim fullPath As String
fullPath = folderPath & “\” & safeName & “.dwg”

‘ 保存実行
doc.SaveAs fullPath
Debug.Print “Success: ” & fullPath
Exit Sub

ErrorHandler:
MsgBox “保存プロセスで予期せぬエラーが発生しました: ” & Err.Description, vbCritical
End Sub

—

3. エンジニアとして押さえるべき重要ポイント

1. 状態の隔離

上記の `GetSafeFileName` は、AutoCADのオブジェクトモデルに依存していない。これはユニットテストが可能であることを意味する。ビジネスロジックとAutoCADのAPI呼び出しを分離することは、将来的なVB.NET移行や、他のCADへの移植性を担保する唯一の手段だ。

2. 「名前を付けて保存」の罠

`Document.SaveAs` メソッドは、呼び出し時に現在開いている図面のパス状態を書き換える。もし、この処理の前後でデータベース連携(設計管理システム等)を行っている場合、「保存が成功したという事実」と「データベース上のレコードID」が一致しているかの整合性確認を必ずコードの直後に入れること。

3. 禁止文字の「動的更新」

上記のコードでは `ILLEGAL_CHARS` を定数にしているが、大規模な開発チームであれば、これをXMLやJSON、あるいは社内ネットワーク上のINIファイルから読み込むように設計すべきだ。プロジェクトの進行とともに「禁止したい文字」は増える傾向にあるからだ。

—

結論:自動化は「エラーを隠す」ことではない

自動化の真髄は、エラーを隠蔽することではなく、エラーが発生し得ない境界条件を設計することにある。

今回紹介した「禁止文字クリーニング」の実装は、一見すると些細な機能だ。しかし、これによって設計者が「保存時のエラー回避」という不毛な心理的負荷から解放されることは、トータルで見れば膨大な生産性向上に繋がる。

さあ、あなたの環境でもこの「守りのコード」を実装し、設計者が本来の創造的な業務に集中できる環境を整えてほしい。伝説的な自動化エンジニアは、常に「ユーザーが失敗する権利」をシステム的に奪い去るものなのだから。

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