セルをダブルクリックした際にマクロを実行する方法を解説します。
Worksheet_BeforeDoubleClickプロシージャを使用します。
基本構文
以下のコードをマクロを設定したいシートモジュールに記載します。
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) ' ここに実行したい処理を記述 End Sub
プロシージャ名を変更することはできません。
第1行は変更せずすべてこのままのコードを記述してください。
引数TargetにはダブルクリックされたセルがSetされます。
引数Cancelは設定用の引数で、Trueを代入することで、
ダブルクリックしてもそのセルの入力状態に移行しなくなります。
このコードはシートモジュール上部の選択肢から呼び出すことが出来ます。


イベントプロシージャの構文はWEB検索で探したりする必要はなく、
使うときにこの選択肢から選べばよいことを覚えておきましょう。
サンプルコードと解説
特定のセルにダブルクリックマクロを設定する
A1セル、C3セルなど単独のセルをダブルクリックした際にマクロを実行するには、
対象のシートモジュールに以下のコードを記載します。
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Select Case Target.Address(False, False) Case "A1" MsgBox "A1セルの値は" & Target.Value & "です。" Cancel = True Case "B2", "C3" MsgBox "B2セルまたはC3セルがダブルクリックされました。" Cancel = True End Select End Sub
対象シートのどのセルをダブルクリックしてもこのプロシージャが実行されますので、
上記のように「Target.Address」を使用して処理を分岐します。
この時、Target.AddressではなくTarget.Address(False, False)と書くことで、
分岐用のアドレスを「$A$1」ではなく「A1」で書けるようになります。
こちらの方が読みやすいため、基本はこの記述を使用しましょう。
第2引数Cancelは設定用の引数で、これをTrueにすることで、
ダブルクリック後のセル編集モード移行をキャンセルできます。
上記の通りこの代入は分岐内に記載することが出来るため、
編集モードに移行したくないセルにだけこの設定を行ってください。
なお、結合セルをダブルクリックした場合は、
Targetには結合セル全体のセル範囲がSetされます。
例えばA1:C3の結合セルをダブルクリックした際にマクロを実行する場合は、
以下のように処理を分岐して下さい。
Select Case Target.Address(False, False) Case "A1:C3"
範囲内のセルにダブルクリックマクロを設定する
特定のセル範囲内のセルにまとめてダブルクリックマクロを設定したい場合は、
対象のシートモジュールに以下のコードを記載します。
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) ' B2:E6内のセルをダブルクリックした際にマクロを実行 If Not Intersect(Target, Range("B2:E6")) Is Nothing Then MsgBox "セルの値は" & Target.Value & "です。" Cancel = True End If End Sub
Intersectメソッドを使用すると複数のセル範囲の共通部分を取得できます。
これを活用することで、特定のセルがある範囲かを以下のコードで判定できます。
If Not Intersect(特定のセル, 対象セル範囲) Is Nothing Then
特定範囲内のセルにまとめてマクロを実装したい場合は、
このメソッドを活用してください。
データ内のセルをダブルクリックした際にマクロを実行する
例えばこのような表データにダブルクリックマクロを設定する場合は、
対象のシートモジュールに以下のコードを記載します。

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Dim R As Long: R = Target.Row Dim C As Long: C = Target.Column ' データ内のセルを対象 If R >= 4 Then ' 各列ごとの処理 Select Case C ' 品物をダブルクリックした際に価格を表示 Case 2 MsgBox Cells(R, 2) & "の価格は" & Cells(R, 3) & "円です。" Cancel = True End Select End If End Sub
ダブルクリックされたセルがSetされているTargetはRangeオブジェクトのため、
.Rowで行番号、.Columnで列番号を取得できます。
これを利用してIfやSelect Caseステートメントで分岐することで、
データ内のセルをダブルクリックした際の処理を整理して記述することが出来ます。
Target.Row、Target.Columnは何度も書くことが多いため、
上記サンプルのようにRやCなど変数に入れてしまいましょう。
処理を全シート分まとめて書きたい場合 - Workbook_SheetBeforeDoubleClick
今回の処理をひとつのプロシージャにまとめて書きたい場合は、
ThisworkbookモジュールのWorkbook_SheetBeforeDoubleClickイベント
を使用することも可能です。
以下のコードをThisWorkbookに記載することで、
「複数シートのA1セル」に一括でマクロを設定することが可能です。
Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) Select Case Sh.Name Case "Sheet1", "Sheet2", "Sheet3" Select Case Target.Address(False, False) Case "A1" MsgBox "A1セルの値は" & Target.Value & "です。" Cancel = True End Select End Select End Sub
引数「Sh」で選択セルが変更されたシートも受け取れるため、
サンプルのようにシート名をSelect Case で分岐することで、
ブック内の全シートのイベントをここにまとめて書くことが可能です。
- 同じ処理であれば1回書くだけで済む
- 全シートの処理の違いが一目瞭然になる
などのメリットがありますが、代わりにシートモジュールを見るだけではそのシートのイベントを一覧できなくなるデメリットもあります。
状況に応じて使い分けてください。