選択セルの変更時にマクロを自動実行する方法を紹介します。
Worksheet_SelectionChangeプロシージャを使用します。
また、全シートのコードを一ヶ所に書きたい場合は、
Workbook_SheetSelectionChangeプロシージャを使用する方法もあります。
基本構文
以下のコードをマクロを設定したいシートモジュールに記載します。
Private Sub Worksheet_SelectionChange(ByVal Target As Range) ' ここに実行したい処理を記述 End Sub
引数Targetには選択されたセルまたはセル範囲がSetされます。
サンプルコード
' 10行目より下を選択した際にメッセージを出す Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Row >= 10 Then MsgBox "10行目以下が選択されました。" End If End Sub
' 選択セルごとに特定のマクロを実行する Private Sub Worksheet_SelectionChange(ByVal Target As Range) Select Case Target.Address(False, False) Case "A1" MsgBox "A1セルが選択されました。" Case "B2", "C3" MsgBox "B2セルまたはC3セルが選択されました。" End Select End Sub
' 特定のセルを含む範囲が選択された際にマクロを実行する Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Not Intersect(Target, Range("C1")) Is Nothing Then MsgBox "C1セルを含む範囲が選択されました。" End If End Sub
' 選択セルを変更する場合は注意 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Application.EnableEvents = False ' ←これを書かないと再帰する ' 10行目より下が選択された場合は10行目を選択する If Target.Row >= 10 Then Cells(10, Target.Column).Select End If Application.EnableEvents = True End Sub
解説
選択セルの変更時にマクロを自動実行するには、
Worksheet_SelectionChangeプロシージャを使用します。
選択されたセル・セル範囲がTargetにSetされていますので、
その行・列番号やアドレスを処理の分岐に使用することが出来ます。
セルアドレスは「.Address」ではなく「.Address(False, False)」を使用すると、
サンプルのように「$A$1」ではなく「A1」を条件に使用できます。
基本はこの方が読みやすいため、こちらを活用してください。
注意点として、このプロシージャでSelectなどを利用し選択セルを変更すると、
再びSelectionChangeが呼び出されてしまいます。
下手をすると無限にSelectionChangeが呼ばれてしまいますので、
選択セルを変更する処理をこのプロシージャに記載する場合は、
EnableEventsをFalseにしてから処理を実行してください。
なお、Worksheet_SelectionChangeを含めたイベントプロシージャは、
記述するシートモジュールの上部選択肢から選ぶことが出来ます。


これを選択すると、↓の状態で空のイベントプロシージャが挿入されます。
Private Sub Worksheet_SelectionChange(ByVal Target As Range) End Sub
というか、このSelectionChangeはWorksheetの第1イベントのようで、
Worksheetを選択した時点で既に挿入されているようですね。
ちなみにこのイベントは「アクティブシートの変更時」には発火しません。
また、「同じセル範囲を選択したままアクティブセルを変更」した場合もイベントは発火しません。
あくまでSelectionが変更された場合のイベントということのようです。
処理を全シート分まとめて書きたい場合 - Workbook_SheetSelectionChange
今回の処理をひとつのプロシージャにまとめて書きたい場合は、
ThisworkbookモジュールのWorkbook_SheetSelectionChangeイベント
を使用することも可能です。
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) Select Case Sh.Name Case "Sheet1", "Sheet2" If Target.Row >= 10 Then MsgBox "10行目以下が選択されました。" End If End Select End Sub
引数「Sh」で選択セルが変更されたシートも受け取れるプロシージャで、
サンプルのようにシート名をSelect Case で分岐することで、
ブック内の全シートのイベントをここにまとめて書くことが可能です。
ただしWorkbook_SheetSelectionChangeに処理を書いてしまうと、
シートモジュールでそのシートの全イベントを見ることが出来なくなります。
状況に応じて使い分けてください。