AutoCAD VBAを掌握する極限の知見:図面パスから「フォルダ名・ファイル名」を自在に操る技術
こんにちは。AutoCADの自動化という深淵な世界へようこそ。
「マクロの記録」から一歩踏み出し、自分自身の力でCADを操り始めたあなたへ。今日は、どんな大規模な自動化ツールを作る際にも必ず通る「入り口」である、AcadDocumentオブジェクトのパス解析についてお話しします。
なぜこれが必要か? それは、CADから出力するDXFやPDFを自動で同じフォルダに保存したり、図面管理のデータベースを構築したりする際、「どこに何があるか」をコードに理解させる力が不可欠だからです。
さあ、堅苦しいリファレンスを閉じて、現場で生きる「本物の知見」を手にしましょう。
—
1. そもそも `FullName` とは何か?
AutoCADのオブジェクトモデルにおいて、`ThisDrawing`(現在開いている図面)は `AcadDocument` というオブジェクトです。このオブジェクトは、その図面がディスク上のどこに存在するかを `FullName` というプロパティの中に全て詰め込んでいます。
例えば、`C:\Project\2024\Layout_A.dwg` というパスがあったとしましょう。
これをそのまま使っても良いのですが、実際の実務では「フォルダ名だけ」が欲しい場面や、「拡張子なしのファイル名だけ」が欲しい場面が圧倒的に多いはずです。
2. 実践:文字列を「解体」する職人のコード
VBA標準の文字列操作関数である `InStrRev`(右から検索)を使いこなすのが、この領域の定石です。
Sub GetFileInfo_Example()
Dim doc As AcadDocument
Dim fullPath As String
Dim folderPath As String
Dim fileName As String
Dim baseName As String
Dim pos As Long
‘ 現在アクティブな図面を取得
Set doc = ThisDrawing
fullPath = doc.FullName
‘ 1. 最後の「\」の位置を右から検索する
pos = InStrRev(fullPath, “\”)
‘ 2. フォルダパスを取得(左から検索した位置まで)
folderPath = Left(fullPath, pos)
‘ 3. ファイル名を取得(位置の次から最後まで)
fileName = Mid(fullPath, pos + 1)
‘ 4. 拡張子を除去したファイル名を取得
‘ 「.」の位置を探し、そこまでを切り出す
baseName = Left(fileName, InStrRev(fileName, “.”) – 1)
‘ 結果をイミディエイトウィンドウに出力(Ctrl+Gで確認)
Debug.Print “フォルダ: ” & folderPath
Debug.Print “ファイル名: ” & fileName
Debug.Print “名前のみ: ” & baseName
End Sub
このコードの「ここが肝」
- `InStrRev` の優位性: 通常の `InStr` は左から検索しますが、パス解析には必ず `InStrRev` を使ってください。フォルダ階層が深くても、常に最後の `\` を正確に捉えることができるからです。
- `Mid` と `Left` の使い分け: 文字列の切り出しは、この2つさえあれば9割解決します。余計なライブラリを読み込む必要はありません。
—
3. 初学者が必ず陥る「3つの罠」
現場で開発していると、以下のような壁にぶつかることがあります。これを知っておくだけで、他の開発者と一歩差がつきます。
① 「未保存の図面」問題
図面を一度も保存していない場合、`FullName` は空文字(`””`)を返します。この状態で無理に解析を行うと「プロシージャの呼び出し、または引数が不正です」というエラーが出ます。
対策: `If doc.FullName = “” Then` で判定し、保存を促すメッセージを出すのがプロの作法です。
② ファイル名に「.」が含まれている場合
最近のOSでは「図面.v1.0.dwg」のように、名前に複数のピリオドが含まれることがあります。
対策: 単純な `Split` 関数ではなく、上記コードのように「一番最後のピリオド」を `InStrRev` で特定する方法が最も堅牢です。
③ ネットワークパスの落とし穴
UNCパス(`\\Server\Folder\…`)であっても、このロジックは変わらず機能します。しかし、権限がないフォルダへのアクセスを自動化するとCADがフリーズすることがあるため、ファイル操作を行う前には必ず `Dir` 関数などで存在確認を行う癖をつけましょう。
—
4. エンジニアとしての一歩先へ
さて、パスを切り分けられるようになったあなたには、次は「FileSystemObject (FSO)」という強力なツールを調べることをお勧めします。
今回のように文字列を切り刻むのも技術ですが、`FSO` を使えば `fso.GetParentFolderName(fullPath)` のように、直感的に情報を引き出すことができます。しかし、まずは今回紹介した「VBAネイティブな文字列処理」をマスターしてください。言語の基礎を知らぬまま便利ツールに頼ると、いざという時のデバッグで必ず詰むからです。
このコードが、あなたの業務自動化という長い旅路の、確かな羅針盤となりますように。
分からないことがあれば、いつでもまた聞きに来てください。応援していますよ!
