AutoCADの「バージョン地獄」を制圧する:複数環境下における動的プロセス制御の極致
AutoCADの運用において、最も忌むべき存在は「意図しないバージョンでのDWGオープン」だ。社内に2022、2024、2025と複数の環境が混在し、無造作なダブルクリック一つで予期せぬバージョンアップ(図面情報の破壊)が引き起こされる。
真の自動化エンジニアにとって、`CreateObject(“AutoCAD.Application”)` と記述するのは素人の所業だ。あれはレジストリの「最後にインストールしたバージョン」を無条件で呼び出すという、極めて脆弱な実装に過ぎない。
今日は、COMの背後にあるレジストリ・ハイブとプロセス・ライフサイクルを直接制御し、目的の図面に対して「最適なバージョン」を強制的に割り当てるアーキテクチャを伝授する。
—
1. 原理:ProgIDの動的指定とレジストリの「神」
AutoCADのバージョン依存性は、`AutoCAD.Application` というProgIDが、現在インストールされているどの実行バイナリを指すかに依存している。これを回避するには、特定のバージョンに紐づく `AutoCAD.Application.24` や `25` といった「バージョン依存ProgID」を直接指定するだけでは不十分だ。
シニアレベルの制御では、以下の二段階アプローチをとる。
1. レジストリ・スキャン: `HKEY_LOCAL_MACHINE\SOFTWARE\Autodesk\AutoCAD` を検索し、インストールされている全バージョンの実行ファイルパス(`acad.exe`)をカタログ化する。
2. プロセス分離と再起動: 実行中プロセスがない場合は目的のバージョンを起動し、既に別バージョンが先行している場合は、必要に応じてプロセスを終了させるか、あるいは外部プロセスとして切り離す。
—
2. 実装:指定バージョン起動エンジンのコアコード
以下のVBAコードは、特定のメジャーバージョンを強制的に起動するための基盤となる。
‘ @brief 指定したACADバージョンを起動するファクトリメソッド
‘ @param majorVersion 例: “24” (2022), “25” (2025)
Public Function ForceLaunchAutoCAD(majorVersion As String) As Object
Dim progID As String
Dim acadApp As Object
‘ バージョン依存ProgIDを構築
‘ 注意: ACADの内部実装によりバージョン番号がずれるため、事前に検証が必要
progID = “AutoCAD.Application.” & majorVersion
On Error Resume Next
Set acadApp = GetObject(, progID)
If acadApp Is Nothing Then
‘ インスタンスがなければ新規起動
Set acadApp = CreateObject(progID)
End If
‘ ウィンドウの可視化と制御権の確立
acadApp.Visible = True
Set ForceLaunchAutoCAD = acadApp
On Error GoTo 0
End Function
—
3. シニアエンジニアが守るべき「メモリとライフサイクル」の流儀
VBAにおける最大の敵は、暗黙的なオブジェクトの残存だ。AutoCADのCOMインターフェースは強力だが、`acadApp = Nothing` を怠れば、バックグラウンドに「ゾンビプロセス」が蓄積し、メモリリークだけでなく、次回の起動時にCOMエラーを引き起こす。
- 明示的解放: `Set acadApp = Nothing` は、必ずエラーハンドリングの `Finally` 相当箇所に記述すること。
- イベント監視: `WithEvents` を使用し、`BeginQuit` イベントを監視せよ。AutoCAD側からの終了通知をトリガーに、VBA側の参照を即座に破棄する設計が、大規模システムでは必須となる。
- ファイルロックの回避: 複数バージョンを扱う場合、`Documents.Open` は単なるファイル読み込みではない。必ず `ReadOnly` モードを明示的に指定し、既存のセッションによるロックを回避せよ。
—
4. 現場の現実:レガシーとの共存制御
もし君が大規模な社内システムを管理しているなら、以下の「チェック・ゲート」を実装することを推奨する。
1. DWGバージョンヘッダの事前読み取り: AutoCADを起動する前に、バイナリの先頭6バイト(例: `AC1032` は2021以降の形式)を読み取り、現在のインストール環境で開けるか判定する。
2. シェルの強制終了: 厳格なバージョン制御が必要な場合、`taskkill /F /IM acad.exe` をVBAから呼び出し、異種バージョンのプロセスを強制クリーンアップする設計も検討する。これは荒療治だが、現場でのトラブルをゼロにするには最も効率的な「断絶」である。
—
最後に:エンジニアへの提言
AutoCAD VBAはレガシーな技術と揶揄されることもある。しかし、そのCOMインターフェースを通じてCADの心臓部に触れ、プロセスを操る能力は、CADエンジニアリングの極致と言える。
「動けば良い」というコードは、数年後の自分自身を苦しめる呪いとなる。オブジェクトの寿命、Windowsプロセスの生存戦略、そしてレジストリの構造。これらを俯瞰する視点こそが、真の自動化エンジニアの証だ。
次は、`.NET API (ObjectARX)` を用いたメモリ直接アクセスによる、さらに高速なバッチ処理の世界で会おう。そこには、VBAのCOM経由では到達できない「真のパフォーマンス」が待っている。
