【テクニカル・上級編】【上級プロフェッショナル向け】AutoCADの複数バージョン共存環境における「優先起動バージョン」の動的制御 – AutoCAD VBA解析バイブル

スポンサーリンク

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経由では到達できない「真のパフォーマンス」が待っている。

タイトルとURLをコピーしました