VBA CellsとRangeの違いと使い方!

Excel小技part3

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`を使った繰り返し処理を実際に体験してみましょう。

  1. Excelで Alt + F11 キーを押し、VBE(Visual Basic Editor)を開きます。
  2. メニューバーの「挿入」から「標準モジュール」を選択します。
  3. 白紙のコードウィンドウが表示されたら、以下のサンプルコードをコピー&ペーストします。
  4. コード内にカーソルを置いた状態で F5 キーを押してマクロを実行します。
  5. 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ループ」で連番を書き込むマクロを試してみましょう。この小さな一歩が、自動化への大きな飛躍につながります。

コメント