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つの使い分けを押さえることが、初心者の壁を越える大きな一歩になりますよ。
広告
