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

Range

1. 概要

VBAのUnionメソッドは、複数のRangeオブジェクトを一つの連結されたRangeオブジェクトとして結合するために使います。
つまり、複数の離れたセル範囲をまとめて扱いたい場合に便利な機能です。

例えば、シート上で離れた複数のセル範囲をまとめて色を変えたり、値を設定したり、コピーしたりする際に使います。


2. 基本構文

Set rngUnion = Application.Union(Range1, Range2, ..., RangeN)
  • Range1, Range2, …, RangeN は結合したい複数のRangeオブジェクトです(2つ以上)。
  • 戻り値は、それらのすべてのセル範囲を含む新しいRangeオブジェクトになります。
  • 範囲は隣接していても離れていても構いません。

3. Unionの特徴

特徴内容
複数の離れた範囲をまとめる隣接していない複数のセル範囲を1つのRangeとして扱える
元の範囲の集合を作る複数のRangeの集合(合併)を作成するイメージ
返り値は新しいRangeオブジェクトまとめた範囲を操作可能
ApplicationオブジェクトのメソッドRangeオブジェクトのメソッドではなく、Applicationを介して使用

4. 使用例

例1:2つの離れた範囲を結合して色を変える

Sub UnionExample1()
Dim rng1 As Range, rng2 As Range, rngUnion As Range

Set rng1 = Range("A1:A5")
Set rng2 = Range("C1:C5")

Set rngUnion = Application.Union(rng1, rng2)

rngUnion.Interior.Color = RGB(255, 255, 0) ' 黄色に塗る
End Sub

この例では、A1:A5とC1:C5を一つのRangeとして扱い、まとめて黄色に塗っています。


例2:複数範囲をUnionでまとめてコピー

Sub UnionCopyExample()
Dim rng1 As Range, rng2 As Range, rngUnion As Range

Set rng1 = Range("B2:D4")
Set rng2 = Range("F2:F5")

Set rngUnion = Application.Union(rng1, rng2)

rngUnion.Copy Destination:=Range("H1")
End Sub

複数範囲の内容をまとめてH1セル以降にコピーします。


5. 実務での活用例

1)イベントで複数の範囲を監視

Private Sub Worksheet_Change(ByVal Target As Range)
Dim rngWatch1 As Range, rngWatch2 As Range, rngWatchAll As Range

Set rngWatch1 = Range("A1:A10")
Set rngWatch2 = Range("C1:C10")

Set rngWatchAll = Application.Union(rngWatch1, rngWatch2)

If Not Application.Intersect(Target, rngWatchAll) Is Nothing Then
MsgBox "監視範囲で変更がありました。"
End If
End Sub

複数の離れた範囲をまとめて監視したい場合にUnionで一つにまとめます。


2)条件付きで範囲を拡張しつつ操作

Dim rngBase As Range, rngExtra As Range, rngCombined As Range
Set rngBase = Range("A1:A5")

If Range("B1").Value = 1 Then
Set rngExtra = Range("C1:C5")
Set rngCombined = Application.Union(rngBase, rngExtra)
Else
Set rngCombined = rngBase
End If

rngCombined.Interior.Color = vbGreen

条件に応じて結合範囲を変え、一括処理を行う例。


6. 注意点と補足

1)Application.Unionで呼び出す

UnionRangeオブジェクトのメソッドではなく、Applicationオブジェクトのメソッドです。
したがって、

' NG
Range("A1:A5").Union(Range("B1:B5")) ' エラー

' OK
Set rngUnion = Application.Union(Range("A1:A5"), Range("B1:B5"))

のように書きます。

2)引数は2つ以上のRange

Unionの引数は最低2つ以上のRangeが必要です。
1つだけの場合はUnionを使わずそのままRangeを使いましょう。

3)空のRangeは引数に含めない

もし範囲がNothingになっている場合を渡すとエラーになります。
そのため、結合前にNothingチェックが必要です。


7. Unionの戻り値の扱い

Unionは複数の範囲を結合した1つのRangeオブジェクトを返します。
このRangeオブジェクトは、複数の離れた範囲を含みますが、一見すると複数の連結していない領域(Areas)を持つRangeオブジェクトです。

つまり、Unionで作られたRangeは内部的には複数のAreas(離れた領域)の集合です。


8. UnionのAreasプロパティ

Unionで結合したRangeのAreasプロパティを使って、結合されているそれぞれの独立した範囲にアクセスできます。

Dim rngUnion As Range
Dim i As Integer

Set rngUnion = Application.Union(Range("A1:A5"), Range("C1:C5"))

For i = 1 To rngUnion.Areas.Count
Debug.Print "Area " & i & ": " & rngUnion.Areas(i).Address
Next i

9. 応用例:Unionを使った複数範囲の一括書式変更

Sub MultiRangeFormat()
Dim rng1 As Range, rng2 As Range, rng3 As Range
Dim rngAll As Range

Set rng1 = Range("A1:A3")
Set rng2 = Range("C1:C3")
Set rng3 = Range("E1:E3")

Set rngAll = Application.Union(rng1, rng2, rng3)

With rngAll.Font
.Bold = True
.Color = RGB(0, 100, 200)
End With
End Sub

10. UnionとIntersectの使い分け

メソッド役割戻り値の意味
Union複数範囲をまとめて結合範囲の合併(全体の集合)
Intersect複数範囲の重なり(共通部分)範囲の共通部分(重なっているセルだけ)

用途によって使い分けることが重要です。


11. Unionのエラー回避例

Dim rng1 As Range, rng2 As Range, rngUnion As Range

Set rng1 = Range("A1:A5")
' 変数rng2がNothingかもしれない場合の例
If Not rng2 Is Nothing Then
Set rngUnion = Application.Union(rng1, rng2)
Else
Set rngUnion = rng1
End If

12. まとめ

項目内容
用途複数のRangeを1つに結合し、一括操作を可能にする
戻り値結合範囲を表すRangeオブジェクト
呼び出し方Application.Union(Range1, Range2, ...)
離れた範囲もOK隣接・離散した範囲もまとめて扱える
Areasで領域確認複数の独立した領域がある場合はAreasでアクセス可能
使用例複数範囲の書式変更、コピー、イベント処理の監視範囲設定
タイトルとURLをコピーしました