こんにちは!AutoCADの自動化設計に日々向き合っていると、「あれ、別のクライアントから預かった図面を開いたら、指定のフォントやハッチングパターンがなくて文字化けした……」「標準の検索パスに毎回追加するのは面倒だし、他の図面に影響が出たら困る」といった壁にぶつかったことはありませんか?
マクロの記録ボタンを押すだけのステージから一歩進み、AutoCADの奥深くまで理解して自由自在に操りたいあなたへ。今回は、「AcadApplication.Preferences.Files.SupportPath(サポートファイル検索パス)」をVBAから動的に書き換え、プロジェクト専用のフォントやパターンを強制認識させる環境スイッチング術を伝授します。
ここをクリアすれば、AutoCADの裏側の仕組みまで見通せる「ワンランク上のエンジニア」の仲間入りです。一緒にしっかりとマスターしていきましょう!
—
1. なぜ「検索パスの一時書き換え」が必要なのか?
AutoCADは、文字を書くための「SHXフォント」や、図面に模様を塗る「ハッチングパターン(PATファイル)」を探すとき、決まったフォルダの順番(=サポートファイル検索パス)を上から順に探しに行きます。
通常、これらは「OPTIONS(オプション)」画面から手動で追加しますよね。しかし、次のような現場の課題があります:
- 標準設定を汚したくない:社内の共通ルール用フォントパスに、案件ごとの特殊なフォルダをごちゃ混ぜにしたくない。
- 環境依存をなくしたい:どのPCでマクロが動いても、コード側で自動的に専用フォルダを検索パスの最優先(先頭)にねじ込みたい。
- 安全に元に戻したい:マクロが終わったら、汚した設定を確実に元の状態へクリーンアップしたい。
これを叶えるのが、今回解説する「実行中のみパスを最優先に挿入し、終了時に美しく原状回復する」というプロの技です。
—
2. 押さえておくべきオブジェクトモデルの基礎
今回の魔法を支えるのは、AutoCADの頭脳である `AcadApplication` です。
- `ThisDrawing.Application` または単に `Application` で、今動いているAutoCADそのものを掴みます。
- その中にある `.Preferences`(環境設定)を辿り、さらに `.Files`(ファイルタブの設定)を操作します。
- 最終的な検索パスは、セミコロン(`;`)で区切られた巨大な一つの文字列として保持されています。
つまり、VBAの文字列操作を使って「既存のパスの先頭に、自分のフォルダを『;(セミコロン)』付きで結合して突っ込んでやる」というアプローチを取ります。
—
3. 【実践】プロジェクト専用フォントを強制認識させるコード
それでは、実際の現場でそのままコピペして使える実用コードを公開します。
エラー処理(Error Handler)を組み込み、もしマクロの途中で予期せぬエラーが起きた場合でも、必ず元の設定に戻る(トランザクション的な配慮)よう設計されたプロ仕様のコードです。
Option Explicit
Public Sub ForceLoadProjectResources()
Dim acadApp As AcadApplication
Dim originalPath As String
Dim targetFolder As String
Dim newPath As String
‘ 1. 対象となるプロジェクト専用フォルダのパスを指定
‘ ※実際の環境に合わせて書き換えてください(ネットワークパス等でも可)
targetFolder = “C:\MyAutoCADProject\SpecialFontsAndPatterns”
‘ フォルダが存在するか簡易チェック
If Dir(targetFolder, vbDirectory) = “” Then
MsgBox “指定されたプロジェクトフォルダが見つかりません: ” & vbCrLf & targetFolder, vbCritical, “パスエラー”
Exit Sub
End If
‘ 2. AutoCADアプリケーションオブジェクトの取得
Set acadApp = ThisDrawing.Application
On Error GoTo ErrorHandler ‘ エラー時の原状回復を保証するためのトラップ
‘ 3. 現在のサポートファイル検索パスをバックアップ(退避)
originalPath = acadApp.Preferences.Files.SupportPath
‘ 4. ターゲットフォルダが既にパスに含まれていないか確認し、最優先(先頭)に挿入
If InStr(1, originalPath, targetFolder, vbTextCompare) = 0 Then
‘ 先頭に結合し、既存のパスとセミコロンで繋ぐ
newPath = targetFolder & “;” & originalPath
‘ AutoCADの環境設定に書き込む
acadApp.Preferences.Files.SupportPath = newPath
Debug.Print “【環境スイッチ】専用パスを最優先に挿入しました: ” & targetFolder
Else
‘ 既に含まれている場合はバックアップのみ行い、パスの変更はスキップ
newPath = originalPath
Debug.Print “【環境スイッチ】専用パスは既に含まれています。”
End If
‘ =========================================================================
‘ 5. ここに通常の処理(図面を開く、文字スタイルを作成する、ハッチングを貼る等)を記述
‘ =========================================================================
MsgBox “環境スイッチが完了しました!” & vbCrLf & _
“専用フォルダ内のSHXフォントやハッチングが最優先で認識されます。”, vbInformation, “成功”
‘ 6. 処理が正常に終わったら、速やかに元のパスへ復元(クリーンアップ)
acadApp.Preferences.Files.SupportPath = originalPath
Debug.Print “【環境スイッチ】設定を元の状態に復元しました。”
Exit Sub
ErrorHandler:
‘ 予期せぬエラーが発生した場合でも、確実に設定を元に戻す(非常に重要!)
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “異常終了”
If originalPath <> “” Then
acadApp.Preferences.Files.SupportPath = originalPath
Debug.Print “【緊急復元】エラー発生のため、設定を強制復元しました。”
End If
End Sub
—
4. コードのポイントと知られざる注意点
ここからは、チーフアーキテクトとしての視点で、このコードのキモと「現場の罠」を解説します。
① セミコロン(`;`)の区切り文字ルール
AutoCADの `SupportPath` は、複数のパスがセミコロンで連結されています。先頭に追加するときは `targetFolder & “;” & originalPath` とし、逆に末尾に追加したい場合は `originalPath & “;” & targetFolder` とします。今回は「強制認識させる(優先度を上げる)」ため、必ず先頭(左側)に差し込むのが鉄則です。
② エラーハンドリングの絶対性
もしステップ5の処理中に「メモリ不足」や「図面要素の不正」などでVBAがクラッシュした場合、バックアップした `originalPath` に戻す処理が実行されなければ、ユーザーのAutoCADの環境設定が破壊されたまま(専用パスが消えないまま)になってしまいます。
`On Error GoTo ErrorHandler` を仕込み、どんな状況でも必ず元の状態へリストアする構造にすることが、プロのエンジニアとしての最低限の美学です。
③ 反映のタイミング
`acadApp.Preferences.Files.SupportPath = newPath` を実行した瞬間から、AutoCADの内部エンジンはそのパスを参照しに行きます。ただし、既にメモリ上にキャッシュされているフォント等がある場合は、図面を再読み込み(再オープン)するか、フォントキャッシュの再構築が必要になるケースもあるため、パスを追加した後に図面を開閉するフローをセットにするとより確実です。
—
まとめ:ここをクリアすれば、AutoCAD VBAの基本はバッチリです!
今回は、`AcadApplication.Preferences` を通じて、AutoCADの根幹である環境設定をプログラムから動的にハックする手法を学びました。
単に図形を描くだけのコードから脱却し、「AutoCADという巨大なアプリケーションの環境そのものをコントロールする」という視点を持てるようになると、作れるツールの幅が圧倒的に広がります。どんな悪条件の図面が来ても、環境側をプログラムでシュッと整えてスマートに処理を完結させる――そんなカッコいい自動化エンジニアを目指して、ぜひ実際の開発現場でこのテクニックを活用してみてください!
