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

スポンサーリンク

AutoCAD VBAの深淵:ファイル保存時における「禁止文字」の動的排除と堅牢なファイルハンドリング

AutoCADのAPIを叩く際、最も軽視されがちだが、最もクリティカルな障害となるのが「ファイル名」の整合性だ。Windowsのファイルシステムが許容しない記号や、社内サーバーのパス制限に抵触する図面を保存しようとして、`ActiveDocument.SaveAs` が不意に例外を投げる——。この「いつ落ちるかわからない」不安定さは、自動化エンジニアにとって最大の恥である。

今回は、単なる置換処理ではない。オブジェクトのライフサイクルを制御し、OSの制約をAPIレベルで事前検知する「堅牢なファイル保存アーキテクチャ」を解説する。

—

1. なぜ、単純なReplace関数では不十分なのか

多くの初学者は `Replace(fileName, “:”, “”)` のような処理を繰り返す。しかし、実務においてこれは致命的だ。

  • パスの競合: 置換後にファイル名が重複するリスク。
  • フルパスの文字数制限: `MAX_PATH`(260文字)制限を超過した際のハンドリング不足。
  • メモリの解放: 大規模図面において、保存時のエラーを適切にハンドルせず放置すると、メモリリークや図面情報の不整合を招く。

シニアエンジニアは、「保存という行為は副作用を伴うクリティカル・セクションである」と認識しなければならない。

—

2. 実装:禁止文字クリーニングと堅牢な保存プロセス

以下のコードは、単なる置換ではなく、正規表現を用いて「OSが拒絶する文字」を検出し、安全なファイル名へと整形する関数だ。VBAからWindowsの `PathInvalidChars` を意識した設計にする。

Option Explicit

‘ VBScript.RegExpを使用して禁止文字を置換するクラス的アプローチ
Public Function GetSafeFileName(ByVal rawName As String) As String
Dim regEx As Object
Set regEx = CreateObject(“VBScript.RegExp”)

‘ Windowsファイル名禁止文字(\ / : ? ” < > |)を定義
regEx.Pattern = “[\\/:?””<>|]”
regEx.Global = True
regEx.IgnoreCase = True

‘ 禁止文字を全角アンダースコアへ置換(可読性と安全性の両立)
GetSafeFileName = regEx.Replace(rawName, “_”)

‘ 明示的なオブジェクト解放(重要:VBAのメモリ管理は不完全である)
Set regEx = Nothing
End Function

‘ 図面保存を実行する堅牢なプロシージャ
Public Sub SafeSaveDocument(ByVal folderPath As String, ByVal baseName As String)
Dim doc As AcadDocument
Dim safeName As String
Dim fullPath As String

Set doc = ThisDrawing

‘ 1. 安全なファイル名を生成
safeName = GetSafeFileName(baseName) & “.dwg”
fullPath = folderPath & “\” & safeName

‘ 2. 保存実行(エラーハンドリングによる保護)
On Error Resume Next
doc.SaveAs fullPath, acNative

If Err.Number <> 0 Then
‘ ここでログ出力や管理者通知を行う
MsgBox “保存失敗: ” & Err.Description, vbCritical
Err.Clear
End If
On Error GoTo 0

‘ 3. オブジェクト参照のクリア
Set doc = Nothing
End Sub

—

3. シニアアーキテクトの視点:アーキテクチャの極致

上記のコードを見て、「普通ではないか」と感じたならば、さらに一歩踏み込む必要がある。

メモリの生存期間(Lifetime)管理

AutoCAD VBAはCOMオブジェクトを扱っている。`Set doc = Nothing` を呼び出しても、即座にメモリが解放される保証はない。大量の図面を連続処理するバッチ処理の場合、「図面を閉じる(Close)」と「オブジェクトをNothingにする」の順序とタイミングが性能を左右する。

Windows APIによる「パス制限」の検証

もしプロジェクトで `MAX_PATH` 問題(260文字制限)に悩まされているなら、`GetLongPathName` や `PathAppend` といったWindows APIを `Declare` 文で定義し、保存前にパスの絶対長を検証するラッパーを構築すべきだ。

‘ API定義例(64bit/32bit互換性を考慮)
If VBA7 Then
Private Declare PtrSafe Function GetFullPathName Lib “kernel32” Alias “GetFullPathNameA” (ByVal lpFileName As String, ByVal nBufferLength As Long, ByVal lpBuffer As String, ByVal lpFilePart As String) As Long
Else
Private Declare Function GetFullPathName Lib “kernel32” Alias “GetFullPathNameA” (ByVal lpFileName As String, ByVal nBufferLength As Long, ByVal lpBuffer As String, ByVal lpFilePart As String) As Long
End If

—

結びに:エンジニアの誇り

ファイル名を「ただの文字列」として扱うか、「システムを揺るがすデータ構造」として扱うか。この意識の差が、現場で発生する「原因不明のシステムダウン」を未然に防ぐ鍵となる。

AutoCAD VBAはレガシーとされることが多い。しかし、そのAPIを隅々まで掌握し、Windows環境と調和させるエンジニアにとって、それは最強の自動化兵器であり続ける。今日紹介した「クリーニング機能」を、あなたのシステムにも組み込んでほしい。それが、プロのエンジニアが守るべき「保守性の美学」だ。

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