Range と Cells の使い分け早見表を、初心者でも一瞬で判断できるように超分かりやすくまとめます。
まず最初の結論(覚えやすい)
- 固定のセルを扱う → Range
- 動くセル(行番号や列番号が変わる)を扱う → Cells
早見表(一覧)
| やりたいこと | 例 | Range | Cells | 説明 |
|---|---|---|---|---|
| A1 など固定セルを指定したい | A1 | ◎ | △ | Range(“A1”) のほうが読みやすく短い |
| 複数の固定セルを指定したい | A1:C10 | ◎ | △ | Range(“A1:C10”) が一番見やすい |
| 行番号をループで変えたい | 行1〜10 | △ | ◎ | Cells(i, 1) のほうが圧倒的に簡単 |
| 列番号をループで変えたい | A列→B列 | △ | ◎ | Range(“A” & i) は面倒 |
| 行・列両方が変化する | マス目処理 | △ | ◎ | Cells を使うと簡単に 2次元処理できる |
| 位置を数値で扱いたい | 数字で計算 | △ | ◎ | 行列番号を足す引くがしやすい |
| 動的な範囲を作りたい | 最終行まで | ◯ | ◎ | Range(Cells(〜), Cells(〜)) の形が最強 |
| コード可読性(人が見て分かりやすい) | – | ◎ | △ | Range(“A1”) のほうが自然 |
| 他の人が読んでも理解しやすい | – | ◎ | △ | 文字で位置が明確 |
| 実務でよく使うシーン | データの行処理 | ◯ | ◎ | ループは Cells がほぼ必須 |
初心者向け「これだけ覚えればOK」版
Range を使う場面
- A1 など「固定の場所」を触る
- A1:C10 など「決まった範囲」を触る
- 人に見てすぐ分かるコードを書きたい時
📝 例
Range("A1").Value = "OK"
Range("A1:C10").Interior.Color = vbYellow
VBCells を使う場面
- 行・列が 動く
- i 行目、j 列目のように 変数を使う
- ループで処理をする
- 最終行や最終列まで自動処理したい
- 動的に範囲を作りたい
📝 例
Cells(i, 2).Value = i
Range(Cells(2,1), Cells(lastRow, 3)).ClearContents
VBRange と Cells の「組み合わせ技」
実務で一番よく使うパターン
Range(Cells(2, 1), Cells(lastRow, 3)).Select
VBこれは
- 2行1列(A2)から
- 最終行3列(C最終行)まで
という 動的な範囲を生成できます。
Range だけでは書きにくいので、Cells とセットで使うのが定石。
よくあるミス(初心者が引っかかるポイント)
❌ 行と列を逆にしてしまう
Cells(列, 行) ではありません!
正しくは:
Cells( 行, 列 )
❌ Range(“A” & i) を使ってしまう
間違いではないが、列が変わると途端に難しくなる。
例えば
Range(Chr(64 + j) & i)
VBのような「アルファベット操作」が必要。
Cells を使えば:
Cells(i, j)
VBで終わる。
❌ 動的範囲に Range(“A1”, “A” & lastRow”) と書く
これも間違いではないが 列が変わると破綻する。
→ 正解は Cells を使う
Range(Cells(1, 1), Cells(lastRow, 1))
VB最後に:プロはどう使い分けている?
プロはこう使います:
- 固定セル → Range
- 動くセル → Cells
- 範囲全体 → Range
- 動的範囲 → Range + Cells の合わせ技
例:
Range("A1").Value = "ヘッダー"
Cells(i, 2).Value = "データ"
Range(Cells(2, 1), Cells(lastRow, 5)).ClearContents
VBこれが実務で最も頻出する黄金パターンです。


