Cells は「行番号・列番号でセルを指定するための道具」
まずイメージからいきます。
Range(“A1”) が「住所(A1)」でセルを指定するのに対して、
Cells(行番号, 列番号) は「座標(行・列の数字)」でセルを指定します。
A1 → 行1・列1
B3 → 行3・列2
みたいな感じです。
「ループで行番号を動かしたい」「列を変数で扱いたい」といったとき、
Cells はめちゃくちゃ強力になります。
Cells の一番基本:行・列でセルを指定する
A1 と B3 を Cells で書いてみる
Sub SampleCellsBasic()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("入力")
ws.Cells(1, 1).Value = "A1 と同じ場所"
ws.Cells(3, 2).Value = "ここは B3"
End Sub
VBここでの対応関係はこうです。
行1・列1 → A1
行3・列2 → B3
つまり、Cells(行, 列) は「行と列を数字で指定する Range」と考えてOKです。
実際、ws.Cells(1, 1) も ws.Range("A1") も、どちらも Range オブジェクトです。
「どのシートの Cells か」を必ず書く
Cells だけで書くと“アクティブシート依存”になる
いきなりこう書くこともできます。
Cells(1, 1).Value = "A1"
VBこれは「アクティブなシートの、行1・列1(A1)」を意味します。
一見楽ですが、「どのシートがアクティブか」によって書き込まれる場所が変わるので、バグの元です。
超初心者のうちから、必ずこう書く癖をつけてください。
ws.Cells(1, 1).Value = "このシートの A1"
VBどのシートか → ws(Worksheet 変数)
その上の Cells(1, 1) → A1
というふうに、「ブック → シート → Cells」という順番でたどるのが基本です。
ループと Cells の相性は抜群
行番号を変数で動かしながら書き込む
Cells の真価は、「行・列を変数で動かせる」ところにあります。
Sub SampleCellsLoopRow()
Dim ws As Worksheet
Dim i As Long
Set ws = ThisWorkbook.Worksheets("入力")
For i = 1 To 10
ws.Cells(i, 1).Value = i
Next i
End Sub
VBこのコードは、「入力シートの A1~A10 に、1~10 の数字を書き込む」処理です。
ポイントは、
i が 1, 2, 3… と変わるたびに
Cells(i, 1) が A1, A2, A3… と動いていく
というところです。
Range(“A1”) だけでは「固定の1セル」しか指せませんが、
Cells(i, 1) なら「行を自由に動かせる」ようになります。
列番号も変数で動かす
列も同じように動かせます。
Sub SampleCellsLoopColumn()
Dim ws As Worksheet
Dim j As Long
Set ws = ThisWorkbook.Worksheets("入力")
For j = 1 To 5
ws.Cells(1, j).Value = j
Next j
End Sub
VBこれは、「入力シートの 1行目、A~E 列に 1~5 を書き込む」処理です。
行を i、列を j のように変数で持てるようになると、
「表全体を走査する」「条件に応じて位置を変える」といったことが簡単に書けるようになります。
Cells と Range を組み合わせて「可変範囲」を扱う
2つの Cells で Range を作る
Cells は単体でも使えますが、Range と組み合わせるとさらに強力です。
Sub SampleRangeWithCells()
Dim ws As Worksheet
Dim lastRow As Long
Set ws = ThisWorkbook.Worksheets("入力")
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row ' A列の最終行を求める
ws.Range(ws.Cells(1, 1), ws.Cells(lastRow, 1)).Value = "★"
End Sub
VBここでやっていることは、
A列の最終行を lastRow に求める
Range(Cells(1, 1), Cells(lastRow, 1)) で「A1 から A最終行まで」の範囲を作る
その範囲全部に “★” を入れる
という流れです。
重要ポイントは、
Range(開始セル, 終了セル) の両方に Cells を使うことで、
「どこからどこまで」を変数で柔軟に決められる
ということです。
Cells を使うときに意識してほしい重要ポイント
「行・列を数字で持てる」ことが最大の武器
Range(“A1”) だけだと、「A1」という固定の場所しか指せません。
Cells(行, 列) を使うと、
行番号を変数 i
列番号を変数 j
のように持てるので、
For 文と組み合わせて「表全体を自由に動き回る」コードが書けます。
これは、VBA で実務的な処理を書くうえで、かなり重要な感覚です。
必ず「どのシートの Cells か」を書く
もう一度強調しますが、
Cells(1, 1)
VBだけで書くのは、アクティブシートに依存してしまう危険な書き方です。
ws.Cells(1, 1)
ThisWorkbook.Worksheets("入力").Cells(1, 1)
VBのように、「ブック → シート → Cells」という順番を崩さない書き方を、
超初心者のうちから体に染み込ませておくと、後で本当に楽になります。
まとめ:Cells は「行・列の数字でセルを操るための鍵」
Cells の本質は、
「セルを“行番号・列番号”で指定するための仕組み」
です。
押さえておきたいポイントをコンパクトにまとめると、
Cells(行, 列) は、その位置のセルを表す Range(A1 なら Cells(1,1))
必ず「どのシートか」を付けて ws.Cells(行, 列) の形で書く
For 文と組み合わせると、行や列を変数で動かしながら処理できる
Range と組み合わせて、可変範囲(A1~最終行など)を柔軟に扱える
