ExcelVBAでセル範囲を扱っていると、「2つの範囲が重なっている部分だけを取得したい」「離れた複数の範囲をまとめて1つのRangeとして処理したい」という場面があります。こうしたセル範囲同士の演算を行うのが、IntersectメソッドとUnionメソッドです。
この記事では、それぞれの基本的な使い方から、Worksheet_Changeイベントでの活用例まで、実務でよく使われるパターンを解説します。
Intersectメソッドとは
Intersectメソッドは、複数のセル範囲に共通する部分(重なっている範囲)を取得するメソッドです。書き方は以下の通りです。
Application.Intersect(Range1, Range2, ...)
引数には2つ以上のRangeを指定できます。すべての範囲に共通する部分がRangeオブジェクトとして返され、共通部分がまったくない場合はNothingが返されます。
基本の使い方
Sub BasicIntersect()
Dim rng1 As Range
Dim rng2 As Range
Dim result As Range
Set rng1 = Range("B2:D6")
Set rng2 = Range("C4:F8")
Set result = Application.Intersect(rng1, rng2)
If Not result Is Nothing Then
result.Interior.Color = RGB(255, 230, 150)
MsgBox "共通部分:" & result.Address
Else
MsgBox "重なっている範囲はありません"
End If
End Sub
B2:D6とC4:F8という2つの範囲を指定すると、共通部分であるC4:D6が取得され、色が付きます。共通部分がない場合はNothingが返るため、If Not result Is Nothing Thenで必ず判定してからプロパティやメソッドを呼び出すようにしましょう。判定を省略すると、共通部分がないときに実行時エラーになります。
Intersectの実践活用:特定範囲内のセルかどうかを判定する
Intersectは、Worksheet_Changeイベントなどで「変更されたセルが特定の範囲内に含まれているかどうか」を判定する目的でよく使われます。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim watchRange As Range
Set watchRange = Me.Range("B2:B10")
If Not Application.Intersect(Target, watchRange) Is Nothing Then
MsgBox "監視対象範囲(B2:B10)が変更されました"
End If
End Sub
シートモジュールにこのコードを記述すると、B2:B10の範囲内のセルが変更されたときだけメッセージが表示されます。TargetとwatchRangeの共通部分があるかどうかで、「変更セルが監視範囲に含まれているか」を効率よく判定できるのがポイントです。
Unionメソッドとは
Unionメソッドは、離れた複数のセル範囲を1つのRangeオブジェクトとして結合するメソッドです。書き方は以下の通りです。
Application.Union(Range1, Range2, ...)
引数には2つ以上のRangeを指定します。結合後は1つのRangeオブジェクトとして扱えるため、まとめて書式を設定したり値を取得したりできます。
基本の使い方
Sub BasicUnion()
Dim rng1 As Range
Dim rng2 As Range
Dim rng3 As Range
Dim combined As Range
Set rng1 = Range("A1:A3")
Set rng2 = Range("C1:C3")
Set rng3 = Range("E1:E3")
Set combined = Application.Union(rng1, rng2, rng3)
combined.Interior.Color = RGB(200, 230, 255)
MsgBox "結合範囲:" & combined.Address
End Sub
A1:A3、C1:C3、E1:E3という3つの離れた範囲を1つのRangeにまとめ、まとめて色を設定しています。UnionのAddressは$A$1:$A$3,$C$1:$C$3,$E$1:$E$3のように、カンマ区切りの複数範囲として表示されます。
Unionの実践活用:条件に合うセルを1つの範囲にまとめる
ループ処理の中でUnionを使うと、条件に合致したセルだけを少しずつ結合して、最終的にまとめて処理することができます。
Sub CollectCellsOver100()
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
Dim targetRange As Range
Set ws = ThisWorkbook.Worksheets("Sheet1")
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
For i = 1 To lastRow
If ws.Cells(i, "A").Value > 100 Then
If targetRange Is Nothing Then
Set targetRange = ws.Cells(i, "A")
Else
Set targetRange = Application.Union(targetRange, ws.Cells(i, "A"))
End If
End If
Next i
If Not targetRange Is Nothing Then
targetRange.Font.Bold = True
MsgBox targetRange.Cells.Count & "個のセルが100を超えていました"
Else
MsgBox "条件に合うセルはありませんでした"
End If
End Sub
最初はtargetRangeがNothingなので、条件に合う最初のセルをそのまま代入し、2件目以降はUnionで既存の範囲に結合しています。この方法を使うと、1件ずつ書式を設定するのではなく、最後にまとめてFont.Bold = Trueを1回実行するだけで済むため、処理が効率的になります。
Intersectで複数条件の絞り込みを行う
Intersectは3つ以上の範囲を指定することもできるため、複数条件を同時に満たす範囲の絞り込みにも使えます。
Sub MultiConditionIntersect()
Dim targetColumn As Range
Dim targetRow As Range
Dim selectedRange As Range
Dim result As Range
Set targetColumn = Columns("C")
Set targetRow = Rows("5")
Set selectedRange = Selection
Set result = Application.Intersect(targetColumn, targetRow, selectedRange)
If Not result Is Nothing Then
MsgBox "C列・5行目・選択範囲すべてに含まれるセル:" & result.Address
Else
MsgBox "3つの条件すべてに一致するセルはありません"
End If
End Sub
C列全体、5行目全体、現在の選択範囲という3つの条件すべてに共通するセル(つまりC5セルが選択範囲に含まれているかどうか)を判定しています。
注意点
IntersectとUnionを使う際は、以下の点に注意してください。
- 戻り値がNothingになる場合がある:Intersectで共通部分がない場合、Unionで無効な引数が渡された場合など、戻り値がNothingになることがあります。必ず
Is Nothingで判定してから使いましょう。 - 異なるシートの範囲は指定できない:IntersectもUnionも、異なるワークシート上のRangeを組み合わせるとエラーになります。同じシート内の範囲同士で使用してください。
- Applicationは省略可能:
Application.IntersectとApplication.Unionは、標準モジュールではApplicationを省略してIntersect(...)、Union(...)と書くこともできます。
まとめ
IntersectとUnionを使うと、セル範囲同士の「共通部分の取得」と「複数範囲の結合」を簡単に行えます。
Intersectは複数範囲の重なっている部分を取得する。共通部分がなければNothingが返るUnionは離れた複数範囲を1つのRangeオブジェクトとして結合する- Worksheet_Changeイベントでの範囲判定や、条件に合うセルの一括収集など実務での使いどころが多い
- 戻り値がNothingになる可能性があるため、使用前に必ずIs Nothingで判定する
複数のセル範囲を扱う処理を書く際は、IntersectとUnionを活用することでコードをシンプルにできます。


コメント