Home » Excel VBA Rangeオブジェクト » Unionで複数のセルを選択するExcelマクロ

Unionで複数のセルを選択するExcelマクロ

対象:Excel2007, Excel2010, Excel2013, Windows版Excel2016

Unionで複数のセルを選択するExcelマクロ

ApplicationオブジェクトのUnionメソッドの簡単な使い方をご紹介しました。

もう少し実際にありそうな例をご紹介します。

条件に合致した複数のセル・セル範囲を選択するマクロです。

[スポンサードリンク]

Unionメソッドを使って複数のセルを選択するサンプルマクロ

以下のマクロを実行すると、A1セルからA100セルのうちで、行番号が3で割り切れるセルが選択されます。

Sub 複数セルの選択_A列の行番号が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 Sub

For~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列に入力されているときに、その行全体を選択するマクロです。

Sub 複数セルの選択_A列で値が80以上の行()

 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

End Sub

先ほどのマクロと構造は良く似ています。

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によって

Unionで複数のセルを選択するExcelマクロ

既に選択されているシートの選択を解除するのか、解除しないのかを指定できます。

ところがRangeオブジェクトのSelectメソッドの場合は、このWorksheet.Selectのように引数を指定ようには作られていません。

Unionで複数のセルを選択するExcelマクロ

「Worksheet.Select Replace:=False」のように、
「Range.Select Replace:=False」と書いてみたところで、エラーになるだけです。

そのため、複数のセル範囲を選択したい場合は、この記事でご紹介したようにApplication.Unionメソッドで、複数のセルを表すコレクションとしてのRangeオブジェクトを用意しておいて、Range.Selectで選択するという処理が必要になります。

[スポンサードリンク]

Home » Excel VBA Rangeオブジェクト » Unionで複数のセルを選択するExcelマクロ

「Excel VBA Rangeオブジェクト」の記事一覧

検索


Copyright © インストラクターのネタ帳 All Rights Reserved.

.