【AutoCAD VBA】プロファイル切替の深淵:環境同期を自動化するアーキテクチャ
AutoCADの運用において、最も頭を悩ませるのが「部署やプロジェクト単位での環境差異」だ。サポートパス、プロッタ設定、表示スタイル。これらを手動で切り替える運用は、人為的ミスの温床であり、エンジニアとして許容できるものではない。
本稿では、`AcadApplication.Preferences.Profiles`を核としたプロファイル制御の極致を解説する。単にプロファイルを切り替えるだけなら初学者のコードだ。我々が目指すのは、レジストリまでをも考慮した、堅牢で即座に同期される環境管理システムである。
—
1. プロファイル操作の死角:なぜ「切り替える」だけでは不十分か
AutoCADのプロファイル設定は、`HKEY_CURRENT_USER\Software\Autodesk\AutoCAD\[Version]\[ProductCode]\Profiles` 配下に保存されている。
VBAの `Preferences.Profiles.ActiveProfile` を書き換えるだけでは、カレントセッションのメモリ上の環境しか変わらない場合がある。特に、複雑なサポートパスやプリンタ設定は、AutoCADが内部でキャッシュを保持しているため、設定変更直後に `Update` を強制しないと、図面を開いた瞬間に古い設定がロードされるという現象が発生する。
極限のアーキテクチャの要件
1. プロセス間隔離: 他のAutoCADプロセスに影響を与えず、現在のプロセスのみを即座に最適化する。
2. エラーハンドリング: プロファイルが存在しない場合の自動作成・初期化ロジック。
3. リソースの明示的解放: COMオブジェクトのメモリリークを許さない設計。
—
2. 実装:プロファイル同期エンジン
以下は、指定したプロファイルへ切り替え、かつ設定を強制適用させるための基幹ロジックだ。
Option Explicit
‘ プロファイルを安全に切り替え、環境を同期させるメインプロシージャ
Public Sub ApplyCorporateProfile(ByVal profileName As String)
Dim acadPref As AcadPreferences
Dim profs As AcadPreferencesProfiles
On Error GoTo ErrorHandler
‘ Applicationからルートオブジェクトを抽出
Set acadPref = Application.Preferences
Set profs = acadPref.Profiles
‘ 存在確認(プロファイルがない場合は強制的にデフォルトへ戻す等の防衛策が必要)
If Not IsProfileExists(profs, profileName) Then
Err.Raise vbObjectError + 1000, “ApplyCorporateProfile”, “指定プロファイルが見つかりません: ” & profileName
End If
‘ プロファイルの切り替え
‘ 注意:この操作は即時にレジストリとメモリに反映される
profs.ActiveProfile = profileName
‘ 【重要】設定を確定させるために強制保存
‘ これを怠ると、予期せぬシャットダウン時に設定がロールバックされる
acadPref.Save
Debug.Print “Profile switched to: ” & profileName
Cleanup:
‘ オブジェクトの明示的解放
Set profs = Nothing
Set acadPref = Nothing
Exit Sub
ErrorHandler:
MsgBox “環境切替エラー: ” & Err.Description, vbCritical
Resume Cleanup
End Sub
‘ プロファイル存在チェック
Private Function IsProfileExists(profs As AcadPreferencesProfiles, name As String) As Boolean
Dim i As Long
Dim pList As Variant
pList = profs.GetAllProfileNames
For i = LBound(pList) To UBound(pList)
If pList(i) = name Then
IsProfileExists = True
Exit Function
End If
Next
End Function
—
3. レガシー環境を凌駕する:Windows APIによる強制同期
VBAだけでは限界があるケースがある。特に、外部のシステム連携で「AutoCADを起動する前にレジストリを書き換える」必要がある場合、`SendMessage` APIを用いてAutoCADプロセスに設定更新を通知するのが最も確実だ。
レジストリを直接操作した後、以下のコードでプロセスの設定を再読込させる。
‘ 宣言部(標準モジュールへ記述)
Private Declare PtrSafe Function PostMessage Lib “user32” Alias “PostMessageA” _
(ByVal hwnd As LongPtr, ByVal wMsg As Long, ByVal wParam As LongPtr, ByVal lParam As LongPtr) As Long
‘ 設定変更後にAutoCADへWM_SETTINGCHANGEを通知することで、
‘ キャッシュされている設定を強制的に再読込させる高等テクニック
Public Sub ForceRegistryRefresh()
Const WM_SETTINGCHANGE = &H1A
‘ AutoCADのメインウィンドウハンドルに対して通知を送る
PostMessage Application.HWND, WM_SETTINGCHANGE, 0, 0
End Sub
—
4. チーフアーキテクトからの提言
このシステムを構築する際、決して「ハードコーディング」をしてはならない。プロファイル名はJSONやINIファイル、あるいはデータベースから動的に読み込むべきだ。
- 設計の分離: `ProfileManager` クラスを作成し、環境定義(パス、設定値)とロジックを完全に切り離せ。
- メモリ監視: AutoCAD VBAは、大規模な図面を開閉する過程でメモリリークを起こしやすい。`Set = Nothing` は単なる作法ではなく、生存権を確保するための儀式と心得よ。
- 自動化の罠: `ActiveProfile` を切り替える際、現在開いている図面の `Database` オブジェクトが古い設定のまま残る場合がある。プロファイル切り替え後は、`ThisDrawing.Regen acAllViewports` を実行し、描画環境を強制的に再構築するまでを「一連の処理」と定義せよ。
AutoCADの環境設定は、単なるテキストの羅列ではない。設計者が効率的に、かつミスなく図面を描くための「基盤」だ。この基盤を完璧に制御することは、すなわち組織全体の生産性を物理的に向上させることに直結する。
次のステップは、このVBAコードを `AutoCAD .NET API` に移植し、より堅牢なプラグインとしてパッケージングすることだ。VBAは強力だが、現代のエンタープライズ環境では、より型安全性の高いマネージコードへの移行を視野に入れるべきである。それが、この道のプロフェッショナルが歩むべき道だ。
