AutoCAD VBAの深淵:ファイルパスを制する者は、自動化の混乱を制する
AutoCADの自動化ツールを開発していると、必ず突き当たる壁がある。「ファイル情報の取り扱い」だ。
初心者ほど、`ThisDrawing.Name` を使って痛い目を見る。そして、なぜか「保存されていない図面」や「ネットワークドライブ上の複雑な階層」でツールがクラッシュする。
私はこれまで、何百もの自動化ツールを見てきたが、「ファイルパスの扱いが雑なコード」は、例外なく将来的に技術的負債となる。
今日は、`AcadDocument`オブジェクトが持つ3つのプロパティを、プロフェッショナルとしてどう使い分けるべきか、その極意を伝授する。
—
1. 3つのプロパティ:その正体と「罠」
まず、以下の3つのプロパティを正確に暗唱できるだろうか。
- `Name`: ファイル名(例: `Layout_A.dwg`)
- `Path`: フォルダパス(例: `C:\Project\2023\Design`)
- `FullName`: フルパス(例: `C:\Project\2023\Design\Layout_A.dwg`)
なぜ `Name` だけでは危険なのか?
「ファイル名さえ分かれば良い」というコードは、「同じ名前のファイルが別のフォルダに存在する場合」に破綻する。 ログ出力やデータベース連携において、ファイル名だけをキーにすると、必ずと言っていいほど「どの図面を指しているのか分からない」という致命的なバグを生む。
なぜ「保存前」の図面を考慮しなければならないのか?
新規作成した直後の図面は、`Path` が空文字(`””`)を返す。この状態で `FullName` を結合させようとすると、パスが壊れる。堅牢なツールを作るには、「未保存状態」をいかに検知し、安全にハンドリングするかが分かれ道となる。
—
2. 実践的プログラミング:堅牢なファイル情報取得パターン
現場でそのまま使える、エラーを未然に防ぐための設計パターンを紹介する。これを「標準テンプレート」として採用してほしい。
‘ ———————————————————
‘ 堅牢なファイル情報取得関数
‘ 設計思想: 未保存状態を検知し、安全にパスを返す
‘ ———————————————————
Public Function GetSafeFilePath(doc As AcadDocument) As String
‘ Pathプロパティが空文字かどうかで、保存されているかを判定
If doc.Path = “” Then
‘ 未保存の場合は、一意の識別ができないため例外処理を想定
GetSafeFilePath = “UNSAVED_FILE_” & doc.Name
Else
‘ フルパスを返す(これが最も確実な識別子)
GetSafeFilePath = doc.FullName
End If
End Function
‘ ———————————————————
‘ ログ出力やバックアップで活用するデモコード
‘ ———————————————————
Public Sub ExportDrawingInfo()
Dim doc As AcadDocument
Set doc = ThisDrawing
Dim fullPath As String
fullPath = GetSafeFilePath(doc)
‘ ログファイルに出力する場合の例
Dim logMsg As String
logMsg = Now & ” | 処理対象: ” & fullPath
‘ コンソールへの出力(デバッグ用)
Debug.Print logMsg
‘ 【重要】パスを操作する際は、必ず末尾の \ を考慮せよ
‘ フォルダパスを取得し、バックアップフォルダを作成する例
Dim folderPath As String
If doc.Path <> “” Then
folderPath = doc.Path & “\Backup\”
‘ Dir関数でフォルダ存在確認(Dirは非常に優秀なAPI)
If Dir(folderPath, vbDirectory) = “” Then
MkDir folderPath
End If
End If
End Sub
—
3. プロの視点:ファイル管理で守るべき3つの鉄則
① 識別子には常に「FullName」を使う
データベースやCSVにログを書き出す際は、必ず `FullName` をキーにすること。`Name` はあくまで「表示用」の文字列に過ぎない。
② パス結合は「手動連結」を避ける
`Path & “\” & Name` という書き方は、すでに `Path` の末尾に `\` が含まれている場合(ルートディレクトリなど)に二重スラッシュを生む。可能な限り、ファイルシステムを扱うための専用関数や、パスの末尾を正規化するロジックを挟むこと。
③ ネットワークドライブの「UNCパス」を意識せよ
`\\Server\Shared\Project` のようなUNCパスで運用される環境では、`Path` プロパティの挙動が不安定になることがある。ファイル操作を行う際は、`FileSystemObject (FSO)` を活用し、`GetAbsolutePathName` メソッドでパスを正規化する癖をつけるのが、シニアエンジニアの流儀だ。
—
最後に:なぜ「基礎」にこだわるのか
AutoCAD VBAで最も恐ろしいのは、「動いているように見えるが、裏でデータが破壊されている」状態だ。間違ったパスを元にバックアップを作成し、本来の図面を上書きしてしまったら……その代償は計り知れない。
`AcadDocument` のプロパティを理解することは、AutoCADという巨大なアプリケーションのライフサイクルを理解することに等しい。
コードを書く前に、まず「そのオブジェクトが今、どのような状態にあるか」を想像せよ。それが、あなたのツールが「ただのスクリプト」から「業務を支える堅牢なシステム」へと昇華するための第一歩だ。
さあ、コードを書き換えよう。君のツールが、現場の信頼を勝ち取ることを期待している。
