AutoCAD VBAを掌握する極限の知見
第1回:ハードコードを駆逐せよ。『ThisDrawing.Path』で実現する完全ポータブルな図面自動保存設計
業務自動化エンジニアのシニアアーキテクトとして、現場で数多くのVBAコードを見てきた。その中で、いまだに絶滅しない悪習がある。
それが、ファイルの保存先を `C:\MyWorks\ProjectA\Drawing.dwg` のようにハードコーディングする設計だ。
開発者のローカル環境では動く。しかし、そのマクロを他者に渡したり、共有サーバー(NAS)に移動させたり、あるいはプロジェクトフォルダをごっそり別ドライブにコピーした瞬間、「パスが見つかりません」というエラーの嵐がエンジニアの心を折る。さらに悪いことに、エラーハンドリングの甘いコードは、最悪の場合、意図しない場所にファイルをばら撒き、データ破損の悲劇を引き起こす。
今回は、AutoCAD VBAにおける「図面ファイルパス」のライフサイクルを完全に掌握し、環境に依存しない堅牢なプロジェクトフォルダ構造を自動構築する極意を伝授しよう。
—
1. なぜ「絶対パス」は実務で破綻するのか?
初心者がやりがちなミスは、`SaveAs` メソッドに固定のディレクトリ文字列を渡すことだ。
‘ 【悪夢のアンチパターン】絶対に書いてはいけないコード
ThisDrawing.SaveAs “C:\Work\ProjectX\Export\output.dwg”
このアプローチが実務で通用しない理由は明白だ。
1. 環境依存性: PCのユーザー名(`C:\Users\hoge\…`)が変わるだけで動かなくなる。
2. ドライブレターの罠: ネットワークドライブの割り当て文字(`Z:\` や `X:\`)は、部署やPCによって異なる。
3. 可搬性の欠如: プロジェクトフォルダごとZIPで固めて別担当者に送ったとき、パスのハードコードは100%デバッグ対象になる。
解決策:カレント図面を基準とする「相対パス思考」
プロの自動化エンジニアが目指すべきは、「今開いている図面がどこにあるか」を起点(基点)として、相対的にフォルダ構造をコントロールする設計だ。
ここで主役となるのが、AutoCAD VBAの `ThisDrawing.Path` プロパティである。
—
2. `ThisDrawing.Path` の仕様と「未保存」の罠
`ThisDrawing.Path` は、現在アクティブな図面が保存されているフォルダのパスを文字列で返す。非常に強力だが、実務で使う際には致命的な仕様の罠が存在する。
> ⚠️ 建築・設計現場における最大の罠
> 新規作成しただけで、まだ一度も名前を付けて保存していない図面(ドキュメント名が「Drawing1.dwg」等の状態)において、`ThisDrawing.Path` は長さ 0 の空文字列 (`””`) を返す。
この状態でパスの結合処理を行うと、予期せぬカレントディレクトリにファイルが生成されるか、ランタイムエラー(パスが見つかりません)を引き起こす。
したがって、堅牢なプロダクションコードでは、「マクロを実行する前に、図面が確実に一度保存されているか」を検証するガード節(Guard Clause)が必須となる。
—
3. 【プロダクションコード】プロジェクトフォルダ自動生成&相対パス保存エンジン
ここに示すのは、カレント図面の場所を検知し、同階層に `Export` フォルダと `Backup` フォルダを自動生成した上で、タイムスタンプ付きの図面を出力する実用マクロだ。
エラーハンドリング、事前検証、そして保守性の高さを極限まで高めたプロ仕様のコードを提示する。
Option Explicit
‘ ==============================================================================
‘ 処理名 : ExportCurrentDrawingWithStructure
‘ 概要 : カレント図面のパスを基準に「Export」フォルダを自動生成し、
現在図面をタイムスタンプ付きで安全に別名保存する
‘ ==============================================================================
Public Sub ExportCurrentDrawingWithStructure()
‘ 1. エラーハンドリングの有効化
On Error GoTo ErrorHandler
Dim currentPath As String
Dim exportDir As String
Dim targetFileName As String
Dim fullPath As String
Dim fso As Object
‘ 2. ガード節:図面が未保存であるリスクを排除
currentPath = ThisDrawing.Path
If currentPath = “” Then
MsgBox “【警告】この図面はまだ一度も保存されていません。” & vbCrLf & _
“一度適当な場所に保存してからマクロを再実行してください。”, _
vbCritical + vbOKOnly, “パス取得エラー”
Exit Sub
End If
‘ 3. ファイルシステムオブジェクト(FSO)の遅延バインディング生成
‘ ※参照設定に依存せず、堅牢にフォルダ操作を行うための定石
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ 4. 相対パスをベースにした「Export」フォルダの定義
exportDir = currentPath & “\Export”
‘ 5. フォルダが存在しなければ、自動生成する(多重階層対応)
If Not fso.FolderExists(exportDir) Then
fso.CreateFolder exportDir
‘ ログ出力やイミディエイトウィンドウへの通知(実務では有効)
Debug.Print “新規フォルダを作成しました: ” & exportDir
End If
‘ 6. タイムスタンプ付きファイル名の動的生成 (例: DrawingName_20231025_143022.dwg)
‘ 拡張子を除いたベース名を取得
Dim baseName As String
baseName = fso.GetBaseName(ThisDrawing.Name)
targetFileName = baseName & “_” & Format(Now, “YYYYMMDD_HHNNSS”) & “.dwg”
fullPath = exportDir & “\” & targetFileName
‘ 7. 図面の保存実行
‘ ※注意: SaveAsは現在の図面自体のパスを変更してしまうため、
‘ 元の図面を維持したい場合はSaveAsではなく別手法(Wblock等)を使うべきだが、
‘ 今回は「プロジェクトフォルダ内へのバックアップ保存」を目的とする。
‘ AutoCADの警告ダイアログを一時的に抑制(必要に応じて)
ThisDrawing.Application.SetSystemVariable “FILEDIA”, 0
ThisDrawing.SaveAs fullPath
‘ ダイアログ設定を復元
ThisDrawing.Application.SetSystemVariable “FILEDIA”, 1
‘ 8. 正常終了処理
MsgBox “図面の書き出しが完了しました。” & vbCrLf & _
“保存先: ” & fullPath, vbInformation + vbOKOnly, “処理成功”
GoTo Finally
ErrorHandler:
‘ 予期せぬ例外のキャッチ
ThisDrawing.Application.SetSystemVariable “FILEDIA”, 1 ‘ 確実にダイアログを戻す
MsgBox “予期せぬエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“エラー内容: ” & Err.Description, vbCritical, “致命的エラー”
Finally:
Set fso = Nothing
End Sub
—
4. コードのアーキテクチャ解説:プロがこだわる3つの設計思想
上記のコードには、単なる「動くコード」を超えた、現場で生き残るための3つの設計思想が組み込まれている。
① 遅延バインディングによる `Scripting.FileSystemObject` の活用
VBAの標準機能だけでフォルダの有無判定や作成を行うのは冗長になりがちだ。`CreateObject(“Scripting.FileSystemObject”)` を用いることで、Windows環境であれば参照設定のバージョン違いによるコンパイルエラーを完全に回避しつつ、洗練されたファイルシステム操作が可能になる。
② システム変数 `FILEDIA` の安全な制御
AutoCAD VBAでマクロから `SaveAs` や `Open` などのファイル操作を行う際、背後でダイアログが表示されると、バッチ処理や完全自動化の足を引っ張る。
`SetSystemVariable “FILEDIA”, 0` によってダイアログを抑制しているが、エラー発生時も含めて必ず `1` に戻す(復元する) 構造にしている点に注目してほしい。これを怠ると、ユーザーが手動で図面を開閉できなくなる致命的なUIハングを引き起こす。
③ 競合を防ぐタイムスタンプ戦略
同じプロジェクト内で何度もマクロを実行した際、ファイル名が固定だと「上書き確認」のダイアログが挟まるか、知らぬ間に最新データが古いデータで上書きされてしまう。
`Format(Now, “YYYYMMDD_HHNNSS”)` を付与することで、イミュータブル(不変)なバックアップ履歴を自動形成し、データ損失のリスクをゼロにしている。
—
5. まとめ:実務の自動化は「パスの神様」を味方につけろ
今回解説した `ThisDrawing.Path` を軸にした相対パス設計は、AutoCAD VBAにおけるすべてのファイル自動処理(PDF一括出力、DWGバージョン変換、外部参照アタッチなど)の基礎となる。
「どこで動かしても、その図面の周辺環境を自ら読み取り、秩序正しくファイルを整理整頓する」――これこそが、手作業を根絶し、エンジニアとしての評価を高める真の業務自動化ツールである。
明日からの開発では、ハードコードを一切排除し、ポータブルで美しいコードベースを構築してほしい。あなたの書くVBAコードが、現場の信頼を勝ち取る最高の武器になることを確信している。
