Unionメソッドあれこれ

思うところあって、Unionメソッドで色々と実験してみた。

Application.Unionは、複数のRangeオブジェクトをまとめた、コレクションとしてのRangeを返すメソッドです。

参照元は、こちら↓。
www.relief.jp
大変分かり易くまとめられていて、昔からお世話になっている。
(いつも有難うございます)。
f:id:Infoment:20181222104049p:plain
試しに、Range("A1")をとRange("A2")をまとめてみる。

Sub UnionTest()
    Cells.Clear
    Dim myRng As Range
    Set myRng = Range("A1")
    Set myRng = Union(myRng, Range("A2"))
        myRng.Interior.Color = 192
End Sub

結果はこちら。A1とA2がまとめられている。
f:id:Infoment:20181222092806p:plain

A1とA3のように、離れていても大丈夫。
f:id:Infoment:20181222093101p:plain

Q.1 でこぼこでも大丈夫か

この範囲をUnionで纏めると、どうなるのだろう。
f:id:Infoment:20181222093325p:plain
試してみる。

Sub UnionTest()
    Cells.Clear
    Dim myRng As Range
    Set myRng = Range("B2:B7")
    Set myRng = Union(myRng, Range("A4:C4"))
        myRng.Interior.Color = 192
End Sub

塗りつぶされた範囲を見てみると、結果は矩形でなくともOKのようだ。
f:id:Infoment:20181222094319p:plain

Q.2 重なった範囲は二重カウントされるのか。

A2~C2のセル3つと、
B1~B3のセル3つを纏めてみる。
f:id:Infoment:20181222095143p:plain

Sub UnionTest()
    Cells.Clear
    Dim myRng As Range
    Set myRng = Range("A2:C2")
    Set myRng = Union(myRng, Range("B1:B3"))
        myRng.Interior.Color = 192
        MsgBox myRng.Count
End Sub

結果は、6と出た。
f:id:Infoment:20181222095608p:plain
B2は重複範囲だが、別物として扱うようだ。

Q.3 Unionの順番は影響するか。

順序を入れ替えてみる。

Sub UnionTest()
    Cells.Clear
    Dim myRng As Range
    Set myRng = Range("A1:A3")
    Set myRng = Union(myRng, Range("C1:C3"))
        myRng.Interior.Color = 192
    Dim r As Range
    Dim i As Long: i = 1
    For Each r In myRng
        r = i: i = i + 1
    Next
End Sub

f:id:Infoment:20181222100752p:plain

先にC1:C3をセットすると、順序が逆になった。
f:id:Infoment:20181222100841p:plain
コレクションだから、当然と言えば当然か。

Q.4 同一範囲をUnionすることはできるか。

単独範囲の場合。

Sub UnionTest()
    Cells.Clear
    Dim myRng As Range
    Set myRng = Range("A1")
    Set myRng = Union(myRng, Range("A1"))
        myRng.Interior.Color = 192
        MsgBox myRng.Address
End Sub

f:id:Infoment:20181222101331p:plain

複数範囲の場合。

Sub UnionTest()
    Cells.Clear
    Dim myRng As Range
    Set myRng = Range("A1:A3")
    Set myRng = Union(myRng, Range("A1:A3"))
        myRng.Interior.Color = 192
        MsgBox myRng.Address
End Sub

f:id:Infoment:20181222101455p:plain

共に、何もなかったことになっている。
先程の、重複する場合のカウントと矛盾する気がする。
そこで、以下二つの範囲をUnionしてみる。
① A1:A3
② A2:A4
結果、アドレスは以下のように一まとめで表現された。
f:id:Infoment:20181222102036p:plain

先程のデコボコパターンだとこうなる。
f:id:Infoment:20181222102203p:plain

さらに、C2:C7を加えてみる。

Sub UnionTest()
    Cells.Clear
    Dim myRng As Range
    Set myRng = Range("B2:B7")
    Set myRng = Union(myRng, Range("C2:C7"), Range("A4:C4"))
        myRng.Interior.Color = 192
        MsgBox myRng.Address
End Sub

結果、以下の二つは
① B2:B7
② C2:C7
一つにまとめて、次のように表現された。
③ B2:C7
f:id:Infoment:20181222102650p:plain

従ってQ2の結果は、

単純に「カウントされる」ではなく、Unionの結果として範囲の表記が複数になった場合、たまたま重複するセルがあっても関係なくカウントされる

ということのようだ。どちらか一方が他方を内包する場合、小さい方は飲み込まれて消えてしまうということか。何とも切ない話だ。


今回分かったことの全ては、実は
「ある条件下における特殊解であって、本来のルールとは違う」
こともあるかもしれない。

引き続き調査しつつ、今回の結果を活かしていくとします。

以上、参考まで。