【ExcelVBA・マクロ】Intersect・Unionメソッドの使い方|複数セル範囲の共通部分・結合を取得する方法【コピペOK】

ExcelVBA

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

最初はtargetRangeNothingなので、条件に合う最初のセルをそのまま代入し、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.IntersectApplication.Unionは、標準モジュールではApplicationを省略してIntersect(...)Union(...)と書くこともできます。

まとめ

IntersectとUnionを使うと、セル範囲同士の「共通部分の取得」と「複数範囲の結合」を簡単に行えます。

  • Intersectは複数範囲の重なっている部分を取得する。共通部分がなければNothingが返る
  • Unionは離れた複数範囲を1つのRangeオブジェクトとして結合する
  • Worksheet_Changeイベントでの範囲判定や、条件に合うセルの一括収集など実務での使いどころが多い
  • 戻り値がNothingになる可能性があるため、使用前に必ずIs Nothingで判定する

複数のセル範囲を扱う処理を書く際は、IntersectとUnionを活用することでコードをシンプルにできます。

スポンサーリンク
スポンサーリンク
ExcelVBA
シェアする
いがぴをフォローする

コメント

タイトルとURLをコピーしました