【入門編】【上級】VBAからAutoCADのメニューバーとツールバーを動的にカスタマイズ!AcadMenuGroupとAcadToolbarの操作 – AutoCAD VBA解析バイブル

スポンサーリンク

こんにちは!AutoCADの自動化の海へようこそ。
マクロの記録ボタンを押して満足していた時期を抜け出し、「もっとスマートに、自分のツールをAutoCADの標準機能のように組み込みたい」と思ったなら、あなたはすでに次のステージに立っています。

今回は、VBAからAutoCADのメニューバーツールバーをプログラムで動的にコントロールし、自分だけの「特製アドインUI」を作り上げる極意を伝授します。

ここをクリアすれば、AutoCAD VBAのオブジェクトモデルの核心を掴んだも同然です。さあ、一緒に深淵を覗いてみましょう!

1. なぜUIの動的カスタマイズが必要なのか?

実務でAutoCAD VBAを使うとき、こんなストレスを感じたことはありませんか?

  • 「VBAの画面(IDE)を開いて、毎回 `F5` キーを押すのが面倒……」
  • 「他の部署のメンバーにツールを配ったが、VBAマクロの起動方法(VBAUNLOAD / VBARUN)を覚えてくれない……」

ユーザーにとって、コマンドを覚えるのは苦痛です。だからこそ、「ボタン一つ」「メニューをクリックするだけ」で動く専用のUIを用意してあげる必要があります。
それを手動でカスタマイズ(CUIXファイルの編集)するのは骨が折れますが、VBAを使えばAutoCADの起動時に自動でぴったりのメニューとボタンを生み出すことが可能です。

2. AutoCAD UIの構造(メニューグループの概念)

AutoCADの画面を構成するボタンやメニューは、背後で「CUI(カスタマイズ)ファイル」によって管理されています。
VBAからこれらを操作する場合、以下のオブジェクト階層を理解する必要があります。

AcadApplication (AutoCAD全体)
┗ MenuGroups (メニューグループのコレクション)
┗ AcadMenuGroup (例: “ACAD” や 独自のグループ)
├─ AcadMenus (プルダウンメニューの集まり)
└─ AcadToolbars (ツールバーの集まり)
┗ AcadToolbarItem (ツールバーのボタン)

ここで最も重要なのが、「どの MenuGroup に対して操作するか」という点です。
通常、AutoCADの標準メニューグループは `ACAD` ですが、自作のボタンやメニューを追加する場合は、競合や破損を防ぐために独自のメニューグループを読み込ませるか、メインのカスタムCUIグループに対して操作を行います。

今回は、安全かつスマートに動作する「メインCUIへの動的追加・削除」のパターンを見ていきましょう。

3. 【実践】メニューとツールバーを自動生成するVBAコード

以下のコードは、VBAの実行によって、
1. AutoCADの上部メニューバーに「業務支援」というカスタムメニューを追加する
2. 専用の「MyToolBar」というツールバーを作成し、アイコンボタンを配置する
3. ボタンを押すと特定のVBAマクロが走るようにリンクさせる

という一連の処理を行います。VBAの標準モジュールに貼り付けて実行してみてください。

Option Explicit

‘ メニューとツールバーの作成メインプロシージャ
Public Sub CreateCustomUI()
On Error GoTo ErrorHandler

Dim currMenuGroup As AcadMenuGroup
Dim customMenu As AcadPopupMenu
Dim newMenuItem As AcadPopupMenuItem
Dim customToolbar As AcadToolbar
Dim toolbarButton As AcadToolbarItem
Dim macroString As String

‘ 1. 現在アクティブなメニューグループ(通常は最初のインデックス)を取得
‘ ※AutoCADのメインCUIに安全に追加するため、AcadApplication.MenuGroupsを使用します
If ThisDrawing.Application.MenuGroups.Count > 0 Then
Set currMenuGroup = ThisDrawing.Application.MenuGroups(0)
Else
MsgBox “有効なメニューグループが見つかりません。”, vbCritical
Exit Sub
End If

‘ ==========================================
‘ 2. プルダウンメニューの作成
‘ ==========================================
‘ メニューバーの最後に新しいポップアップメニューを追加
Set customMenu = currMenuGroup.Menus.Add(“業務支援(&M)”)

