});

Microsoft Excel VBA - メニュー/サブメニューの追加と削除を行う方法

◆概要

このページは、Excel VBA を使用して、新規のメニューバーを作成し、メニュー / サブメニューの追加と削除を行う方法について記載しています。


◆内容

VBA でメニューバーを指定するときは、CommandBars オブジェクトを使用します。この CommandBars オブジェクトはツールバーを指定するときにも使われます。

◆新しいメニューを作成する

'新規メニューバーの作成
Sub Menu_Add()
    Application.CommandBars.Add Name:="New_Bar", _
        Position:=msoBarTop, MenuBar:=True
    With Application.CommandBars("New_Bar")
        .Visible = True
        .Controls.Add Type:=msoControlPopup
        .Controls(1).Caption = "新規メニュー"
                
        With .Controls(1)
            .Controls.Add Type:=msoControlButton
            With .Controls(1)
                .Caption = "追加コマンド1"
                .OnAction = "Msg_1"
            End With

            .Controls.Add Type:=msoControlPopup
            With .Controls(2)
                .Caption = "追加コマンド2"
                .Controls.Add Type:=msoControlButton
                .Controls(1).Caption = "サブコマンド"
                .Controls(1).OnAction = "Msg_2"
            End With

        End With
        
        .Controls.Add Type:=msoControlPopup
        .Controls(2).Caption = "削除メニュー"
        
         With .Controls(2)
            .Controls.Add Type:=msoControlButton
            With .Controls(1)
                .Caption = "新規メニューの削除"
                .OnAction = "Menu_Del"
            End With

        End With
        
    End With

End Sub

'新規メニューバーの削除
Sub Menu_Del()
    Dim Ans As Byte
    Ans = MsgBox("新規メニューを削除しますか?", vbYesNo)
    If Ans = vbYes Then
        Application.CommandBars("New_Bar").Delete
    End If
End Sub

'追加コマンド 1 の処理
Sub Msg_1()
    MsgBox "追加コマンド1を処理しました。"
End Sub

'追加コマンド 2 のサブメニューの処理
Sub Msg_2()
    MsgBox "追加コマンド2のサブメニューを処理しました。"
End Sub

◆実行結果

Excel 2003の場合、標準のメニューが置き換えられる
Excel 2003の実行結果

Excel 2007の場合、アドインに追加される

Excel 2007実行結果

◆既存のメニューに新しいメニューを追加する

既存のメニューに新しいメニューを追加します。次の例は、[ファイル]メニューの右に「カスタムメニュー」を追加します。

Sub AddMenu()
    'メニューを追加する
    Dim oMyCommandBar As CommandBar
    'CommandBarPopupオブジェクトによって、メニューバー上のメニューを
    '選択すると表示されるポップアップメニューが表示される
    Dim oPopup As CommandBarPopup
    Dim oPopupCascade As CommandBarPopup
    
    'Word,PowerPoint,Accessでは、メニューバーは"Menu Bar"という名前で表される。
    'Excelの場合は、"WorkSheet Menu Bar"
    Set oMyCommandBar = CommandBars("Worksheet Menu Bar")
    'メニューバーにメニューを追加する
    With oMyCommandBar.Controls
        Set oPopup = .Add(msoControlPopup, , , 2) 'Addメソッドの4つ目の引数は、
        '"Before"と呼ばれるもので、メニューがコレクションのどこに置かれるかを
        '指定しています。
        'ここでは、2という値になっているので、新しいメニューは[ファイル]メニュー
        'の右に置かれることを意味します。
        With oPopup
            .Caption = "カスタムメニュー"
            With .Controls.Add(msoControlButton)
                .Caption = "カスタム項目1(&M)"
                .OnAction = "DisplayMessageBox"
            End With
        End With
        
        'サブメニューの追加
        Set oPopupCascade = oPopup.Controls.Add(msoControlPopup)
        With oPopupCascade
            .Caption = "サブメニュー(&C)"
            With .Controls.Add(msoControlButton)
                .Caption = "項目1(&I)"
                .OnAction = "DisplayMessageBox"
            End With
            With .Controls.Add(msoControlButton)
                .Caption = "項目2(&T)"
                .OnAction = ("DisplayMessageBox")
            End With
        End With
    End With
End Sub

Sub DisplayMessageBox()
    'カスタムメニューから呼ばれるプロシージャ
    MsgBox "カスタム項目が選択されました"
End Sub

◆実行結果

Excel 2002の実行結果

追加されたカスタムメニューを削除するには、[表示]-[ツールバー]-[ユーザー設定]で、[ワークシート メニューバー]を選択し、リセットボタンを押します。または、次のコードを実行します。

Sub RemoveMenu()
'メニューを削除する
    Dim oCmdCtl As CommandBarControl
    
    For Each oCmdCtl In CommandBars("Worksheet Menu Bar").Controls
        If oCmdCtl.Caption = "カスタムメニュー" Then
            oCmdCtl.Delete
            Exit For
        End If
    Next oCmdCtl
