第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入門」の記事
第104回.GetPhoneticメソッドとSetPhoneticメソッド(フリガナ)
新着記事NEW ・・・新着記事一覧を見る
TRIMRANGE関数(セル範囲をトリム:端の空白セルを除外)|エクセル入門(2024-08-30)
正規表現関数(REGEXTEST,REGEXREPLACE,REGEXEXTRACT)|エクセル入門(2024-07-02)
エクセルが起動しない、Excelが立ち上がらない|エクセル雑感(2024-04-11)
ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.繰り返し処理(For Next)|VBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.変数宣言のDimとデータ型|VBA入門
5.RangeとCellsの使い方|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.セルのクリア(Clear,ClearContents)|VBA入門
8.メッセージボックス(MsgBox関数)|VBA入門
9.条件分岐(Select Case)|VBA入門
10.ブック・シートの選択(Select,Activate)|VBA入門
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。