‘ マクロの実行文字列を定義 (^C^C_VBARUN “マクロ名” の形式)
macroString = “^C^C_VBARUN MyAutomatedTask ”

‘ メニュー項目を追加 (インデックス, 表示名, 実行するマクロ)
Set newMenuItem = customMenu.AddMenuItem(customMenu.Count + 1, “図面の一括整形(&C)”, macroString)

‘ メニューバーに表示させる(これを行わないとメニューバーに出てこない)
customMenu.InsertInMenuBar ThisDrawing.Application.MenuBar.Count + 1

‘ ==========================================
‘ 3. ツールバーの作成
‘ ==========================================
‘ 新しいツールバーを “MyToolBar” という名前で作成
Set customToolbar = currMenuGroup.Toolbars.Add(“MyToolBar”)

‘ ツールバーボタンを追加
‘ AddToolbarButton(インデックス, ボタン名, ツールチップ, マクロ文字列)
Set toolbarButton = customToolbar.AddToolbarButton(customToolbar.Count, “図面整形”, “選択した図形を一括整形します”, macroString)

‘ ボタンにアイコンを設定したい場合はここでアイコンファイルを割り当てます(省略可)
‘ toolbarButton.SetBitmaps “icon_small.bmp”, “icon_large.bmp”

‘ ツールバーを表示状態にする
customToolbar.Visible = True

MsgBox “カスタムメニューとツールバーの作成が完了しました!”, vbInformation, “成功”
Exit Sub

ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “異常終了”
End Sub

‘ ボタンから呼び出されるサンプルマクロ
Public Sub MyAutomatedTask()
MsgBox “カスタムボタンからVBAマクロが正常に呼び出されました!”, vbInformation
End Sub

4. 陥りやすい罠とエンジニアの知見(ここが重要!)

この動的UIカスタマイズを行う際、多くのプログラマが以下の「罠」にハマります。現場で血を流さないために、あらかじめ知っておいてください。

① メニューの「二重作成」エラー

上記のコードを2回実行すると、同じ名前のメニューが重複して作成され、AutoCADのメニューバーがカオスになります。
実務でツールを配布・自動展開する場合は、「実行前に既存の同名メニュー/ツールバーを安全に削除(クリーンアップ)する処理」を必ず前置してください。

‘ 削除のヒント(名前で探して Delete メソッドを呼ぶ)
Dim mnu As AcadPopupMenu
For Each mnu in currMenuGroup.Menus
If mnu.Name = “業務支援” Then
mnu.RemoveFromMenuBar ‘ メニューバーから外し
mnu.Delete ‘ 削除
Exit For
End If
Next

② `^C^C` のお作法をマスターする

マクロ文字列に指定している `^C^C_VBARUN …` の先頭の `^C^C` は、AutoCADのコマンドラインを強制的にキャンセル(Escキー2回分)するためのエスケープシーケンスです。
これを入れておかないと、ユーザーがコマンド実行中にボタンを押したとき、マクロが暴走してフリーズの原因になります。おまじないではなく必須の安全装置として覚えておきましょう。

③ CUIファイルの保存問題

VBAから動的に追加したUIは、AutoCADのセッションによっては終了時に保存されない、あるいはCUIXの構造と同期が取れなくなる場合があります。本格的なエンタープライズ環境のツールを作る場合は、VBA単体での動的生成だけでなく、専用の `.cuix` ファイルをあらかじめ用意し、それをAutoCADにロードさせる手法(`MenuGroups.Load`)を採用する方が堅牢なケースも多いです。用途に合わせて使い分けましょう。

おわりに

いかがでしたか?
今回はAcadMenuGroupとAcadToolbarを操り、VBAからAutoCADのUIをダイナミックに書き換える手法を解説しました。

ここをクリアすれば、あなたは単なる「マクロを書く人」から、「AutoCADアドイン・ソリューション・エンジニア」へとステップアップできます。ユーザーが喜ぶ「ワンクリックで動く魔法のボタン」を、ぜひあなたの手で形にしてみてください。

それでは、次回の極意でお会いしましょう。お疲れ様でした!

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