End Sub

◆既存のメニューに新しいメニュー項目を追加する

次の例は、[ファイル]メニューの4番目にカスタムというメニュー項目を追加します。

Sub AddMenuItem()
    '既存のメニューにメニュー項目を追加する
    
    Dim oCmdPopup As CommandBarPopup
    Dim oCmdButton As CommandBarButton
    
    'Excelの[ファイル]メニューにアクセスする
    Set oCmdPopup = CommandBars("Worksheet Menu Bar") _
                .Controls("ファイル(F)")
    
    '新しいメニュー項目を追加する
    Set oCmdButton = oCmdPopup.Controls.Add( _
                Type:=msoControlButton, before:=4)
    
    '新しいメニュー項目のプロパティ設定を行う
    With oCmdButton
        .Caption = "カスタム項目"
        .OnAction = "DisplayMessageBox"
    End With
    
End Sub
Sub DisplayMessageBox()
    'カスタムメニューから呼ばれるプロシージャ
    MsgBox "カスタム項目が選択されました"
End Sub

◆実行結果

Excel 2002の実行結果

追加されたカスタムメニューを削除するには、[表示]-[ツールバー]-[ユーザー設定]で、[ワークシート メニューバー]を選択し、リセットボタンを押します。もしくは、次のコードを実行します。

Sub RemoveMenuItem()
'既存のメニューからメニュー項目を削除する
    Dim oCmdPopup As CommandBarPopup
    Dim oCmdCtl As CommandBarControl
    Set oCmdPopup = CommandBars("Worksheet Menu Bar").Controls("ファイル(F)")
    'ファイルメニューのCommandBarControlsコレクションを解析するループを作成する
    For Each oCmdCtl In oCmdPopup.Controls
        If oCmdCtl.Caption = "カスタム項目" Then
            oCmdCtl.Delete
            Exit For
        End If
    Next oCmdCtl
End Sub

◆コマンドバーにドロップダウンリストを作成する

次のコードを実行した後、適当なツールバー上でマウスの右ボタンをクリックして、ショートカットメニューから[コマンドバー]を選択し、新しく作成されたツールバーを確認してください。

Sub AddComboToolbar()
'ドロップダウンリストボックスを作成する
    Dim oMyCommandBar As CommandBar
    Dim oComboBox As CommandBarComboBox
    Dim oDropDown As CommandBarComboBox
    Set oMyCommandBar = Application.CommandBars.Add("コマンドバー")
    With oMyCommandBar.Controls
        'ドロップダウンコンボボックスを追加
        Set oComboBox = .Add(msoControlComboBox)
        With oComboBox
            .AddItem "項目2"
            .AddItem "項目1", 1
            .AddItem "項目3"
            .Caption = "コンボボックス"
            'ドロップダウンリストに最初に表示される項目を項目1に設定
            .ListIndex = 1
            .OnAction = "DisplayMessageBox"
        End With
        Set oDropDown = .Add(msoControlDropdown)
        With oDropDown
            .BeginGroup = True  '仕切り線
            .AddItem "項目1"
            .AddItem "項目2"
            .ListIndex = 1
            .Style = msoComboLabel  'ラベル付きのドロップダウンボックス
            .Caption = "ラベル"
            .OnAction = "DisplayMessageBox"
        End With
    End With
    
End Sub

◆実行結果

Excel 2002の実行結果

追加されたコマンドバーから、「ラベル」という項目をを削除するには、次のコードを実行します。

Sub RemoveToolbarItem()
'ツールバーの項目を削除する
    Dim oMyCommandBar As CommandBar
    Dim oCmdCtl As CommandBarControl
    Dim sToolbarItem As String
    
    sToolbarItem = "ラベル"
    Set oMyCommandBar = CommandBars("コマンドバー")
    With oMyCommandBar
        For Each oCmdCtl In .Controls
            If oCmdCtl.Caption = sToolbarItem Then
                oCmdCtl.Delete
            End If
        Next oCmdCtl
    End With
End Sub

◆実行結果

Excel 2002の実行結果

追加されたコマンドバー自体を削除するには、[表示]-[ツールバー]-[ユーザー設定]で、[ツールバー]タブを選択し、リストにある「コマンドバー」を選択し[削除]ボタンを押します。もしくは、次のコードを実行します。

Sub RemoveToolbar()
'ツールバー[コマンドバー]を削除する
    Dim oMYCmdBar As CommandBar
    Dim oCmdBar As CommandBar
    
    For Each oCmdBar In Application.CommandBars
        If oCmdBar.Name = "コマンドバー" Then
            Set oMYCmdBar = oCmdBar
            Exit For
        End If
    Next oCmdBar
    If Not oMYCmdBar Is Nothing Then oMYCmdBar.Delete
    
End Sub



▼ページトップへ