Excel VBAでRangeとCellsの使い方をお探しですね。

広告

Excel VBAの「Range」と「Cells」、結局どう違うの?初心者向けに分かりやすく解説

Excel VBAを勉強し始めると、最初にぶつかる壁が「Range」と「Cells」の違いです。

どっちもセルを指定するための書き方なんですが、パッと見ただけでは「で、結局どっちを使えばいいの?」ってなりますよね。

この記事では、RangeとCellsの基本から、実際の使い分け、さらに実務でよく使う組み合わせ技まで、初心者の方にも分かりやすく説明していきます。

RangeとCellsの違いは「指定の仕方」

Excel VBAのRangeとCellsは、どちらもセルを操作するためのものなんですが、一番大きな違いは「セルの指定の仕方」です。

Rangeは「A1」とか「A1:C3」みたいに、Excelの画面で普段見慣れたセル番地を文字で指定します。

一方、Cellsは「1行目の1列目」というふうに、行番号と列番号を数字で指定するんです。

つまり、Rangeは人間が見て分かりやすい方法、Cellsはプログラムで計算しやすい方法、と考えるとスッキリします。

例えば、A1セルに値を入れたいとき、Rangeだと `Range(“A1”).Value = “テスト”` と書きます。

Cellsだと `Cells(1, 1).Value = “テスト”` と書いて、最初の数字が行、次の数字が列を表します。

A列は1、B列は2、C列は3…という感じで列も数字で扱うので、最初はちょっと慣れが必要かもしれません。

でも、繰り返し処理とか最終行を取得するときなど、行や列が変わっていく処理では、Cellsのほうが断然使いやすくなります。

RangeとCellsは「どっちが優れている」とか「どっちが正解」っていう関係じゃありません。

実際の仕事では、固定されたセルや分かりやすい範囲を指定するときはRange、行番号や列番号を変えながら処理するときはCells、という使い分けが基本になります。

最初のうちは、「Rangeはセル番地で指定」「Cellsは行番号・列番号で指定」と覚えておけばOKです。

そのうえで、実際にマクロを書くときは両方を組み合わせることが多い、ということも頭に入れておきましょう。

Rangeが使いやすい場面

Rangeが便利なのは、指定したいセルや範囲が最初から決まっている場面です。

例えば、A1セルにタイトルを入れる、B2からD10の表に罫線を引く、E列全体の表示形式を変える、といった処理では、Rangeを使うとコードが分かりやすくなります。

Excelの画面で見えているセル番地とVBAの指定が同じなので、あとからコードを見返したときにも「どこを操作してるんだっけ?」がすぐに分かります。

よくある書き方はこんな感じです。

“`vba
Range(“A1”).Value = “売上表”
Range(“A1:D10”).Interior.Color = RGB(220, 230, 241)
Range(“B:B”).NumberFormat = “#,##0”
“`

このように、Rangeは1つのセルだけじゃなくて、複数のセル、行全体、列全体の指定にも使えます。

特に `Range(“A1:D10”)` みたいな範囲指定は分かりやすいので、初心者が最初に覚えるセル操作としてぴったりです。

それと、名前付き範囲を使っている場合も `Range(“売上データ”)` みたいに書けるので、意味のある名前で範囲を管理したいときにも便利ですよ。

ただ、Rangeにも弱点があります。

セル番地を文字で書くので、行番号や列番号が変わっていく処理だとコードがちょっとややこしくなるんです。

例えば「2行目から100行目まで順番に処理する」という場合、`Range(“A” & i)` みたいに文字をつなげる必要があります。

この書き方自体はよく使われるんですが、列が増えたり、行と列の両方を変えたりすると、Cellsのほうが自然に書けることが多いです。

もう1つ気をつけたいのが、Rangeの前にシートを指定しないと、今選ばれているシートが対象になっちゃうことです。

例えば `Range(“A1”).Value = “テスト”` とだけ書くと、その時点で開いているシートのA1セルが変更されます。

間違ったシートを書き換えないようにするには、`Worksheets(“Sheet1”).Range(“A1”).Value = “テスト”` みたいに、対象のシートをちゃんと書く習慣をつけるのが大事です。

Cellsが活躍する場面

Cellsが特に力を発揮するのは、行番号や列番号を変数で扱う場面です。

例えば、1行目から最終行まで順番に値をチェックする、表の各列に対して同じ処理を繰り返す、検索結果の行番号を使って別の列に値を書き込む、といった処理では、Cellsを使うとコードがスッキリします。

VBAではFor文などの繰り返し処理をよく使うので、Cellsを理解すると実用的なマクロが作りやすくなります。

