Intersect オブジェクトRangeプロパティ

Range

1. 概要

VBAのIntersectメソッドは、複数のRangeオブジェクトの重なり合う(交差する)セル範囲を取得するために使います。
複数の範囲の中で共通しているセル範囲を調べたり、その交差部分に対して処理をしたりする場合に非常に有用です。

IntersectはApplicationオブジェクトのメソッドであり、返り値は重なっている部分のRangeオブジェクト、重なっていなければNothingを返します。


2. 基本構文

Set rngIntersect = Application.Intersect(Range1, Range2, ..., RangeN)
  • Range1, Range2, …, RangeN はRangeオブジェクトを複数指定できます(2つ以上)。
  • 返り値は重なっているセル範囲のRangeオブジェクト。
  • 重なっていない場合はNothingとなるため、使用時は必ずNothingチェックが必要です。

3. Intersectの動作イメージ

  • 2つ以上の範囲が部分的にでも重なっている場合、その重なった範囲だけが返されます
  • 重なっていない場合はNothing
  • 重なりが単一セルでもRangeオブジェクトとして返される。

4. 使用例

例1:2つの範囲の交差部分を取得

vbコピーする編集するDim rng1 As Range, rng2 As Range, rngIsect As Range
Set rng1 = Range("A1:C5")
Set rng2 = Range("B3:D7")

Set rngIsect = Application.Intersect(rng1, rng2)

If Not rngIsect Is Nothing Then
    MsgBox "重なっている範囲: " & rngIsect.Address
Else
    MsgBox "重なっている範囲はありません。"
End If
  • rng1はA1:C5、rng2はB3:D7なので、重なりはB3:C5になります。

例2:Intersectで重なりがない場合

Set rng1 = Range("A1:A5")
Set rng2 = Range("B1:B5")

Set rngIsect = Application.Intersect(rng1, rng2)

If rngIsect Is Nothing Then
MsgBox "交差なし"
End If

A列とB列は隣接しますが重なっていないためNothingが返ります。


5. 複数範囲のIntersect

Intersectは複数の範囲を同時に指定可能で、全ての範囲の共通部分を返します。

Set rngIsect = Application.Intersect(Range("A1:C10"), Range("B5:D15"), Range("B8:B20"))

この場合、3つの範囲が重なる部分だけが返されます。


6. 実務での利用例

1)Worksheet_Changeイベントで編集セルが特定範囲内か判定

vbコピーする編集するPrivate Sub Worksheet_Change(ByVal Target As Range)
    Dim rngWatch As Range
    Set rngWatch = Range("A1:C10")
    
    If Not Application.Intersect(Target, rngWatch) Is Nothing Then
        MsgBox "監視範囲内で変更がありました。"
    End If
End Sub

Targetは変更されたセル範囲。これと監視範囲の交差があれば処理を行います。


2)複数選択範囲の重複チェック

Dim rngA As Range, rngB As Range, rngOverlap As Range
Set rngA = Range("A1:A10")
Set rngB = Range("A5:A15")

Set rngOverlap = Application.Intersect(rngA, rngB)

If Not rngOverlap Is Nothing Then
rngOverlap.Interior.Color = vbYellow
End If

重なった範囲を黄色に塗る例。


7. 注意点と補足

1)IntersectはApplicationオブジェクトのメソッド

Rangeオブジェクトのメソッドではなく、Application.Intersectとして呼び出す必要があります。

' NG: Range("A1:B2").Intersect(Range("B1:C3")) ' エラーになる
' OK:
Set rng = Application.Intersect(Range("A1:B2"), Range("B1:C3"))

2)戻り値のNothingチェックが必須

重なっていなければNothingになるため、処理の前に必ずIf Not rng Is Nothing Thenでチェックしないとエラーになります。


8. Intersectで使える範囲の種類

  • 同じワークシートの範囲でなければならない。
  • 複数のシートのRangeは重なり判定できず、Nothingが返ります。

9. IntersectとUnionの違い

  • Intersect: 複数の範囲の重なり(共通部分)を返す。
  • Union: 複数の範囲の結合(合成部分)を返す。
Set rngUnion = Application.Union(Range("A1:A5"), Range("B1:B5"))

rngUnionは2つの範囲をまとめた範囲。


10. 応用例:条件付き書式の特定範囲適用判定

Dim cfRange As Range
Set cfRange = Range("C1:C10") ' 条件付き書式の範囲

Dim checkRange As Range
Set checkRange = Range("B5:D8") ' 変更範囲

If Not Application.Intersect(cfRange, checkRange) Is Nothing Then
MsgBox "条件付き書式範囲に変更が含まれます"
End If

11. 複数のセル範囲とIntersectの活用例

Dim rngA As Range, rngB As Range, rngC As Range
Set rngA = Range("A1:A20")
Set rngB = Range("A10:C15")
Set rngC = Range("B5:B25")

Dim rngIsect As Range
Set rngIsect = Application.Intersect(rngA, rngB, rngC)

If Not rngIsect Is Nothing Then
rngIsect.Interior.Color = RGB(255, 200, 200)
End If

3つの範囲が共通しているセルに色付け。


12. まとめ

項目説明
目的複数範囲の共通部分(重なっているセル範囲)を取得する
戻り値重なりがあればRangeオブジェクト、なければNothing
呼び出し元Application.Intersectで呼び出す
注意点複数範囲は同じワークシート内であること
実務での利用例範囲内変更検知、重複セルの強調、複数範囲の共通処理など
タイトルとURLをコピーしました