ExcelのVBAではセル範囲の指定は基本なので、普段から何気なくやっていることと思います。
ただ、複数範囲の指定などでは意外とわからなくなったことはないでしょうか。
このページでは超初歩的な単一セルの指定から、Unionメソッドによる柔軟な複数範囲の指定方法まで、記述例を踏まえて段階的に解説していきます。
このページを見れば主だった指定方法はわかるようになるはずです。
初歩的な内容が不要な場合は、目次から必要な項目に飛んでご覧ください。
今回はあくまで基礎的な方法の解説に留め、OffsetやResizeの使い方は別の機会に解説します。
Cells
まずは単一セルを指定する方法です。
構成:Cells(行,列)
Cells(1, 1).Select
Cells(1, “A”).Select
Cells(6, 1).Select
Cells(6, “A”).Select
列の指定には数値とアルファベットが両方使えます。
Cellsを使うと行列ともに数値で指定することができるので、変数が利用しやすいというメリットがあります。
For~Nextなどの構文でよく使われるスタイルです。
列を数値で指定する必要がないときは、アルファベットにすることで可読性が良くなります。
これだけでは1セルの指定しかできないため、範囲指定するときはRangeの中にCellsを2つ入れて使います。
Range
単一セル、セル範囲、複数セル範囲のいずれにも対応できる方法です。
構成:Range(引数1{,引数2})
基本
ごく基本的なRangeオブジェクトの指定方法について、記述例をあげていきます。
Range(“A1”).Select
Range(“A1:G6”).Select
Range(Cells(1, 1),Cells(6, 7)).Select
Range(Cells(1, “A”),Cells(6, “G”)).Select
A1からG6のセル範囲を選択する場合は3パターン記載していますが、どれも同じ結果が得られます。
Rangeの中にCellsを入れて使うメリットは、列を数値で指定できることです。(主に変数で指定するため)
Range(”A1:G” & i).Select
Range(”A” i & “:G” & i + 2).Select
Range(Cells(i, 1) ,Cells(i + 2, i + 1)).Select
Range(Cells(i, “A”) ,Cells(i + 5, “G”)).Select
このように、変数の指定方法もそれなりにバリエーションがありますが、とりあえずはこんなイメージです。
複数範囲指定
下図のように複数の分割された範囲指定を行う方法はいくつかあります。
もちろん、1範囲ごとにRange指定を分けて記載していくだけでも実現できますが、もう少しスマートな方法をご紹介します。
Range(“A1:F2,A4:F5,A7:F8,A10:F11”).Select
このようにセル範囲を文字列で指定する方法です。
単純に指定するだけならこれが簡単ですし、指定範囲に規則性がない場合はどうしても文字列で個別に指定していく必要があります。
ただし、Rangeで指定できる引数の文字数は255バイト以内という制限があります。
要するに
Range(“ここに記載できる文字数が半角255文字以内“)
という意味です。
そして、255文字以上を入力して実行した場合、エラーで止まります。
255文字を超える指定を行う場合は別のRangeオブジェクトに分けて記載するか、後に説明するUnionなど別の方法を検討しましょう。
また、このような分割された範囲の複数指定をする場合、冒頭の例のようにセル範囲の指定は””の中に一連にして入れるのがポイントです。
間違った例として
Range(“A1:F2″,”A4:F5″,”A7:F8″,”A10:F11”).Select
のように、セル範囲を個々に””で囲ってしまうとエラーになるので注意しましょう。
おまけ解説:Rangeの引数について
Range(“A1:F2″,”A4:F5″,”A7:F8″,”A10:F11”).Selectではエラーになると解説しました。
しかし、””を2セットに絞ったRange(“A1:F2″,”A7:F8”).Selectではエラーが出ません。
その理由を解説します。
Rangeの基本的な使い方で紹介した次の形式を見てください。
Range(Cells(1, 1) ,Cells(6, 7)).Select
Cellsが2つ指定されていますね。
範囲指定するためには、Rangeの中に2つのセル範囲を指定し、それを始点と終点にしてその間のセルで範囲を形成するためです。
つまり、Rangeオブジェクトには2つまで引数を指定できます。
ということは、文字列指定する場合でも””を2セットまでなら入れられます。
エラーも出ません。
しかし、エラーは出ずとも2つのセル範囲を分割指定することはできません。
繰り返しになりますが、この2つのセル範囲は、Rangeの中で1つのセル範囲を求めるための始点と終点を示す引数だからです。
例えば、次のコードを実行すると下の図のようになります。
Range(“A1:F2″,”A7:F8”).Select
“A1:F2″と”A7:F8″が分割指定されていませんね。
これを冒頭で記載したような、Rangeの中にCellsを2つ入れている例にならって書くと次のようになります。
Range(Range(“A1:F2”), Range(“A7:F8”)).Select
Rangeの中に範囲指定となる別のRangeを2セット入れ込んでいる状態です。
Rangeオブジェクトの機能上こういった指定方法でもエラーは出ないですが、このような方法の有効性はちょっと思い当たりませんね。
やってることはRange(“A1:F8”).Selectと同じですから。
少し話は逸れましたが、分割範囲の指定については、この仕組みを理解しておくと””の使い方を間違えることはなくなると思います。
長くなりましたがご参考まで。
Union
Unionメソッドは簡単に言えばRangeやCellsを30個まで内包できる入れ物のようなものです。
例えばこんな感じ
Union(Range(“A1:F2”), Range(“A4:F5”), Range(“A7:F8”)).Select
Union(Cells(1, 3), Cells(1, 4), Cells(1, 4)).Select
しかし、見ていただければわかるとおり、例えばRangeの指定記述をフルで記載していかなければならないことを考えると、Rangeを個別に分けて書くのと大差ありません。(指定したあとの処理にもよりますが。)
それに、仕様上はRange内に255文字の指定×30個が指定できることになりますが、そういった使い方をすることはあまり考えにくいですね。
なので通常はFor~Nextのような構文の中に入れて使用されます。
特に、多数の範囲指定を連続で行う場合や、条件に合致する場合だけ処理範囲を追加していくなどの処理にはUnionメソッドが向いています。
ちなみに、Unionメソッドは引数を必ず2つ以上指定する必要があります。
言葉ではうまく説明できないので、実際のコードでご紹介します。
規則性のある範囲の複数指定
Sub Unionサンプル1()
'2行×5列の選択を1行空けて3回繰り返す
'対象範囲の格納変数
Dim SRange As Range
'第一引数の範囲を格納
'(Unionの第一引数に直接指定してもOK)
Set SRange = Range(Cells(1, 1), Cells(2, 5))
'処理回数(1~8行目まで3行置きに処理)
For i1 = 1 To 8 Step 3
'Unionで引数(範囲指定)を処理回数分追加
Set SRange = Union(SRange, Range(Cells(i1, 1), Cells(i1 + 1, 5)))
Next i1
'対象セルを選択状態にする
SRange.Select
End Sub
結果はこちら
条件分岐によるセルの追加
Sub Unionサンプル2()
'範囲内で1以上のセルを選択
'対象セルの格納変数
Dim SCell As Range
'検査範囲の列(A~Eまで)
For i1 = 1 To 5
'検査範囲の行(1~8まで)
For i2 = 1 To 8
'検査セルの値が1以上だった場合
If Cells(i2, i1) >= 1 Then
'SCellに何もセットされていないときは
If SCell Is Nothing Then
'第一引数に検査セルを代入
Set SCell = Cells(i2, i1)
Else
'すでにSCellに何かセットされている場合はUnionで検査セルを追加
Set SCell = Union(SCell, Cells(i2, i1))
End If
End If
Next i2
Next i1
'検査範囲内に1以上のセルが1つ以上あった場合
'(SCellにセルが1つ以上セットされている場合)
If Not SCell Is Nothing Then
'対象セルを選択状態にする
SCell.Select
End If
End Sub
結果はこちら
このように、0と空欄セルを除いた1以上の入力のあるセルを、選択的に処理することが出来ました。
なお、Unionメソッドの冒頭で、引数(Rangeオブジェクト)が30個入れられるという説明をしていますが、サンプルコードではFor~Nextでいくら範囲を追加しても引数は2個(コード上の引数の数)という扱いです。
Unionメソッドの用途
Unionメソッドは他の指定方法に比べて少し難易度が上がりますが、活用できるととても便利なメソッドです。
特に、条件分岐による範囲指定は、セルの条件別に選択するだけではなく、リストに沿って選択範囲を変動させたり、ユーザーフォーム(例えばリストボックス)などと組み合わせたりすれば、柔軟で動的な処理を行わせることができます。
ほかにも、Unionに指定した範囲たちの間に連続性がある場合、内部的に最適化してくれるという特性もあります。(これを意識する必要はあまりないとは思いますが。)
上の図は例としてUnionに3個(色別)の範囲を指定した結果、内部的に連続する範囲を合体させて2個(赤枠の範囲)の範囲に最適化してくれた、というものです。
こんなこともできるんだ、程度にお知り置きください。
まとめ
セルの指定方法として、単一セルの指定をするCells、主に範囲指定を行うRange、柔軟なセル範囲の指定ができるUnionの3種類を解説しました。
主な特徴をおさらいすると次のとおりです。
種類 | 主な特徴 |
---|---|
Cells | ・単一セルの指定 ・行列とも数値指定可 |
Range | ・単一セル、または範囲指定 ・セルアドレスで直接指定可(半角255文字以内) ・Cells等のオブジェクトを引数に指定可 ・複数範囲の指定可(連続・非連続とも) ・引数は2個まで指定可(始点と終点) |
Union | ・Cells等のオブジェクトを30個まで引数に指定可 ・For~Nextなどの構文での利用が便利 → 事実上30個の引数制限がなくなる ・条件分岐との組み合わせで柔軟な指定を実現 ・連続する範囲の最適化(再編)機能あり |
実務的にはそれぞれの特徴を踏まえた使い分けや、組み合わせて使用する必要が出てくると思います。
なお、今回紹介した中ではUnionメソッドが初心者の方には少しとっつきにくいかもしれません。
でも、知っておくと便利な機能ですし、理解しきらなくてもサンプルコードを少しいじれば使えるシーンはあるはずです。
慣れた人から見れば当たり前のことばかり書いて恐縮ですが、最後まで読んでいただきありがとうございます。
3種類の方法について、一連の流れで見ることで何かひとつでも理解が深まれば幸いです。
コメント