VBA入門
UnionメソッドとAreasプロパティ

ExcelマクロVBAの基本と応用、エクセルVBAの初級・初心者向け解説
最終更新日:2023-08-24

第103回.UnionメソッドとAreasプロパティ


UnionメソッドはApplicationのメソッドです。
複数のセル範囲を集め、1つのRangeオブジェクとして参照することができます。
つまり、Unionメソッドは複数のRangeオブジェクトを連結して1つのRangeオブジェクトにします。
マクロVBAにおいて、セル範囲に次々に別のセル範囲を追加して、最後にまとめて処理するような場合に便利です。


複数のセル範囲が1つのRangeオブジェクトに入っている場合、
それぞれのセル範囲を取得するには、Areasプロパティを使用します。


Unionメソッド

2つ以上のセル範囲の集合のRangeオブジェクトを返します。

Application.Union(Arg1, Arg2, Arg3, ・・・, Arg30)

Arg1 セル範囲 (Range オブジェクト) を指定します。
Arg2 セル範囲 (Range オブジェクト) を指定します。
Arg3 セル範囲 (Range オブジェクト) を指定します。
Arg30 セル範囲 (Range オブジェクト) を指定します。

Application.は省略可能です。
Arg1とArg2は必須です、Arg3以降はオプションになります。


Areasプロパティ

RangeオブジェクトのAreasプロパティは、複数の選択範囲にあるすべてのセル範囲を表すAreasコレクションを取得します。
RangeのAddress文字列の,カンマで区切られたそれぞれのセル範囲のRangeオブジェクトのコレクションになります。
Rangeオブジェクトの中に、複数のRangeオブジェクトが含まれている状態です。
単数形のAreaオブジェクトは存在しません。ただし以下では単一の意味でAreaと表記しています。

Areasコレクションから単一のRangeオブジェクトを取得するのには、Areas (index)を使用します。
インデックス番号は、領域が選択された順序に対応します。

Rangeオブジェクトに含まれるAreasコレクションの要素数は、Areas.Countで取得できます。
Range(…).Countはセル数ですが、Areas.CountはArea(Rangeオブジェクト)の数になります。
1つのRangeオブジェクトには少なくとも1つのAreaが存在しますので、Areas.Countの最小値は1になります。

Range("A1,A3:A5,A7")
この場合は、
Areas.Countは3になり、
Areas(1)はRange("A1")
Areas(2)はRange("A3:A5")
Areas(3)はRange("A7")
このようになります。


Unionメソッドで連結した結果のRangeオブジェクトの状態について

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

矩形のセル範囲にまとめられない場合は、元のRangeオブジェクトのセル範囲が維持されます。
また、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)
・ジャンプのセル選択以外でセルを選択するには ・指定文字、指定数式でジャンプ機能のVBA ・指定文字、指定数式でジャンプ機能の解説 ・指定文字、指定数式でジャンプ機能の最後に
セル番地でバラバラに指定されたセルの削除
シート内の複数のセルを削除します。削除するセルはバラバラです。A2,A4,B5:B7,C3,E5,E6,E9,… さて、どういうVBAを書いたら良いでしょうか。セル削除後は上方向にシフトします。セルの削除についての基本は以下を参照してください。
VBAのFindメソッドの使い方には注意が必要です
・1.処理速度が遅い ・2.指定オプションがシート操作とリンクしている ・「値」で検索した場合は、表示形式に依存した検索になる ・最後に

Unionメソッドは、そんなに頻繁につかうものではありませんので、
細部については、必要になった時に調べれば良いでしょう。
しかし、
これを知らないと解決できないような場合もでてきます。
Intersectメソッドと合わせてしっかり使えるようになっておきましょう。
・Intersectメソッド ・Intersectの使用例 ・Intersectメソッドの最後に

以下も参考にしてください。
Rangeオブジェクトの論理演算(差集合と排他的論理和)
・集合について ・Rangeオブジェクトの論理演算のVBAについて ・和集合:Unionメソッド ・積集合:Intersectメソッド ・補集合 ・差集合 ・排他的論理和 ・Rangeオブジェクトの論理演算VBAの使い方とテスト




同じテーマ「マクロ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コードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