UserForm上でショートカットメニューを使う


上図のように、UserForm 上のコントロールで独自のショートカット メニューを使う方法です。ここでは、リストボックスを右クリックしたときにショートカット メニューを表示してみます。

Dim myBar As Variant    ''(1)
Private Sub ListBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, _
                                                     ByVal X As Single, ByVal Y As Single)
    If Button = 2 Then myBar.ShowPopup    ''(5)
End Sub

Private Sub UserForm_Initialize()
    Dim i As Long
    For i = 1 To 5
        ListBox1.AddItem "アイテム " & i    ''(2)
    Next i
    
    Set myBar = CommandBars.Add(Position:=msoBarPopup, Temporary:=True)    ''(3)
    With myBar
        With .Controls.Add    ''(4)
            .Caption = "先頭に移動"
            .OnAction = "UpToHead"
            .FaceId = 594
        End With
        With .Controls.Add
            .Caption = "1つ上に移動"
            .OnAction = "UpToOne"
            .FaceId = 595
        End With
        With .Controls.Add
            .Caption = "1つ下に移動"
            .BeginGroup = True
            .OnAction = "DownToOne"
            .FaceId = 596
        End With
        With .Controls.Add
            .Caption = "最後に移動"
            .OnAction = "DownToTail"
            .FaceId = 597
        End With
    End With
End Sub
  1. ショートカット メニューを格納する変数 myBar を広域変数として宣言しておきます。
  2. これは必要ありません。リスト ボックスが寂しかったのでダミーのデータを入れました。
  3. UserForm の Initialize イベントでショートカット メニューを定義しておきます。
  4. ショートカット メニューに独自のコマンドを登録する部分です。
    OnAction プロパティには、メニューがクリックされたときに実行するプロシージャの名前を設定します。
    ここで実行するプロシージャは、標準モジュールに書いてください。
    FaceId プロパティはアイコンです。BeginGroup プロパティを True にすると区切り線が表示されます。
  5. ListBox1 でマウスのボタンが押されると MouseDown イベントが発生します。もし右ボタンが押されたら、定義しておいた MyBar を表示します。