はてなブックマークに追加
Facebookでシェア
Google+でシェア
Twitterでシェア
1.1 新しいメニューを追加する
突然ですが、右図のようにメニューバーに自分だけの新しいメニューを作りたいことはありませんか?

というわけで、メニューバーに自分だけのメニューを追加する方法を紹介します。なお、VBAを使ってメニューバーのカスタマイズを行うときは、Microsoft Office 1x.0Object Library参照設定を行うことをオススメします。
メニューを作る
まずは、新しいメニューを追加する方法です。上の図でいうと「メニュー1」というメニューをメニューバーに追加するところまでです。

メニューを追加するときは、コマンドバーというオブジェクトを使います。例では、Application.CommandBars("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("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へ指定するだけです。なお、VBAの処理を実行したいときは、マクロのアクション「プロシージャの実行」を使います。

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

Sub prcAddNewMenu()

    On Error GoTo ErrHand

    Dim cbrCmd As CommandBar
    Dim cbcMenu As CommandBarControl

    'メニュー用のオブジェクトを作ります
    Set cbrCmd = Application.CommandBars("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 = "メニューマクロ!ボタン1"
    End With

    'メニューの中にボタン「ボタン2」を追加します
    With cbcMenu.Controls.Add(Type:=msoControlButton)
        .Caption = "ボタン2"
        .OnAction = "メニューマクロ!ボタン2"
    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("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 = "メニューマクロ!ボタン1"
    End With

    'メニューの中にボタン「ボタン2」を追加します
    With cbcMenu.Controls.Add(Type:=msoControlButton)
        .Caption = "ボタン2"
        .OnAction = "メニューマクロ!ボタン2"
    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 = "メニューマクロ!ボタン21"
        End With

    'メニューの中にボタン「ボタン3」を追加します
    With cbcMenu.Controls.Add(Type:=msoControlButton)
        .Caption = "ボタン3"
        .OnAction = "メニューマクロ!ボタン3"
    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-2015 結城圭介(Ver.3.51) All rights reserved