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で呼び出す
Union
はRange
オブジェクトのメソッドではなく、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 でアクセス可能 |
使用例 | 複数範囲の書式変更、コピー、イベント処理の監視範囲設定 |