即効テクニック |
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メソッドを実行します。