Worksheet_BeforeRightClickイベント
セルや行見出しや列見出しを右クリックしたときにマクロを動かしたい場合があります。セルの右クリックを検知するには、セルがある対象のシートにWorksheet_BeforeRightClickという名前のプロシージャを作っておく必要があります。
そのため、複数のシートがある場合でそれぞれのシートで右クリックを検知させたい場合は、各シートでWorksheet_BeforeRightClickプロシージャの作成が必要になります。
Worksheet_BeforeRightClickプロシージャのようにイベント関連のプロシージャは基本的にVBA画面の操作で作成します。手順は以下になります。
- VBA画面で対象シートのコードを開きます。
- 左上のプルダウンから「Worksheet」オブジェクトを選択します。このときWorksheet_SelectionChangeプロシージャが作成されますが、これは使いませんので後で削除します。
- Worksheet_BeforeRightClickイベントを選択します。
- これでWorksheet_BeforeRightClickが作成されます。先に作成されていたWorksheet_SelectionChangeプロシージャは不要なため削除します。
あとは、Worksheet_BeforeRightClickプロシージャの中で、セルの値が変わった際に行いたい処理を書いていくことになります。必要であれば引数のセルの値が変わった対象であるRangeオブジェクトを使います。
イベント発生タイミング
Worksheet_BeforeRightClickプロシージャが呼ばれるのはセルや列見出しや行見出しを右クリックした直後になります。右クリックを押すとコンテキストメニューが表示されますが、コンテキストメニューはWorksheet_BeforeRightClickプロシージャの処理が終わったあとに表示されます。
セルや列見出しや行見出しの他にはシートタブも右クリックできますが、シートタブの右クリックではWorksheet_BeforeRightClickイベント発生しません。
構文
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
Target | 右クリックした際のセルや列範囲や行範囲のRangeオブジェクトが設定されます。
結合セルや複数セルを右クリックした場合はそのセル範囲のRangeオブジェクトが設定されます。 |
Cancel | プロシージャを終了後にコンテキストメニューを表示する(False)かしない(True)かを設定します。
右クリックイベントが発生した際にはFalseが設定された状態で渡されます。 初期値のFalseのままだとプロシージャの処理終了後にコンテキストメニューが表示されますが、Trueに変更した場合はコンテキストメニューは表示されません。 |
右クリックしたセルを特定する
右クリックを行ったセルを特定するには、Worksheet_BeforeRightClickプロシージャの第一引数のRangeオブジェクトを利用します。プロシージャが自動生成されたときに「Target」という名前が付いています。
Rangeオブジェクトのため、セル操作で利用するメソッドやプロパティを利用できます。
例えば右クリックしたセルの座標を取得するには以下のようにAddressプロパティを利用します。
1 2 3 |
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) Debug.Print Target.Address(False, False) End Sub |
このように第一引数のRangeオブジェクトを使ってセル操作を行うことが可能です。
複数のシートで右クリックを検知させたい場合
最初に少し書きましたが、ブックに複数のシートがあり、それぞれのシートのセル右クリックを検知させたい場合は、各シートでWorksheet_BeforeRightClickプロシージャを作成しておく必要があります。
複数のシートのそれぞれで作成したWorksheet_BeforeRightClickプロシージャからは、同じ処理をさせたい場合が多いと思われます。
その場合は標準モジュールを作成して同じ処理をさせたい関数を用意しておき、各シートのWorksheet_BeforeRightClickプロシージャからはその関数を呼び出すようにしておくとよいです。
なお、標準モジュールの追加は、下の画像の左上にある「VBAProject (Book1.xlsm)」を右クリックして、挿入→標準モジュール、を選択すると追加されます。
標準モジュールに書く関数の例です。ここでは、呼び出し元から渡されたRangeオブジェクト(引数r)を元に、シート名とセル座標を出力する処理としています。
1 2 3 4 5 6 7 8 9 |
Sub GetCellAddress(r As Range) Dim sht As Worksheet '// シート '// 引数セルのシート(Worksheetオブジェクト)を取得 Set sht = Worksheets(r.Parent.Name) '// シート名とセル座標を出力 Debug.Print sht.Name & "/" & r.Address(False, False) End Sub |
各シートのWorksheet_BeforeRightClickプロシージャから標準モジュールの関数を呼び出すようにします。右クリックされたときのセルは引数Targetのためそれをそのまま呼び出す関数に渡しています。
1 2 3 |
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) Call GetCellAddress(Target) End Sub |
あとは、Worksheet_BeforeRightClickプロシージャがある各シートで右クリックすると、イミディエイトウィンドウに以下のように出力されます。
Sheet1/A1
Sheet4/D63
Sheet3/L5