Excel VBAのメジャーな実行方法としてボタンクリックによるイベント処理が挙げられますが、特定のセルに入力された値を使って処理を実行したい場合には、セルへ値を入力すると即座に処理が実行される Worksheet_Change イベントと Intersect メソッドの組み合わせを利用するとボタンクリックの手間が省けます。
コード
セルA1に値を入力すると、メッセージボックスが表示されるサンプルです。
実行したいワークシート(今回のサンプルはSheet1)のモジュール内に以下を記述します。
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A1")) Is Nothing Then
MsgBox "A1に" & Range("A1").Value & "が入力されました"
End If
End Sub
実行結果
セルA1に値を入力するとメッセージボックスが表示されます。
解説
Worksheet_Changeイベント
ワークシートのセルが変更されたときに発生するイベントで、変更のあったセルの Range オブジェクトが引数 Target に渡されます。
Intersectメソッド
複数のセル範囲から共通のセル範囲を Range オブジェクトで返します。共通のセル範囲が無ければ Nothing となります。
サンプルコード1行目の Worksheet_Change(ByVal Target As Range)
では、変更のあったセルの Range オブジェクトが引数 Target に渡されます。
2行目の Intersect(Target, Range("A1"))
では、Target と Range("A1") のセル範囲から共通のセル範囲を Range オブジェクトで返します。Not~~Is Nothing で二重否定していますので、共通のセルが存在すれば(セルA1が変更されれば) true となり、If文が実行されます。
注意点
セルを入力状態にして ENTER を押すだけで、セルの値を変更しなくても処理が実行されてしまいます。値が変わったかどうかではなく、値が入力されたかどうかを判定しています。
また、セルが再計算時に変更されても、Worksheet_Change イベントは発生しません。
Microsoft の公式ドキュメントには、
セルが再計算時に変更されると、このイベントは発生しません。
Microsoft Docs, Worksheet.Change イベント (Excel)
と書かれています。例えば、セルA1に「=B1」と入力した場合を考えてみます。
セルB1の値に応じてセルA1の値は再計算されるのですが、この場合は Worksheet_Change イベントは発生しません。
再計算の場合、インベントは発生しません。