Home » エクセルマクロ・Excel VBAの使い方 » Applicationオブジェクト » カスタマイズしたメニューでサブメニューを表示

カスタマイズしたメニューでサブメニューを表示

対象:Excel97,Excel2000,Excel2002,Excel2003

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

End Sub

上記のコードを実行すると、下図のようにサブメニューのある状態のメニューが作成されます。

サブメニューを表示

メニューの直下にコマンドを表示する部分も含まれているので、コードが長くなっちゃってますが、サブメニューの下にコマンドを表示させているのは、
「.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に慣れていなくて、このサンプルファイルをいきなり見てもよくわからないという方には、以下のネタを先にご覧いただくことをおすすめします。

[スポンサードリンク]

Home » エクセルマクロ・Excel VBAの使い方 » Applicationオブジェクト » カスタマイズしたメニューでサブメニューを表示

「Applicationオブジェクト」の記事一覧

検索


Copyright © インストラクターのネタ帳 All Rights Reserved.

.