VBA CellsとRangeの違いと使い方!初心者でもExcelセルを自由自在に操る基本
VBAを学び始めたばかりの時、「セルを指定する方法が2つもある… `Range(“A1”)` と `Cells(1, 1)` って何が違うの?どっちを使えばいいの?」と手が止まってしまった経験はありませんか。この2つの明確な使い分けを理解することが、VBA上達への最初の大きな一歩です。本記事を読めば、それぞれの得意な場面を理解し、変数を使った柔軟なコードを書けるようになります。
プロ
こんにちは。VBAの学習、順調ですか?
初心者
プロさん!早速壁にぶつかってます…!セルに値を入れたいだけなのに、`Range` と `Cells` っていうのがあって、もうパニックです!どっちも同じA1セルを指せるみたいで…どう使い分ければいいんですか!?
プロ
落ち着いてください。大丈夫ですよ、誰もが通る道です。この2つは得意なことが違うだけなんです。シンプルに `Range` は「住所」、`Cells` は「座標」と考えると、スッキリと理解できますよ。
初心者
住所と座標…? `Range(“A1”)` が「A1番地」という住所で、`Cells(1, 1)` が「上から1番目、左から1番目」という座標、みたいな感じですか?
プロ
その通りです!完璧な理解です。`Range` は人間が見て分かりやすい「名前」で指定し、`Cells` はコンピュータが計算しやすい「数値」で指定するイメージです。この仕組みの違いが、繰り返し処理などで大きな差を生むんですよ。
RangeとCellsの基本的な書き方
・Range: 「A1」や「B2:C10」のように、場所が固定されている単一または複数のセルを、見たまま直感的に指定したい場合に使う。
・Cells: `(行番号, 列番号)` のように数値で指定するため、変数やループ処理(For Nextなど)と組み合わせて、動的にセルを移動させたい場合に絶大な効果を発揮する。
具体的なコードを見てみましょう。`Range`は範囲指定も得意ですが、`Cells`は単一セルの指定が基本です。
'【Rangeの例】
' A1セルに値を設定
Range("A1").Value = "こんにちは"
' B2からC5の範囲の値をクリア
Range("B2:C5").ClearContents
'【Cellsの例】
' 1行目・1列目(つまりA1セル)に値を設定
Cells(1, 1).Value = "こんにちは"
' 3行目・2列目(つまりB3セル)に値を設定
Cells(3, 2).Value = 100
なぜCellsが重要なのか?繰り返し処理での威力
初心者
なるほど!でも、`Range(“A1”)` の方がパッと見て分かりやすいし、こっちだけ使っちゃダメなんですか?つい全部`Range`で書きたくなってしまいます…!
プロ
いい質問ですね。では、もし「A1セルからA10セルまで、順番に1, 2, 3…と連番を入れる」という処理をしたい時、`Range` だとどう書きますか?
初心者
ええと…`Range(“A1”).Value = 1`、`Range(“A2”).Value = 2`、`Range(“A3”).Value = 3`…って10行書くんですか!?それは大変すぎます!
プロ
そうなんです。そこで「座標」である`Cells`の出番です。`Cells`なら「i行目の1列目」のように、行番号を変数 `i` にして繰り返し処理(Forループ)で書けます。コードが劇的に短く、そして柔軟になります。これこそがVBAの真骨頂です。
以下の手順で、`Cells`を使った繰り返し処理を実際に体験してみましょう。
- Excelで Alt + F11 キーを押し、VBE(Visual Basic Editor)を開きます。
- メニューバーの「挿入」から「標準モジュール」を選択します。
- 白紙のコードウィンドウが表示されたら、以下のサンプルコードをコピー&ペーストします。
- コード内にカーソルを置いた状態で F5 キーを押してマクロを実行します。
- Excelシートに戻り、A1セルからA10セルに連番が入力されていることを確認してください。
Sub CellsLoopExample()
' 変数iを1から10まで1ずつ増やしながら繰り返す
Dim i As Long
For i = 1 To 10
' i行目の1列目(A列)のセルに値を設定
' iが1の時はCells(1, 1)、iが2の時はCells(2, 1)...と動的に変化する
Cells(i, 1).Value = i & "番目のデータ"
Next i
End Sub
よくある落とし穴と対策
`Cells`と`Range`の使い分けに慣れないうちは、いくつかの典型的なミスが起こりがちです。事前に知っておくことで、エラーの解決時間を大幅に短縮できます。
| 原因(よくある間違い) | 対処法 | 一言メモ |
|---|---|---|
| `Cells`で範囲指定(例:A1:C10)をしようとして混乱する。 | 範囲指定は Range("A1:C10") が基本。`Cells` を使うなら Range(Cells(1, 1), Cells(10, 3)) のように組み合わせる。 |
始点と終点を`Cells`で指定する応用テクニックです。 |
Cells(1, "B") のように列をアルファベットで指定してエラーになる。 |
Cells の引数は Cells(行番号, 列番号) の順で、両方とも数値で指定する。 |
B列は2、C列は3…と左から数えた番号を入れます。 |
| シートを明示せず、意図しないアクティブシートに書き込んでしまう。 | Worksheets("データ").Cells(1, 1) のように、必ず対象シートを明記する癖をつける。 |
これがバグの温床。コードの可読性も格段に上がります。 |
ループ処理で Range("A" & i) のように文字列結合を使ってしまう。 |
ループ内でのセル指定は、原則として Cells(i, 1) を使う。 |
数千行レベルになると、このわずかな差が体感速度に影響します。 |
まとめ:RangeとCellsを使いこなすための3つのポイント
- `Range`は「住所」: “A1″や”B2:C5″など、場所が固定されたセルを直感的に指定するのに最適です。
- `Cells`は「座標」: `(行番号, 列番号)`で指定するため、変数を使ったForループ(繰り返し処理)との相性が抜群で、VBAの力を最大限に引き出します。
- 使い分けが重要: 「ここは固定だから`Range`」「ここは繰り返すから`Cells`」と意識的に選択することで、あなたのコードはより柔軟で、読みやすく、効率的になります。
まずは今開いているExcelシートで、A1からA20まで「`Cells`を使ったForループ」で連番を書き込むマクロを試してみましょう。この小さな一歩が、自動化への大きな飛躍につながります。



コメント