AutoCAD VBAを掌握する極限の知見
【上級】メニューバーとツールバーを動的制圧せよ:UIプログラム制御の完全設計
業務効率化のツールを開発する際、VBAで図面を自動処理するマクロを書くだけで満足していないだろうか。
真のプロフェッショナルが目指すのは、「ユーザーに意識させないUIの統合」だ。エンドユーザーが複雑なコマンド名を覚える必要性を排除し、業務フローに最適化されたカスタムメニューやツールバーを動的に生成・配置する。これこそが、現場の工数を真に削減するシステムアーキテクチャである。
しかし、AutoCADのUIカスタマイズ領域は、一歩踏み誤ると「CUI/MUIファイルの競合」「クラッシュ」「ゾンビプロセスの発生」といった地雷原と化す。
今回は、AutoCAD VBAからアプリケーションのUIを完全に掌握し、堅牢かつメンテナンス性の高いカスタム環境を構築する極意を伝授する。
—
1. なぜ「手動カスタマイズ」では実務で破綻するのか
多くの初心者は、CUI(カスタマイズ ユーザー インタフェース)エディタを使って手動でメニューやツールバーを追加しようとする。だが、これを数十台のクライアントPCに展開することを想像してほしい。
- バージョンの差異: AutoCADのバージョン(2024, 2025など)や業種別プラットフォーム(AutoCAD Architecture, Civil 3D等)によって、ベースとなるCUIXファイルのパスや構造が異なる。
- 展開の属人化: セットアップ手順書を作り、各PCで手動ポチポチ作業を行わせるのは、エンジニアの恥だ。
「UIはコードで定義し、起動時あるいは初期化時に動的に構築・修復する」
これが、エンタープライズ環境における唯一の正解である。
—
2. AutoCAD UIアーキテクチャの核心:MenuGroupsとWorkspace
AutoCADのUI要素(メニューバー、プルダウンメニュー、ツールバー)は、`AcadApplication.MenuGroups` コレクションによって管理されている。
メインのCUIX(通常は `acad.cuix` またはカスタムCUIX)をロードし、その中の `AcadMenuGroup` に対してメニューやツールバーを追加・削除していく。
ここで重要な設計上の注意点がある。
「現在ロードされているメインCUIXを直接書き換えるのは危険」 ということだ。
AutoCADの仕様上、メインCUIXへの書き込みは排他制御やパーミッションの問題、さらにはAutoCAD終了時の設定保存タイミングによる巻き戻し現象を引き起こす。
したがって、実務では以下の戦略をとる。
1. 自社製のアドオン用部分CUIXをプログラムからロードする。
2. もしくは、現在のメインCUIXの `MenuGroups(0)` を操作対象とするが、重複登録のガード処理を必ず実装する。
—
3. 【プロダクションコード】メニューとツールバーを動的生成する堅牢なモジュール
以下のコードは、実務の現場でそのまま利用できるプロダクションクオリティのVBAコードだ。
カスタムメニュー「自動化ツール」と、そこに紐づくツールバーを動的に生成し、指定したVBAマクロ(またはコマンド)を実行させる。
Option Explicit
‘ =================================================================================
‘ módulo名: modUIController
‘ 概要 : AutoCADのメニューバーおよびツールバーを動的に構築・制御するクラスモジュール的役割
‘ 備考 : エラーハンドリングと重複登録防止(イデムポータント)を徹底した実装
‘ =================================================================================
Public Sub InitializeCustomUI()
On Error GoTo ErrorHandler
Dim currMenuGroup As AcadMenuGroup
Dim customMenu As AcadPopupMenu
Dim popMenus As AcadPopupMenus
Dim toolbarObj As AcadToolbar
Dim i As Long
‘ メインのメニューグループ(通常はインデックス0の acad)を取得
If ThisDrawing.Application.MenuGroups.Count = 0 Then
MsgBox “有効なメニューグループが見つかりません。”, vbCritical, “UI初期化エラー”
Exit Sub
End If
Set currMenuGroup = ThisDrawing.Application.MenuGroups(0)
Set popMenus = currMenuGroup.Menus
‘ 1. 既存の同名メニューが存在する場合は、競合を防ぐために一度削除(イデムポータントの担保)
For i = popMenus.Count To 1 Step -1
If popMenus(i).Name = “(&A) 業務自動化” Then
popMenus(i).Delete
Exit For
End If
Next i
‘ 2. 新規プルダウンメニューの作成(メニューバーの末尾に追加)
Set customMenu = popMenus.Add(“(&A) 業務自動化”)
‘ 3. メニュー項目の追加 (AddMenuItemの引数: インデックス, ラベル, 実行するマクロ文字列)
‘ ※注意: マクロ文字列の末尾にあるスペースや特殊文字(^C^C等)はAutoCADのコマンド構文に従う
Dim menuItm1 As AcadPopupMenuItem
Dim menuItm2 As AcadPopupMenuItem
Set menuItm1 = customMenu.AddMenuItem(customMenu.Count + 1, “図面一括クリーンアップ”, “-CUST_CLEANUP “)
Set menuItm2 = customMenu.AddMenuItem(customMenu.Count + 1, “部品表データエクスポート”, “-CUST_EXPORT “)
‘ 4. メニューバーに表示させる(これを行わないとプルダウンに現れない)
customMenu.InsertInMenuBar (ThisDrawing.Application.MenuBar.Count + 1)
‘ 5. 独自ツールバーの作成とボタン配置
‘ 既存ツールバーのクリーンアップ
Dim tbar As AcadToolbar
On Error Resume Next
Set tbar = currMenuGroup.Toolbars(“業務自動化ツールバー”)
If Not tbar Is Nothing Then
tbar.Delete
End If
On Error GoTo ErrorHandler
‘ ツールバーの新設
Set tbar = currMenuGroup.Toolbars.Add(“業務自動化ツールバー”)
‘ ツールバーボタン(フライアウトやボタン)の追加
‘ AddToolbarButton(インデックス, 表示名, ヘルプ文字列, マクロ文字列)
Dim btn1 As AcadToolbarItem
Set btn1 = tbar.AddToolbarButton(tbar.Count, “一括クリーンアップ”, “図面の画層や文字を自動整理します”, “-CUST_CLEANUP “)
‘ ツールバーを表示状態にする
tbar.Visible = True
MsgBox “業務自動化UIの構築が完了しました。”, vbInformation, “セットアップ成功”
Exit Sub
ErrorHandler:
MsgBox “UI構築中に予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “致命的エラー”
End Sub
‘ =================================================================================
‘ クリーンアップ用プロシージャ(アンインストール時やデバッグ用)
‘ =================================================================================
Public Sub RemoveCustomUI()
On Error Resume Next
Dim currMenuGroup As AcadMenuGroup
Dim i As Long
Set currMenuGroup = ThisDrawing.Application.MenuGroups(0)
‘ メニューの削除
For i = currMenuGroup.Menus.Count To 1 Step -1
If currMenuGroup.Menus(i).Name = “(&A) 業務自動化” Then
currMenuGroup.Menus(i).RemoveFromMenuBar
currMenuGroup.Menus(i).Delete
Exit For
End If
Next i
‘ ツールバーの削除
currMenuGroup.Toolbars(“業務自動化ツールバー”).Delete
MsgBox “カスタムUIを削除しました。”, vbInformation, “クリーンアップ完了”
End Sub
—
4. プロフェッショナルが解説する実装の急所
上記のコードをただコピペするだけでは、実務の荒波を越えることはできない。アーキテクトとして押さすべき3つの技術的ポイントを解説する。
① イデムポータント(冪等性)の確保
プログラムを何回実行しても同じ結果になる性質(冪等性)を担保しなければならない。
上記のコードでは、メニューやツールバーを追加する前に「同名の既存要素を逆順ループで検索し、存在すれば削除する」処理を挟んでいる。これを怠ると、マクロを修正・再実行するたびにメニューが重複して生成され、AutoCADが肥大化・不安定化する原因となる。
② マクロ文字列とコマンドラインの流儀
`AddMenuItem` や `AddToolbarButton` に渡す第4引数(マクロ文字列)の末尾に注目してほしい。
“-CUST_CLEANUP ”
末尾の半角スペースは、AutoCADのコマンドラインにおいて「Enterキー(確定)」を意味する。ここが抜けると、コマンド名が入力された状態で止まってしまい、ユーザーが手動でEnterを押さなければならなくなる。完全自動化を目指すなら、この空白の有無の厳密な管理が不可欠だ。
③ ライフサイクルとエラーハンドリング
AutoCADのCOMオブジェクトモデルは非常にデリケートである。特に `AcadToolbar.Visible = True` や `InsertInMenuBar` の実行時には、AutoCADの描画スレッドやUIスレッドとの同期ズレによるエラーが発生しやすい。
`On Error Resume Next` を戦略的に配置し、リソースの競合をいなす設計が求められる。
—
5. データベースや外部ファイル連携への拡張
この動的UI構築手法の真価は、「外部設定ファイル(JSON, XML, あるいはSQLite/SQL Serverなど)と同期できること」にある。
例えば、社内のDBから「今週実行すべき共通マクロのリスト」を動的に取得し、上記VBAのループ処理に組み込むことで、「サーバー側の設定を変更するだけで、全社クライアントのAutoCADメニューが自動アップデートされる仕組み」を構築できる。
手動でのCUIファイル配布や、各設計者まかせのローカルカスタマイズという非効率な時代は終わった。
コードによってUIを支配し、真のエンジニアリングドリブンな設計をあなたの現場に導入してほしい。
