【Excel VBA】特定のセル範囲が変更されたときに処理を実行する(Intersectメソッド)|Excel VBA |
Excelで「特定のセルが変更されたら○○したい」──そんなときに役立つのがVBAのIntersectメソッドです。変更された範囲と対象セルの交差をチェックして、条件に合う場合のみ処理を実行できます。
Worksheet_Changeイベントと組み合わせることで、「セルの値が変わったとき」「特定の範囲の値が変更されたとき」などの処理が可能になります。使い方を具体例で学びましょう。
Intersectとは「交差する、交わる」という意味です。Intersectメソッドを使用すると、セル範囲が交差する(重なっている)範囲を取得できます。
Intersectメソッドの構文は次のとおりです。
引数には複数のセル範囲を指定できます。例えば「範囲A」「範囲B」の2つが重なる範囲を指定したいときは以下のように記述します。
Intersect(範囲A,範囲B)
例1:B2:C5の範囲とC3:D6の範囲が重なっている部分をメッセージボックスで表示します。
Sub Intersect1()
Dim Rng1 As Range, Rng2 As Range
Dim Target As Range
Set Rng1 = Range("B2:C5")
Set Rng2 = Range("C3:D6")
Set Target = Intersect(Rng1, Rng2)
MsgBox "重なっている範囲は " & Target.Address & " です"
End Sub
この例では、「B2:C5」(※図の赤い枠部分)と「C3:D6」(※図の青い枠部分)の2つの範囲を指定しているため、両方に含まれる共通部分である「C3:C5」が取得されます。その結果、メッセージボックスには「重なっている範囲は $C$3:$C$5 です」と表示されます。

重なるセル範囲がないとき、IntersectメソッドはNothingを返します。
重なるセル範囲がないときに例1のコードを実行すると、「オブジェクト変数または Withブロック変数が設定されていません。」の実行時エラーが発生してしまいます。
範囲が重ならない可能性がある場合は、以下の例2のように戻り値がNothingかどうか判定する記述を加えたほうがよいでしょう。
例2:B2:C5の範囲とC3:D6の範囲が重なっている範囲をメッセージボックスで表示します。
Sub Intersect2()
Dim Rng1 As Range, Rng2 As Range
Dim Target As Range
Set Rng1 = Range("B2:C5")
Set Rng2 = Range("C3:D6")
Set Target = Intersect(Rng1, Rng2)
If Not Target Is Nothing Then '変数TargetがNothingでないなら =Targetが存在するなら
MsgBox "重なっている範囲は " & Target.Address & " です"
Else
MsgBox "重なっている範囲はありません。"
End If
End Sub
例1や例2のコードは、VBAを手動実行することによってメッセージボックスが表示されましたが、選択が変わった直後に自動でメッセージボックスを表示することもできます。
WorksheetのChangeイベントを使うと、引数 Target には「変更されたセル(1つまたは複数)」が自動的に渡されます。そこで Intersect(Target, 監視したい範囲) を使い、特定のセル範囲が変更されたときのみ処理を実行するマクロを作成することができます。コードは、対象とするワークシートのシートモジュールに記述することに注意してください。
※シート名「Sheet1」のWorksheetのChangeイベントの設定方法

例3:値を変更したセルがセルA2:B5の範囲に含まれる場合にのみ、メッセージボックスを表示します。 コードは、対象とするワークシートのシートモジュールに記述してください。
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("A2:B5")) Is Nothing Then
Exit Sub
Else
MsgBox "セルの値が変更されました"
End If
End Sub
※ByValは「値をコピーして渡す」という意味です。