【実務・中級編】【初心者向け】図面のフルパスからフォルダ名とファイル名を分離取得:AcadDocumentのFullNameプロパティ活用 – AutoCAD VBA解析バイブル

スポンサーリンク

AutoCAD VBAの深淵:FullNameプロパティを「使い捨てる」な

AutoCADの自動化において、最も初歩的でありながら、最も軽視されがちなのが「ファイルパスのハンドリング」だ。

「`ThisDrawing.FullName` でパスが取れるから、あとは `Split` 関数で適当に切り出せばいい」

もしあなたがそう考えているなら、そのコードは将来のバグの温床となる。OSのパス区切り文字への無理解、未保存図面の存在、そして将来的なネットワークドライブやクラウドストレージ環境への移行……。これら全てを考慮しないコードは、現場で必ず破綻する。

今日は、AutoCAD VBAの基礎である `AcadDocument` オブジェクトを極め、単なる文字列操作を超えた「堅牢なファイル管理の作法」を伝授する。

1. なぜ「Split関数」による切り出しが危険なのか

初心者がやりがちな `Split(FullName, “\”)` という手法は、直感的だが脆い。

  • パスの最後が「\」で終わるのかどうかの揺らぎ。
  • ファイル名自体に「.」が含まれる場合の拡張子抽出の誤作動。
  • 未保存図面(Drawing1.dwgなど)を扱った際の予期せぬエラー。

これらに対処するためには、文字列操作を自作するのではなく、Windows APIやVBAの `FileSystemObject (FSO)` を活用し、OSの作法に則った「構造的な抽出」を行うのがエンジニアの鉄則だ。

2. 【実務レベル】堅牢なパス抽出メソッドの実装

以下は、私がプロジェクトの基盤として必ず実装する「パス解析クラス」のロジックを簡略化したものだ。`FileSystemObject` を使うことで、OS依存のパス区切り問題を一掃する。

‘ 必要な参照設定: Microsoft Scripting Runtime
Option Explicit

Public Sub GetDrawingInformation()
Dim doc As AcadDocument
Set doc = ThisDrawing

‘ 未保存図面への対策
If doc.Path = “” Then
MsgBox “図面がまだ保存されていません。一度保存してから実行してください。”, vbExclamation
Exit Sub
End If

Dim fso As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)

Dim fullPath As String
Dim folderPath As String
Dim fileName As String
Dim baseName As String
Dim extension As String

fullPath = doc.FullName

‘ FSOを使えば、文字列操作で悩む必要はない
folderPath = fso.GetParentFolderName(fullPath)
fileName = fso.GetFileName(fullPath)
baseName = fso.GetBaseName(fullPath) ‘ 拡張子を除いたファイル名
extension = fso.GetExtensionName(fullPath)

‘ 出力テスト
Debug.Print “フォルダパス: ” & folderPath
Debug.Print “ファイル名: ” & fileName
Debug.Print “ベース名: ” & baseName
Debug.Print “拡張子: ” & extension

‘ 後始末(VBAでは明示的な解放が美徳)
Set fso = Nothing
End Sub

このコードの優位性

1. FSOの活用: `GetParentFolderName` 等の標準メソッドを使うことで、パス区切り文字 `\` の扱いに起因するバグを排除。
2. 未保存図面チェック: `doc.Path` が空文字列か否かで、オブジェクトの状態を安全に検知している。
3. 保守性: `baseName` を取得することで、後続の処理で「図面番号」や「改訂番号」を分離しやすくなる。

3. 現場で生き残るための「設計の心得」

このコードをただコピペするだけでなく、以下の3点を意識してツールに組み込んでほしい。

① 「未保存」状態を許容するか否か

実務では「ファイル名がない状態」をどう扱うかでツールの品質が決まる。一時的に `Temp` フォルダに保存させるのか、エラーを出して処理を中断するのか。設計段階で仕様を固めておくこと。

② データベース連携を見据える

将来的にExcel管理表やSQL Serverと連携させる場合、ファイル名だけでなく「フルパス」をユニークキーとして扱う必要がある。パス内のスペースや日本語が含まれる場合、文字列エンコーディングの挙動に注意せよ。

③ 拡張子の厳密な判定

`GetExtensionName` は単に最後のドット以降を返すだけだ。もし、設計図面以外のログファイルなども扱う可能性があるなら、必ず `LCase(extension) = “dwg”` のように小文字比較で判定すること。

最後に:なぜ「基礎」を疎かにしてはならないのか

私がなぜ、これほどまでにパスの分離にこだわるのか。それは、「後から修正するのが最もコストのかかる箇所だから」だ。

ファイル名やフォルダ構成は、業務フローの変化に伴い必ず変わる。その時に「文字列の切り出し位置」をハードコードしていると、ツールは即座にゴミと化す。

AutoCAD VBAはレガシーと言われることもあるが、APIを正しく理解し、OSの標準機能と調和させる設計を行えば、最新の言語にも負けない堅牢な自動化を実現できる。

さあ、まずはこの「パス分離」を完璧にマスターし、あなたのツールを次のステージへ引き上げろ。それが、伝説への第一歩だ。

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