HOME > 即効テクニック > Excel VBA > ユーザーフォーム関連のテクニック > UserFormの右クリックメニューを作る

即効テクニック

ユーザーフォーム関連のテクニック

UserFormの右クリックメニューを作る

(Excel 97/2000/2002/2003/2007)

UserFormに配置したコントロールでは、マウスの右ボタンをクリックしてもコンテキストメニューが表示されません。UserForm上でコンテキストメニューを利用するには、表示されるコンテキストメニューを自分で用意しなければなりません。

基本的な考え方は次の通りです。 ここでは、ListBoxの右クリックで独自のコンテキストメニューを表示するものとします。 1.UserFormのInitializeイベントで新しいメニュー(CommandBar)を定義する 2.ListBoxの右クリックで定義したメニューを表示する Initializeイベントで作成したメニューをListBoxのイベントで表示するのですから作成するメニューは広域変数に格納しておかなければなりません。
Dim myMenu

Private Sub UserForm_Initialize()
    Set myMenu = Application.CommandBars.Add(Position:=msoBarPopup, Temporary:=True)
    With myMenu
        With .Controls.Add
            .Caption = "日付を表示"
            .OnAction = "ShowDate"
            .FaceId = 125
        End With
        With .Controls.Add
            .Caption = "ユーザー名を表示"
            .OnAction = "ShowUserName"
            .FaceId = 607
        End With
    End With
End Sub
コンテキストメニューはCommandBarオブジェクトですが、Addメソッドで作成するとき引数Positionに定数msoBarPopupを指定します。 また、使用が終わったとき自動的に破棄されるよう引数TemporaryにTrueを指定しておきましょう。 なお、コンテキストメニューから呼び出されるプロシージャ(上記の例では「ShowDate」と「ShowUserName」)は、必ず標準モジュールに作成してください。 これで独自のコンテキストメニューを定義できました。 次に、ListBoxの右クリックでメニューを表示するようにします。 ListBoxには、マウスがクリックされたときに発生するClickイベントはありますが、そのClickイベントでは、どちらのボタンがクリックされたかは判定できません。 コンテキストメニューを表示するには、ListBoxのMouseDownイベントを使います。 MouseDownイベントはコントロール上でマウスのボタンが押し下げられたときに発生し、引数Buttonを調べることで、左右どちらのボタンが押されたかがわかります。 ListBoxのMouseDownイベントに、次のようなマクロを作成します。
Private Sub ListBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    If Button = 2 Then myMenu.ShowPopup
End Sub
マウスの右ボタンが押し下げられると、引数Buttonには2が格納されます。 コンテキストメニューを表示するときは、ShowPopupメソッドを実行します。