VBA(Visual Basic for Applications)でメニューをカスタマイズする方法について、何度かご紹介しています。
これまでご紹介しているのは、メニューの直下にコマンドを表示する方法でしたが、カスタマイズしたメニューにサブメニューを表示させ、その下にコマンドを表示することもできます。
サブメニューは以下のようなコードで表示できます。
Sub CustomizeMenuBar()
Dim objCB As CommandBar
Dim objCBCtrl As CommandBarControl
Set objCB = Application.CommandBars("Worksheet Menu Bar")
On Error Resume Next
objCB.Controls("テスト_メニューの追加(&M)").Delete
On Error GoTo 0
Set objCBCtrl = objCB.Controls.Add(Type:=msoControlPopup, Temporary:=True)
objCBCtrl.Caption = "テスト_メニューの追加(&M)"
With objCBCtrl
.Controls.Add Type:=msoControlButton
With .Controls(1)
.Caption = "テスト_コマンドA(&A)"
.OnAction = "TestCmdA"
End With
.Controls.Add Type:=msoControlButton
With .Controls(2)
.Caption = "テスト_コマンドB(&B)"
.OnAction = "TestCmdB"
End With
.Controls.Add Type:=msoControlPopup
With .Controls(3)
.Caption = "サブメニュー1(&1)"
.Controls.Add Type:=msoControlButton
With .Controls(1)
.Caption = "テスト_コマンドC(&C)"
.OnAction = "TestCmdC"
End With
.Controls.Add Type:=msoControlButton
With .Controls(2)
.Caption = "テスト_コマンドD(&D)"
.OnAction = "TestCmdD"
End With
End With
.Controls.Add Type:=msoControlPopup
With .Controls(4)
.Caption = "サブメニュー2(&2)"
.Controls.Add Type:=msoControlButton
With .Controls(1)
.Caption = "テスト_コマンドE(&E)"
.OnAction = "TestCmdE"
End With
.Controls.Add Type:=msoControlButton
With .Controls(2)
.Caption = "テスト_コマンドF(&F)"
.OnAction = "TestCmdF"
End With
End With
End With
上記のコードを実行すると、下図のようにサブメニューのある状態のメニューが作成されます。
メニューの直下にコマンドを表示する部分も含まれているので、コードが長くなっちゃってますが、サブメニューの下にコマンドを表示させているのは、
「.Controls.Add Type:=msoControlPopup
With .Controls(3)
.Caption = "サブメニュー1(&1)"
.Controls.Add Type:=msoControlButton
With .Controls(1)
.Caption = "テスト_コマンドC(&C)"
.OnAction = "TestCmdC"
End With
.Controls.Add Type:=msoControlButton
With .Controls(2)
.Caption = "テスト_コマンドD(&D)"
.OnAction = "TestCmdD"
End With
End With」
といった箇所です。
一番のポイントは
「Type:=msoControlPopup」
と、指定することです。
▼サンプルファイル(002982.xls 45KByte)ダウンロード
サンプルファイルの標準モジュールには上記のコードの他に、[テスト_コマンドA]〜[テスト_コマンドF]から呼ばれるダミーのマクロ、カスタマイズしたメニューバーを元に戻すResetMenuBarマクロが記述してあります。
また、ブックがアクティブなときだけメニューをカスタマイズするため、Workbook_ActivateイベントプロシージャからCustomizeMenuBarマクロを呼び、Workbook_DeactivateイベントプロシージャからResetMenuBarマクロを呼んでカスタマイズしたメニューを初期化しています。
VBAに慣れていなくて、このサンプルファイルをいきなり見てもよくわからないという方には、以下のネタを先にご覧いただくことをおすすめします。
- Newer:アニメーションの設定作業ウィンドウが使えない
- Older:保存するたびにファイルサイズが大きくなる−高速保存
Home » エクセルマクロ・Excel VBAの使い方 » Applicationオブジェクト » カスタマイズしたメニューでサブメニューを表示