HOME > 即効テクニック > Excel VBA > セル操作関連のテクニック > 【Excel VBA】特定のセル範囲が変更されたときに処理を実行する(Intersectメソッド)

【Excel VBA】特定のセル範囲が変更されたときに処理を実行する(Intersectメソッド)|Excel VBA

セル操作関連のテクニック

【Excel VBA】特定のセル範囲が変更されたときに処理を実行する(Intersectメソッド)

Excelで「特定のセルが変更されたら○○したい」──そんなときに役立つのがVBAのIntersectメソッドです。変更された範囲と対象セルの交差をチェックして、条件に合う場合のみ処理を実行できます。
Worksheet_Changeイベントと組み合わせることで、「セルの値が変わったとき」「特定の範囲の値が変更されたとき」などの処理が可能になります。使い方を具体例で学びましょう。

Intersectメソッドとは

Intersectとは「交差する、交わる」という意味です。Intersectメソッドを使用すると、セル範囲が交差する(重なっている)範囲を取得できます。

Intersectメソッドの基本構文

Intersectメソッドの構文は次のとおりです。
引数には複数のセル範囲を指定できます。例えば「範囲A」「範囲B」の2つが重なる範囲を指定したいときは以下のように記述します。

Intersect(範囲A,範囲B)

Intersectメソッドの使用例

複数のセル範囲の重なる範囲を取得する

例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のエラー回避

重なるセル範囲がないとき、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, 監視したい範囲) を使い、特定のセル範囲が変更されたときのみ処理を実行するマクロを作成することができます。コードは、対象とするワークシートのシートモジュールに記述することに注意してください。

Changeイベントの設定方法

※シート名「Sheet1」のWorksheetのChangeイベントの設定方法

  1. コードを実行するシートを選択(今回はSheet1を選択)
  2. オブジェクトボックスで[Worksheet]を変更
  3. プロシージャボックスで[Change]を選択
  4. コードウィンドウに自動で「Private Sub Worksheet_Change 〜End Sub」が記述されるので「〜End Sub」の前にコードを追記

特定のセル範囲が変更されたときにメッセージボックスを表示する

例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は「値をコピーして渡す」という意味です。

「Excel VBA」の即効テクニック人気記事