第103回.UnionメソッドとAreasプロパティ
UnionメソッドはApplicationのメソッドです。
複数のセル範囲を集め、1つのRangeオブジェクとして参照することができます。
つまり、Unionメソッドは複数のRangeオブジェクトを連結して1つのRangeオブジェクトにします。
マクロVBAにおいて、セル範囲に次々に別のセル範囲を追加して、最後にまとめて処理するような場合に便利です。
それぞれのセル範囲を取得するには、Areasプロパティを使用します。
Unionメソッド
Arg1 | セル範囲 (Range オブジェクト) を指定します。 |
Arg2 | セル範囲 (Range オブジェクト) を指定します。 |
Arg3 | セル範囲 (Range オブジェクト) を指定します。 |
~ | |
Arg30 | セル範囲 (Range オブジェクト) を指定します。 |
Application.は省略可能です。
Arg1とArg2は必須です、Arg3以降はオプションになります。
Areasプロパティ
RangeのAddress文字列の,カンマで区切られたそれぞれのセル範囲のRangeオブジェクトのコレクションになります。
Rangeオブジェクトの中に、複数のRangeオブジェクトが含まれている状態です。
単数形のAreaオブジェクトは存在しません。ただし以下では単一の意味でAreaと表記しています。
インデックス番号は、領域が選択された順序に対応します。
Range(…).Countはセル数ですが、Areas.CountはArea(Rangeオブジェクト)の数になります。
1つのRangeオブジェクトには少なくとも1つのAreaが存在しますので、Areas.Countの最小値は1になります。
この場合は、
Areas.Countは3になり、
Areas(1)はRange("A1")
Areas(2)はRange("A3:A5")
Areas(3)はRange("A7")
このようになります。
Unionメソッドで連結した結果のRangeオブジェクトの状態について
このとき、単にRangeオブジェクトをつなげるだけではなく、
包含されるセル範囲等、1つの矩形範囲にまとめられるものは1のセル範囲として返されます。
片方が包含されている場合
Debug.Print Union(Range("A1:A5"), Range("A2:A3")).Address
この結果は、
$A$1:$A$5
新たな矩形セル範囲になる場合
Debug.Print Union(Range("A1:A3"), Range("A4:A5")).Address
Debug.Print Union(Range("A1,A3"), Range("A2")).Address
Debug.Print Union(Range("A1:A3"), Range("B1:B3")).Address
この結果は、
$A$1:$A$5
$A$1:$A$3
$A$1:$B$3
1つの矩形セル範囲にまとめられない場合
Debug.Print Union(Range("A1:A3"), Range("A2:B2")).Address
Debug.Print Union(Range("B3:C5"), Range("A1:B5")).Address
この結果は、
$A$1:$A$3,$A$2:$B$2
$B$3:$C$5,$A$1:$B$5
また、Union結果のRangeオブジェクトの中の順番は、左から順に連結されます。
連結された結果の矩形セル範囲がいくつのセル範囲になっているかは、Areas.Countで取得できます。
Debug.Print Union(Range("A1:A3"), Range("A2:B2")).Address
Debug.Print Union(Range("A1:A3"), Range("A2:B2")).Areas.Count
Debug.Print Union(Range("B3:C5"), Range("A1:B5"), Range("A2:A3")).Address
Debug.Print Union(Range("B3:C5"), Range("A1:B5"), Range("A2:A3")).Areas.Count
この結果は、
$A$1:$A$3,$A$2:$B$2
2
$B$3:$C$5,$A$1:$B$5
2
Unionメソッドの使用例
Dim MyRange As Range
For i = 2 To 10 Step 2
If MyRange Is Nothing Then
Set MyRange = Cells(i, 1)
Else
Set MyRange = Application.Union(MyRange, Cells(i, 1))
End If
Next i
MyRange.Value = "UNION"
2行目から10行目までの偶数行のA列に、"UNION"と入れています。
これは、以下の処理と同じになります。
Dim i As Long
Dim strRange As String
For i = 2 To 10 Step 2
If strRange = "" Then
strRange = Cells(i, 1).Address
Else
strRange = strRange & "," & Cells(i, 1).Address
End If
Next i
Range(strRange).Value = "UNION"
ただし、Rangeの文字列は、255文字までなので、
それ以上になる場合は、Unionメソッドを使う必要があります。
Unionメソッドの実践例
Unionメソッドは、そんなに頻繁につかうものではありませんので、
細部については、必要になった時に調べれば良いでしょう。
しかし、
これを知らないと解決できないような場合もでてきます。
Intersectメソッドと合わせてしっかり使えるようになっておきましょう。
以下も参考にしてください。
Rangeオブジェクトの論理演算(差集合と排他的論理和)
同じテーマ「マクロVBA入門」の記事
第100回.InputBoxメソッド(インプットボックス)
第101回.Midステートメント
第102回.Intersectメソッド
第103回.UnionメソッドとAreasプロパティ
第104回.GetPhoneticメソッドとSetPhoneticメソッド(フリガナ)
第109回.列挙型(列挙体)Enum
第110回.ユーザー定義型・構造体(Type)
第111回.静的配列
第112回.動的配列(Redim)
第113回.配列に関連する関数
第114回.セル範囲⇔配列(マクロVBA高速化必須テクニック)
新着記事NEW ・・・新着記事一覧を見る
シートコピー後のアクティブシートは何か|ツイッター出題回答 (2023-09-19)
Excel関数の引数を省略した場合について|ツイッター出題回答 (2023-09-14)
セル個数を返すRange.CountLargeプロパティとは|VBA技術解説(2023-09-08)
記号を繰り返してグラフ作成(10単位で折り返す)|ツイッター出題回答 (2023-08-28)
シートを削除:不定数のシート名に対応|VBAサンプル集(2023-08-24)
ランクによりボイントを付ける(同順位はポイントを分割)|ツイッター出題回答 (2023-08-22)
OneDrive使用時のThisWorkbook.Pathの扱い方|VBA技術解説(2023-07-26)
列幅不足による###表示や指数表示を判定する|VBA技術解説(2023-07-12)
シートを削除:不定数のシート名に対応|VBAサンプル集(2023-07-04)
シート関数のCOUNTIFS,SUMIFS,MAXIFSと同じ処理|Power Query(M言語)入門(2023-02-28)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.繰り返し処理(For Next)|VBA入門
4.変数宣言のDimとデータ型|VBA入門
5.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
6.マクロとは?VBAとは?VBAでできること|VBA入門
7.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
8.並べ替え(Sort)|VBA入門
9.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
10.条件分岐(IF)|VBA入門
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。