7.9 新しいメニューを追加する
右図のように、メニューバーに自分だけの新しいメニューを作りたいことはありませんか?組み込んだマクロを、メニューバーから実行できたら超便利ですよね。それに、アドインなどを組み込んだときはこのようにして呼び出すことも多いでしょう。

というわけで、メニューバーに自分だけのメニューを追加する方法です。
メニューを作る
まずは、新しいメニューを追加する方法です。上の図でいうと「メニュー1」が該当します。

メニューを追加するときは、コマンドバーオブジェクトというオブジェクトが必要で、それをApplication.CommandBars("Worksheet Menu Bar")で作成し、コマンドバー型の変数cbrCmdへセットしています。

メニュー作成の準備(コマンドバーオブジェクトの作成)が整ったら、次はメニューの追加です。コマンドバーオブジェクトのControls.Add()メソッドでメニューの追加です。そのときに、追加するものが何者かを引数で指定しますが、メニューのときはType:=msoControlPopupを指定しましょう。なお、追加した結果はオブジェクトとしてcbcMenuにセットしておきます。

そして、最後にメニューの表題を設定(cbcMenu.Captionへ設定)すれば、設定した表題でメニューが表示されます。

Sub prcAddNewMenu()

    On Error GoTo ErrHand

    Dim cbrCmd As CommandBar
    Dim cbcMenu As CommandBarControl

    'メニュー用のオブジェクトを作ります
    Set cbrCmd = Application.CommandBars("Worksheet Menu Bar")

    '作成済みであればいったん削除します
    '存在しないとエラーが出ますが、On Error…で回避しています
    cbrCmd.Controls("メニュー1").Delete

    'メニューを追加し、表題を設定します
    Set cbcMenu = cbrCmd.Controls.Add(Type:=msoControlPopup)
    cbcMenu.Caption = "メニュー1"

    Set cbrCmd = Nothing
    Set cbcMenu = Nothing

    Exit Sub

ErrHand:

    If Err.Number = 5 Then
       Resume Next
    Else
       MsgBox Err.Description
    End If

End Sub
 ※これはエクセルマクロです
メニューの中にボタンを作る
次に、作ったメニューの中にボタンを追加する方法です。最初の図でいうと「ボタン1」や「ボタン2」が該当します。

メニューの中にボタンを追加するときは、CommandBarControlオブジェクト(cbcMenu)のControls.Addを実行します。そのときに、追加するものが何者かを引数で指定しますが、メニューのときはType:=msoControlButtonを指定しましょう

ボタンを追加したら、ボタンの表題(Caption)を設定し、そのボタンがクリックされたときに実行するプロシジャを設定(OnAction)するだけです。

以下の例では、ボタン1とボタン2の2つのボタンを追加しています。

Sub prcAddNewMenu()

    On Error GoTo ErrHand

    Dim cbrCmd As CommandBar
    Dim cbcMenu As CommandBarControl

    'メニュー用のオブジェクトを作ります
    Set cbrCmd = Application.CommandBars("Worksheet Menu Bar")

    '作成済みであればいったん削除します
    '存在しないとエラーが出ますが、On Error…で回避しています
    cbrCmd.Controls("メニュー1").Delete

    'メニューを追加し、表題を設定します
    Set cbcMenu = cbrCmd.Controls.Add(Type:=msoControlPopup)
    cbcMenu.Caption = "メニュー1"

    'メニューの中にボタン「ボタン1」を追加します
    With cbcMenu.Controls.Add(Type:=msoControlButton)
        .Caption = "ボタン1"
        .OnAction = "prcButton1"
    End With

    'メニューの中にボタン「ボタン2」を追加します
    With cbcMenu.Controls.Add(Type:=msoControlButton)
        .Caption = "ボタン2"
        .OnAction = "prcButton2"
    End With

    Set cbrCmd = Nothing
    Set cbcMenu = Nothing

    Exit Sub

ErrHand:

    If Err.Number = 5 Then
       Resume Next
    Else
       MsgBox Err.Description
    End If

End Sub
 ※これはエクセルマクロです
メニューの中にメニューを作る
今度は、作ったメニューの中にさらにメニューを追加する方法です。最初の図でいうと「メニュー2」が該当します。

メニューの中にメニューを追加するときは、親となるメニューオブジェクトを使いControls.Add(Type:=msoControlPopup)で子メニューオブジェクト(例ではcbcMenu2)を作ります。子メニューの中へ、ボタンやメニューを作るときは、作ったオブジェクトを使いControls.Add()で目的の物を追加すればOKです。

以下の例では、メニュー2とその中へボタン2-1、それとメニューへボタン3を追加しています。

Sub prcAddNewMenu()

    On Error GoTo ErrHand

    Dim cbrCmd As CommandBar
    Dim cbcMenu As CommandBarControl
    Dim cbcMenu2 As CommandBarControl

    'メニュー用のオブジェクトを作ります
    Set cbrCmd = Application.CommandBars("Worksheet Menu Bar")

    '作成済みであればいったん削除します
    '存在しないとエラーが出ますが、On Error…で回避しています
    cbrCmd.Controls("メニュー1").Delete

    'メニューを追加し、表題を設定します
    Set cbcMenu = cbrCmd.Controls.Add(Type:=msoControlPopup)
    cbcMenu.Caption = "メニュー1"

    'メニューの中にボタン「ボタン1」を追加します
    With cbcMenu.Controls.Add(Type:=msoControlButton)
        .Caption = "ボタン1"
        .OnAction = "prcButton1"
    End With

    'メニューの中にボタン「ボタン2」を追加します
    With cbcMenu.Controls.Add(Type:=msoControlButton)
        .Caption = "ボタン2"
        .OnAction = "prcButton2"
    End With

    'メニューの中にメニュー「メニュー2」を追加します
    Set cbcMenu2 = cbcMenu.Controls.Add(Type:=msoControlPopup)
    cbcMenu2.Caption = "メニュー2"

    'メニュー2の中にボタン「ボタン2-1」を追加します
        With cbcMenu2.Controls.Add(Type:=msoControlButton)
            .Caption = "ボタン2-1"
            .OnAction = "prcButton21"
        End With

    'メニューの中にボタン「ボタン3」を追加します
    With cbcMenu.Controls.Add(Type:=msoControlButton)
        .Caption = "ボタン3"
        .OnAction = "prcMenu3"
    End With

    Set cbrCmd = Nothing
    Set cbcMenu = Nothing
    Set cbcMenu2 = Nothing

    Exit Sub

ErrHand:

    If Err.Number = 5 Then
       Resume Next
    Else
       MsgBox Err.Description
    End If

End Sub
 ※これはエクセルマクロです
Copyright(C) 1999-2006 結城圭介。 All rights reserved