以下の内容はhttps://www.limecode.jp/entry/syntax/worksheet-selection-changeより取得しました。


選択セルの変更時にマクロを自動実行する - SelectionChange

選択セルの変更時にマクロを自動実行する方法を紹介します。

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を含めたイベントプロシージャは、
記述するシートモジュールの上部選択肢から選ぶことが出来ます。


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に処理を書いてしまうと、
シートモジュールでそのシートの全イベントを見ることが出来なくなります。

状況に応じて使い分けてください。




以上の内容はhttps://www.limecode.jp/entry/syntax/worksheet-selection-changeより取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14