例えば、A列の2行目から10行目まで順番にチェックする処理は、こんなふうに書けます。

“`vba
Dim i As Long

For i = 2 To 10
Cells(i, 1).Value = “確認済み”
Next i
“`

このコードでは、`i` が2から10まで変わっていって、`Cells(i, 1)` でA列の2行目から10行目までが順番に指定されます。

Rangeでも `Range(“A” & i)` と書けるんですが、Cellsのほうが「行番号を変えてるんだな」っていう意図がハッキリします。

さらに、列番号も変数にすれば、縦方向だけじゃなくて横方向の処理にも対応できます。

Cellsで間違えやすいのが、引数の順番です。

`Cells(行番号, 列番号)` の順で指定するので、`Cells(3, 2)` はB3セルを意味します。

Excelのセル番地は「列→行」の順に見えるので最初は混乱しやすいんですが、VBAのCellsでは「行→列」と覚えてください。

あと、列番号はA列が1、B列が2、C列が3です。

列名じゃなくて数字で指定する点が、Rangeとの大きな違いですね。

CellsもRangeと同じで、シートを省略するとアクティブシート(今開いてるシート)が対象になります。

特にループ処理で大量のセルを書き換える場合、対象シートを間違えると影響が大きくなっちゃいます。

安全に書くなら、`Worksheets(“Sheet1”).Cells(i, 1).Value` みたいにシートを明示しましょう。

それと、最終行を取得する処理でも `Worksheets(“Sheet1”).Cells(Rows.Count, 1).End(xlUp).Row` みたいに書くことが多いんですが、この場合も対象シートをちゃんと書いておくとより安心です。

RangeとCellsの使い分けと組み合わせ技

RangeとCellsは単独で使うだけじゃなくて、組み合わせるともっと便利になります。

実務でよく使うのが、開始セルと終了セルをCellsで指定して、その間の範囲をRangeでまとめて扱う書き方です。

例えば「2行目のA列から、最終行のD列まで」を指定したいとき、終了行はデータ量によって変わるので、固定の `Range(“A2:D100”)` じゃ対応しきれません。

そこで、Cellsで行番号を変数にして、Rangeで範囲としてまとめるんです。

よく使われる書き方はこんな感じです。

“`vba
Dim ws As Worksheet
Dim lastRow As Long

Set ws = Worksheets(“Sheet1”)
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

ws.Range(ws.Cells(2, 1), ws.Cells(lastRow, 4)).Interior.Color = RGB(255, 255, 200)
“`

このコードでは、A列の最終行を取得して、A2からD列の最終行までの範囲に色を付けています。

ポイントは、`Range(ws.Cells(2, 1), ws.Cells(lastRow, 4))` みたいに、Rangeの中にCellsを入れていることです。

Cellsで「左上のセル」と「右下のセル」を指定して、その2点をRangeで範囲化しています。

この書き方を覚えると、データ件数が毎回変わる表にも対応できるようになりますよ。

ただし、ここですごく大事なのが、RangeとCellsの対象シートを揃えることです。

例えば `Worksheets(“Sheet1”).Range(Cells(2, 1), Cells(lastRow, 4))` みたいに書くと、外側のRangeはSheet1を指してても、内側のCellsはアクティブシートを指しちゃう可能性があります。

その結果、エラーになったり、意図しないシートを参照したりすることがあるんです。

安全な書き方は、上の例みたいに `ws.Range(ws.Cells(…), ws.Cells(…))` と全部同じワークシート変数で統一することです。

使い分けの目安をまとめると、固定セルや固定範囲はRange、繰り返し処理や行列番号を使う処理はCells、可変範囲をまとめて操作するときはRangeとCellsの組み合わせが適しています。

例えば、タイトルセルの設定は `Range(“A1”)` が読みやすいし、最終行までのループは `Cells(i, 1)` が自然です。

そして、表全体に書式を設定する場合は `Range(Cells(開始行, 開始列), Cells(終了行, 終了列))` の形が実務向きですね。

初心者がVBAを書くときは、最初から完璧なコードを目指さなくて大丈夫です。

まずはRangeで分かりやすくセルを指定して、繰り返し処理が必要になったらCellsを使って、データ量が変わる表を扱う段階で両方を組み合わせる、という順番で慣れていくのがおすすめです。

RangeとCellsの違いが分かると、AIやサンプルコードが出したマクロを読む力も上がるし、エラーの原因にも気づきやすくなります。

Excel VBAの自動化ではセル指定が土台になるので、この2つの使い分けを押さえることが、初心者の壁を越える大きな一歩になりますよ。

広告