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

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

第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オブジェクトは存在しません。

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)
ジャンプ機能がありますが、それでは選択できないような場合です。ある文字を含むセルや、ある関数を含むセルを一括で選択状態にします。何に使うかは…ご自由に!InputBox("対象ブック:"&ActiveWorkbook.Name&vbLf& _"対象シート:"&ActiveWorkbook.ActiveSheet.Name&…
VBAのFindメソッドの使い方には注意が必要です
vbafindでの検索が極めて多く、Findメソッドは検索からの流入ではトップクラスです、アクセス解析で分かった事ですが正直少し戸惑っています。なぜなら私はFindメソッドをほとんど使いません、Match関数や配列を使って処理したほうが高速かつ確実に動作するからです。

Unionメソッドは、そんなに頻繁につかうものではありませんので、
細部については、必要になった時に調べれば良いでしょう。
しかし、
これを知らないと解決できないような場合もでてきますので、
どのようなメソッドなのかだけは知っておいて下さい。



同じテーマ「マクロVBA入門」の記事

第100回.InputBoxメソッド(インプットボックス)
第101回.Midステートメント
第102回.Intersectメソッド
第103回.UnionメソッドとAreasプロパティ
第104回.GetPhoneticメソッドとSetPhoneticメソッド(フリガナ)
第109回.列挙型(列挙体)Enum
第110回.ユーザー定義型・構造体(Type)
第111回.静的配列
第112回.動的配列(Redim)
第113回.配列に関連する関数
第114回.セル範囲⇔配列(マクロVBA高速化必須テクニック)


新着記事NEW ・・・新着記事一覧を見る

ツイッターで出されたVBAのお題をやってみた|エクセル雑感(1月13日)
イベントプロシージャーの共通化(Enter,Exit)|ユーザーフォーム入門(1月13日)
Rangeオブジェクトの論理演算(差集合と排他的論理和)|VBA技術解説(1月10日)
イベントプロシージャーの共通化|ユーザーフォーム入門(1月7日)
コントロールの動的作成|ユーザーフォーム入門(1月6日)
Evaluateメソッド(文字列の数式を実行します)|VBA技術解説(1月5日)
エクスポート(PDF/XPS)|VBA入門(1月2日)
分析関数(OVER句,WINDOW句)|SQL入門(12月25日)
取得行数を限定するLIMIT句|SQL入門(12月21日)
外部ライブラリ(ActiveXオブジェクト)|VBA入門(12月21日)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
5.変数宣言のDimとデータ型|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.マクロって何?VBAって何?|VBA入門
8.セルに文字を入れるとは(Range,Value)|VBA入門
9.空白セルを正しく判定する方法(IsEmpty,IsError,HasFormula)|VBA技術解説
10.ひらがな⇔カタカナの変換|エクセル基本操作




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


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



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