【初心者向け】エクセルVBAのRangeとCellsの使い分け方は?
VBAでは、セルを選択するときにRangeとCellsの両方が使えます。
この2つは、どう使い分けたらいいか、わかりにくいですよね?
そこで、このページでは、VBA初心者向けに、VBAのRangeとCellsの使い分け方を解説していきます。
この記事の目次
場面に応じてRange、Cellsの「使いやすいほう」を使う
Range、Cellsは、ほとんどの場合、どちらを使っても結果は変わりません。
そこで、場面に応じて使いやすいほうを使うことになります。
もし、RangeとCellsの2つを覚えるのが面倒なときは、基本的には「Cells」を使うことをおすすめします。
ただし、Cellsしか使えない、Rangeしか使えない場面もありますので、そういう場合には使えるほうを使います。
以下、各場面ごとに比較をしていこうと思います。
比較表
区分 | 変数 | Range | Cells (Range+Cells、 または Range+Rows,Columns) |
|
---|---|---|---|---|
単一セル | なし | ◎ | ○ | |
あり | For~Nextで縦方向に変化 | ◎ | ○ | |
For~Nextで横方向に変化 | △ | ○ | ||
範囲 | なし | ◎ | ◎ | |
あり | △ | ◎ | ||
行全体 | なし | ◎ | ◎ | |
あり | ◎ | ◎ | ||
列全体 | なし | ◎ | ◎ | |
あり | △ | ◎ | ||
シート全体 | × | ◎ | ||
名前での参照 | ◎ | × |
薄緑色 | おすすめ |
---|---|
◎ | 簡単(入力補完あり) |
○ | 簡単(入力補完なし) |
△ | 大変 |
× | 使用不可 |
使い分けをするときの基本的な考え方
変数を使わないときはRange、変数を使うときはCells
- 変数を使わないときはRangeのほうが使いやすい
- 変数を使うときはCellsのほうが使いやすい
というのが一般的な傾向です。
特別な理由がない限りは、変数を使うかどうかでCellsを使うかRangeを使うかを決めましょう。
もし、できるだけどちらかに統一したいということであれば、変数と組み合わせやすいCellsを使う方法をおすすめします。
Rangeは入力補完が効く。Cellsは入力補完が効かない
特に、初心者の場合には「入力補完」が効くかどうか、というのも大事なポイントです。
試しに、次の2つの文を入れて見てください。
Cells(3, 2).Value = 1
「.」まで入力したときにRangeは入力候補が表示されるのに対して、Cellsは入力候補が表示されません。
初心者のうちは、Range、Cellsのどちらを使っても難易度が大きく変わらないときには、Rangeを使ったほうがいいかもしれません。
もちろん、「Cellsのほうが明らかに優れている場面」ではCellsを使いましょう。
Cellsを入力するときに、コード補完を効かせたいという場合には、下記URLの方法をお試しください。
それでは、実際にRangeとCellsを比較していきます。
単一のセルを選択する場合
まずは、B2セル、C3セルなど、1つのセルを選択する場合を考えます。
あらかじめ決められたセルを選択する場合
たとえばB3セルに「1」という値をセットしたい場合。
どちらの書き方でも問題はありませんので、書きやすいほうで書きましょう。
入力補完が使えるRangeのほうが最初のうちはいいかもしれませんが、長期的にVBAを使いこなしたいならCellsをおすすめします。
- 1. Rangeを使う
-
Range("B3").Value = 1
- 2. Cellsを使う
-
Cells(3, 2).Value = 1
For~Nextループで「縦方向」に選択セルを変化させる場合
For~Nextループで「B1セル、B2セル・・・B10セルに対して処理をする」というように、変数を使って「縦方向」に選択するセルを変化させる場合には、どちらかといえばCellsを使うほうがおすすめです。
下の2つを比較すると、
- Rangeを使う場合には、「B」と「変数」を「&」で文字列結合をする必要がある
- Cellsの場合には、単に「変数」をあてはめるだけで済む
ので、Cellsのほうが少し簡単です。
- 1. Rangeを使う
-
For Row = 1 To 10 Range("B" & Row).Value = 1 Next
- 2. Cellsを使う
-
For Row = 1 To 10 Cells(Row, 2).Value = 1 Next
For~Nextループで「横方向」に選択セルを変化させる場合
For~Nextループで「A3セル、B3セル・・・J3セルに対して処理をする」というように、変数を使って「横方向」に選択するセルを変化させる場合には、必ずCellsを使いましょう。
以下のとおり、Rangeを使うほうは、数式がやや複雑で、使いにくいです。
- Range
-
For Column = 1 To 10 Range(Chr(64 + Column) & "3").Value = 1 Next
- Cells
-
For Column = 1 To 10 Cells(3, Column).Value = 1 Next
セル範囲を選択する場合
あらかじめ決められたセル範囲を選択する場合
たとえばB3セル~D6セルに「1」という値をセットしたい場合。
よくある書き方としては、次の2つの方法があります。
どちらでもいいですが、迷ったら、シンプルな「1.」の方法をおすすめします。
- 1. Rangeを使う
-
Range("B3:D6").Value = 1
- 2. RangeとCellsの組み合わせ
-
Range(Cells(3, 2), Cells(6, 4)).Value = 1
変数でセル範囲を指定する場合
セル範囲が「変数の内容」により変わる場合には、2.の方法を使いましょう。
「1.」の方法だと、数式が複雑になりすぎます。
- 1. Rangeを使う
-
rowMin = 3 columnMin = 2 rowMax = 6 columnMax = 4 Range(Chr(64 + columnMin) & rowMin & ":" & Chr(64 + columnMax) & rowMax).Value = 1
- 2. RangeとCellsの組み合わせ
-
rowMin = 3 columnMin = 2 rowMax = 6 columnMax = 4 Range(Cells(rowMin, columnMin), Cells(rowMax, columnMax)).Value = 1
現在、アクティブなシート以外のセルを選択したい場合、「2.」の方法だとエラーが発生しがちです。
次のように「Withステートメント」を使って表記しましょう。
Rangeと、2つのCellsの前、計3箇所に「.」が入っているのがポイントです。
rowMin = 3
columnMin = 2
rowMax = 6
columnMax = 4
With Worksheets("書き込みたいシート")
.Range(.Cells(rowMin, columnMin), .Cells(rowMax, columnMax)).Value = 1
End With
行全体を選択する場合
あらかじめ決められた行を選択する場合
たとえば2行目から4行目までを選択して「削除」をしたい場合を考えて見ます。
この場合は、Cellsを使わずにRangeを使って書くことになります。
よくある書き方としては次の2つの方法があります。
どちらでもいいですが、迷ったら「1.」の方法がわかりやすいと思います。
- 1. Rangeを使う
-
Range("2:4").Delete
- 2. RangeとRowsの組み合わせ
-
Cellsの代わりにRowsを使って次のように書くことができます。
Range(Rows(2), Rows(4)).Delete
現在、アクティブなシート以外のセルを「2.」の方法で選択するときには、次のように「Withステートメント」を使うのがおすすめです。
Rangeと、2つのRowsの前、計3箇所に「.」が入っているのがポイントです。
With Worksheets("書き込みたいシート")
.Range(.Rows(2), .Rows(4)).Delete
End With
変数で選択する行を指定する場合
変数で指定された行を「削除」する場合を考えて見ます。
変数を使う場合には、どちらの方法でもいいですがどちらかといえばシンプルに書ける「2.」の方法がおすすめです。
- 1. Rangeを使う
-
rowMin = 2 rowMax = 4 Range(rowMin & ":" & rowMax).Delete
- 2. RangeとRowsの組み合わせ
-
Cellsの代わりにRowsを使って次のように書くことができます。
rowMin = 2 rowMax = 4 Range(Rows(rowMin), Rows(rowMax)).Delete
現在、アクティブなシート以外のセルを「2.」の方法で選択するときには、次のように「Withステートメント」を使うのがおすすめです。
Rangeと、2つのRowsの前、計3箇所に「.」が入っているのがポイントです。
rowMin = 2
rowMax = 4
With Worksheets("書き込みたいシート")
.Range(.Rows(rowMin), .Rows(rowMax)).Delete
End With
列全体を選択する場合
あらかじめ決められた列を選択する場合
たとえばB列目からD列目までを選択して「削除」をしたい場合を考えて見ます。
この場合は、Cellsを使わずにRangeを使って書くことになります。
よくある書き方としては次の2つの方法があります。
どちらでもいいですが、迷ったら「1.」の方法がわかりやすいと思います。
- 1. Rangeを使う
-
Range("B:D").Delete
- 2. RangeとColumnsの組み合わせ
-
Cellsの代わりにColumnsを使って次のように書くことができます。
Range(Columns(2), Columns(4)).Delete
現在、アクティブなシート以外のセルを「2.」の方法で選択するときには、次のように「Withステートメント」を使うのがおすすめです。
Rangeと、2つのColumnsの前、計3箇所に「.」が入っているのがポイントです。
With Worksheets("書き込みたいシート")
.Range(.Columns(2), .Columns(4)).Delete
End With
変数で選択する行を指定する場合
変数で指定された行を「削除」する場合を考えて見ます。
変数を使う場合には、必ず「2.」の方法を使いましょう。
「1. Rangeを使う」のほうは、数式があまりに複雑すぎます。
- 1. Rangeを使う
-
columnMin = 2 columnMax = 4 Range(Chr(64 + columnMin) & ":" & Chr(64 + columnMax)).Delete
- 2. RangeとColumnsの組み合わせ
-
Cellsの代わりにColumnsを使って次のように書くことができます。
columnMin = 2 columnMax = 4 Range(Columns(columnMin), Columns(columnMax)).Delete
現在、アクティブなシート以外のセルを「2.」の方法で選択するときには、次のように「Withステートメント」を使うのがおすすめです。
Rangeと、2つのColumnsの前、計3箇所に「.」が入っているのがポイントです。
columnMin = 2
columnMax = 4
With Worksheets("書き込みたいシート")
.Range(.Columns(ColumnMin), .Columns(ColumnMax)).Delete
End With
シート全体を選択する場合
シート全体を選択するときは、Cellsを使います。
たとえば、シート全体を「空欄」にするためには、次のような式を入力します。
Cells.Value = ""
名前定義を使う場合
名前定義を使うときには、Rangeを使います。
たとえば、「入力」という名前が付けられている範囲全体を「空欄」にするためには、次のような式を入力します。
Range("入力").Value = ""
変数で「名前」を指定する場合もまったく同じです。
RangeName = "入力"
Range(RangeName).Value = ""
参考サイト
もっと、RangeとCellsについて知りたいというときは、次のサイトをご覧ください。
個人的に、かなり好きなページです。