Excel VBA | 超初心者(Excel操作+マクロ体験):Excelオブジェクト基礎 - Cells

Excel VBA VBA
スポンサーリンク

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~最終行など)を柔軟に扱える

VBAVBA
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました