ApplicationオブジェクトのUnionメソッドの簡単な使い方をご紹介しました。
もう少し実際にありそうな例をご紹介します。
条件に合致した複数のセル・セル範囲を選択するマクロです。
Unionメソッドを使って複数のセルを選択するサンプルマクロ
以下のマクロを実行すると、A1セルからA100セルのうちで、行番号が3で割り切れるセルが選択されます。
Dim rng As Range
Dim i As Long
For i = 1 To 100
If i Mod 3 = 0 Then
If rng Is Nothing Then
Set rng = Cells(i, "A")
Else
Set rng = Union(rng, Cells(i, "A"))
End If
End If
Next i
rng.Select
End SubFor~Nextループの中で、
For i = 1 To 100
カウンター変数が3で割り切れるかどうかを、Mod演算子を使って調べています。
If i Mod 3 = 0 Then
最初に3で割り切れる行(即ち3行目)の場合は、オブジェクト変数・rngにはまだ何もセットされていない状態ですから、ここでいきなりUnionメソッドを使うとエラーになってしまいます。
そこで、オブジェクト変数・rngにまだ何もセットされていないNothingだった場合には、そのセルを表すRangeオブジェクトを、Cellsプロパティを使って取得してセットしています。
If rng Is Nothing Then
Set rng = Cells(i, "A")
一旦オブジェクト変数・rngにセットしたあとは、UnionでOKです。
Else
Set rng = Union(rng, Cells(i, "A"))
Unionメソッドで、オブジェクト変数・rngにセットされているRangeオブジェクトをどんどん増やすイメージです。
For~Nextループを抜けてから、最後にRangeオブジェクトのSelectメソッドで一気に複数セルの選択を行っています。
rng.Select
Unionメソッドを使って複数の行を選択するサンプルマクロ
もう一つ。
A1:A100セルに、テストの点数のような数値が入っているワークシートをイメージしてください。
「80」以上の数値がA列に入力されているときに、その行全体を選択するマクロです。
Dim i As Long
Dim rng As Range
For i = 1 To 100
If Cells(i, "A").Value >= 80 Then
If rng Is Nothing Then
Set rng = Rows(i)
Else
Set rng = Union(rng, Rows(i))
End If
End If
Next i
If Not (rng Is Nothing) Then
rng.Select
End If
先ほどのマクロと構造は良く似ています。
For~Nextループ中で、A列の値が「80」以上かどうかを調べます。
For i = 1 To 100
If Cells(i, "A").Value >= 80 Then
「80」以上だったときに、オブジェクト変数・rngにまだ何もセットされていないかを調べている理由は、先ほどのマクロと同じです。Nothingの状態のオブジェクト変数でいきなりUnionメソッドを使うとエラーになるので、最初だけはSetステートメントでオブジェクト変数に、行全体を表すRangeオブジェクトをセットしています。
If rng Is Nothing Then
Set rng = Rows(i)
今回は最後に行全体を選択したいので、よりシンプルなコードにできる行全体を表すRangeオブジェクトを返すRowsプロパティを使っています。
2つ目以降の条件に合致したセルの場合にはUnionメソッドです。
Else
Set rng = Union(rng, Rows(i))
For~Nextループを抜けたあとに、Range.Selectメソッドで選択ですが、今回は「80」以上という条件に合致するセルが1つも存在しないケースもありますからオブジェクト変数・rngがNothingでないときにだけ、選択を実行しています。
If Not (rng Is Nothing) Then
rng.Select
Range.SelectはWorksheet.Selectのような引数がないのでApplication.Unionを利用する
ユーザー側から見れば同じ選択するという操作でも、VBA側から見ると対象(オブジェクト)が何なのかによって具体的なコードは異なります。
例えば、シートを選択する場合WorksheetオブジェクトのSelectメソッドの場合、引数・Replaceによって、
既に選択されているシートの選択を解除するのか、解除しないのかを指定できます。
ところがRangeオブジェクトのSelectメソッドの場合は、このWorksheet.Selectのように引数を指定ようには作られていません。
「Worksheet.Select Replace:=False」のように、
「Range.Select Replace:=False」と書いてみたところで、エラーになるだけです。
そのため、複数のセル範囲を選択したい場合は、この記事でご紹介したようにApplication.Unionメソッドで、複数のセルを表すコレクションとしてのRangeオブジェクトを用意しておいて、Range.Selectで選択するという処理が必要になります。
- Newer:配列を使ってアクティブシート以外のシートを選択する
- Older:VBAで数式のコピー時に正しく相対参照させる
Home » Excel VBA Rangeオブジェクト » Unionで複数のセルを選択するExcelマクロ