こんにちは!AutoCADの自動化の世界へようこそ。
マクロの記録ボタンを押すだけの日常から抜け出し、いよいよ「自分の手でAutoCADを完全にコントロールしたい」と願うあなたへ。
今回は、AutoCAD VBAの真骨頂とも言える「メニューバーの動的ジャック」を解説します。
通常、AutoCADで独自のメニューを追加しようとすると、CUIファイル(カスタマイズファイル)をいじったり、ワークスペースの設定を変更したりと、配布する側も受け取る側も面倒な手順を踏まなければなりません。
しかし、今回紹介する手法を使えば、VBAのコードを1発走らせるだけで、AutoCADの標準メニューの隣に、あなた専用のカスタムメニューをピタッと生成することができます。
「CUIの呪縛」から解放され、ツール配布のハードルを劇的に下げるプロの技術を、一緒に紐解いていきましょう。ここをクリアすれば、あなたのVBAスキルは確実に一段上のステージに到達しますよ!
—
1. なぜ「メニューバーの動的追加」なのか?
実務の現場でVBAツールを他のメンバーに配るとき、こんな悩みを持ったことはありませんか?
- 「あの人、CUIファイルの読み込み方が分からないって言ってる……」
- 「AutoCADのバージョンが変わると、メニューの配置がリセットされて消えちゃう」
- 「ツールをバージョンアップするたびに、UIの設定をやり直させるのは申し訳ない」
これらをすべて解決するのが、「起動時にプログラム側でUIを構築する(動的追加)」というアプローチです。
AutoCADの頭脳である `AcadApplication` と、図面の枠組みである `AcadDocument` の関係性を正しく理解すれば、UIの自動制御など朝飯前です。
さあ、心してコードを見ていきましょう。
—
2. 実装コード:メニューバーを自在に操る
以下のコードを、VBAの標準モジュールにそのまま貼り付けてみてください。
今回は「業務効率化」という親メニューの中に、「図面一括パージ」「座標リスト出力」という2つの自作マクロ(仮)を紐づける例です。
Option Explicit
‘ =================================================================
‘ 概要: AutoCADのメニューバーにカスタムメニューを動的に追加する
‘ 著者: チーフアーキテクト
‘ =================================================================
Public Sub CreateCustomMenu()
On Error GoTo ErrorHandler
Dim currMenuBar As AcadMenuBar
Dim customMenu As AcadPopupMenu
Dim subMenuItem1 As AcadPopupMenuItem
Dim subMenuItem2 As AcadPopupMenuItem
Dim menuName As String
menuName = “業務効率化ツール”
‘ 1. すでに同じ名前のメニューが存在する場合は、二重作成を防ぐために削除する
Call RemoveCustomMenu(menuName)
‘ 2. AutoCADのメインアプリケーションからメニューバーを取得
Set currMenuBar = ThisDrawing.Application.MenuBar
‘ 3. 新規ポップアップメニューをメニューバーの最後尾に追加
‘ ※ MenuBar.Count を指定することで、既存メニューの右端(ヘルプの左側など)に挿入されます
Set customMenu = currMenuBar.Add(menuName)
‘ 4. メニュー項目を追加する (AddMenuItemの引数: 順番, 表示名, 実行するマクロ文字列)
‘ 第3引数のマクロ構文: ^C^C_-vbarun “マクロ名” と記述するのがAutoCADのお作法です
Dim macro1 As String
macro1 = Chr(3) & Chr(3) & “_-vbarun BatchPurge” & vbCr
Set subMenuItem1 = customMenu.AddMenuItem(customMenu.Count + 1, “図面を一括パージする”, macro1)
Dim macro2 As String
macro2 = Chr(3) & Chr(3) & “_-vbarun ExportCoordinates” & vbCr
Set subMenuItem2 = customMenu.AddMenuItem(customMenu.Count + 1, “座標リストをCSV出力”, macro2)
‘ (応用)区切り線を挟むことも可能です
‘ customMenu.AddSeparator (customMenu.Count + 1)
MsgBox “カスタムメニュー「” & menuName & “」の展開に成功しました!”, vbInformation, “セットアップ完了”
Exit Sub
ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “致命的なエラー”
End Sub
‘ =================================================================
‘ 補助ルーチン: 既存の同名メニューをクリーンアップする
‘ =================================================================
Public Sub RemoveCustomMenu(ByVal menuName As String)
Dim i As Long
Dim currMenuBar As AcadMenuBar
Set currMenuBar = ThisDrawing.Application.MenuBar
‘ メニューバーを後ろから総当たりで検索し、同名があれば削除(消去順のバグを防ぐため逆順ループ)
For i = currMenuBar.Count – 1 To 0 Step -1
If currMenuBar.Item(i).Name = menuName Then
currMenuBar.Item(i).Delete
Exit For
End If
Next i
End Sub
—
3. コードの急所:ここが分かれば初心者卒業!
上記のコードで、特に重要なポイントを3つに絞って解説します。ここをクリアすれば、AutoCADのオブジェクトモデルの機微が手に取るように分かるようになります。
① `ThisDrawing.Application.MenuBar` の重み
AutoCAD VBAでは、図面データを表す `ThisDrawing` が主役になりがちですが、メニューバーやツールバーといった「UI(ユーザーインターフェース)」は、図面ではなくアプリケーション全体(AcadApplication)の管轄です。
そのため、`ThisDrawing.Application.MenuBar` と辿る必要があります。この階層構造を意識することが、エラーを防ぐ第一歩です。
② マクロを呼び出す魔法の文字列:`Chr(3)` と `_-vbarun`
メニューをクリックしたときに、裏でVBAをスマートにキックするためのお作法がこれです。
- `Chr(3)` は、キーボードの `[Esc]` キーを2回連打する動作(`^C^C`)を意味します。実行中のコマンドを強制キャンセルし、安全な状態(コマンドプロンプトが「コマンド:」の待機状態)にしてからVBAを呼び出すために必須です。
- `_-vbarun` の頭にあるハイフン(`-`)は、ダイアログを出さずにコマンドライン経由でVBAを実行するための「コマンドライン版(トランスペアレント対応)」の指定です。これが抜けると、意図せぬダイアログが表示されてプログラムがフリーズしたように見えます。
③ なぜ逆順ループで削除するのか?(`Step -1`)
`RemoveCustomMenu` の中で、`For i = currMenuBar.Count – 1 To 0 Step -1` と後ろから数えているのにお気づきですか?
コレクション(リスト構造)からアイテムを `Delete` する際、上から順(0, 1, 2…)に消していくと、インデックスの番号が途中でズレてしまい、必ず「インデックスが有効範囲外です」というエラー(Runtime Error 9)を引き起こします。
「リストから何かを削除するときは、必ず後ろから(Step -1)」これは業務自動化エンジニアの常識であり、美学です。
—
4. 陥りやすい罠と現場の知恵
この実装を現場で展開する際、初心者が必ずハマる「罠」が一つあります。それは、「AutoCADのワークスペース(画面レイアウト)によるメニューバーの非表示問題」です。
AutoCADの新しいバージョン(特にリボンインターフェースが主流の環境)では、デフォルトで上部の「メニューバーが非表示」になっていることがあります。
メニューをプログラムからどれだけ美しく追加しても、肝心のメニューバー自体が画面上に隠れていれば、ユーザーは「あれ?追加されていない?」と混乱してしまいます。
そんなときは、以下の1行をコードの最初(`CreateCustomMenu` の冒頭)にしれっと仕込んでおきましょう。
‘ メニューバーが非表示の場合に強制的に表示させる(システム変数 MENUBAR = 1)
ThisDrawing.SetVariable “MENUBAR”, 1
システム変数 `MENUBAR` をコードから `1` に書き換えることで、ユーザーの画面設定に関わらず、確実にメニューバーを強制召喚することができます。こういう細やかな気配りが、ツール自体の信頼性をグッと引き上げます。
—
まとめ
今回は、`AcadApplication.MenuBar` を使ったカスタムメニューの動的生成について解説しました。
- CUIファイルをいじらず、VBAのコードだけでUIを完結させる。
- `Chr(3)` と `_-vbarun` を駆使して、確実にマクロを呼び出す。
- コレクション削除の鉄則である「逆順ループ(Step -1)」を守る。
- システム変数 `MENUBAR` で表示状態を担保する。
このテクニックを手に入れたあなたは、もはや「マクロを記録する人」ではありません。「AutoCADのUIを自在にデザインするシステムエンジニア」です。
ぜひ、自分の名前や社名を入れたオリジナルメニューをあなたのAutoCADにポップアップさせ、周囲をあっと言わせるツールを作ってみてください。
ここをクリアしたあなたなら、どんな自動化の壁も必ず突破できます。応援しています!
