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 で呼び出す |
注意点 | 複数範囲は同じワークシート内であること |
実務での利用例 | 範囲内変更検知、重複セルの強調、複数範囲の共通処理など |