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

Excel VBA VBA
スポンサーリンク

「最終行取得」は“どこまでデータが入っているか”を知るための超重要テクニック

まずイメージから。
「最終行取得」は「この列は、いったい何行目までデータが入っているのか?」をコードで調べることです。

Excel でよくあるのは、

毎回データの行数が変わる
今日は 50 行、明日は 120 行、来週は 300 行…

このときに「A2 から A100 までループ」みたいに固定で書いてしまうと、
足りなかったり、余計な空白を回ったりします。

だからこそ、

「まず最終行を調べる」
「その最終行までを処理する」

というパターンが、VBA では“定番中の定番”になります。


一番よく使う最終行取得パターン:Cells(Rows.Count, 列).End(xlUp).Row

A列の最終行を取得する基本形

最初に、形をそのまま覚えてしまってOKな“定番コード”を出します。

Sub SampleLastRowBasic()

    Dim ws As Worksheet
    Dim lastRow As Long

    Set ws = ThisWorkbook.Worksheets("入力")

    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    MsgBox "A列の最終行は " & lastRow & " 行目です。"

End Sub
VB

ここでやっていることを、ゆっくり分解します。

ws.Rows.Count
そのシートの「行数の最大値」です。
Excel のバージョンにもよりますが、だいたい 1,048,576 行です。

ws.Cells(ws.Rows.Count, 1)
「A列(1列目)の、一番下のセル」です。
つまり A1048576 みたいなセルを指しています。

.End(xlUp)
その一番下のセルから、Ctrl+↑ を押したのと同じ動きです。
「上方向に向かって、最初に出会う“何か入っているセル”」にジャンプします。

.Row
そのセルの行番号を取り出します。

つまり、

「A列の一番下から上に向かって、最後にデータが入っているセルを探し、その行番号を lastRow に入れる」

という意味になります。

この1行は、ほぼ“おまじない”として丸暗記してしまって大丈夫です。
大事なのは、「何をしているか」を言葉で説明できるようになることです。


最終行を使って「可変範囲」を扱う基本パターン

A列の2行目から最終行までをループする

最終行を取ったら、次にやりたいのは「そこまで処理する」ですよね。

Sub SampleLoopWithLastRow()

    Dim ws As Worksheet
    Dim lastRow As Long
    Dim r As Long

    Set ws = ThisWorkbook.Worksheets("入力")

    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row   ' A列の最終行

    For r = 2 To lastRow
        ' A列の値をメッセージ表示(例)
        MsgBox "A" & r & " の値は " & ws.Cells(r, 1).Value
    Next r

End Sub
VB

流れはこうです。

A列の最終行を lastRow に入れる
2 行目から lastRow 行目まで For で回す
ws.Cells(r, 1) で「A列の r 行目」を指す

この「最終行までループ」は、実務で本当に何度も出てきます。

最終行までを Range としてつかまえて、一気に処理する

ループだけでなく、「範囲」として握るパターンもよく使います。

Sub SampleRangeWithLastRow()

    Dim ws As Worksheet
    Dim lastRow As Long
    Dim rng As Range

    Set ws = ThisWorkbook.Worksheets("入力")

    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row   ' A列の最終行

    Set rng = ws.Range("A2:C" & lastRow)

    rng.Interior.Color = vbYellow   ' その範囲を全部黄色にする例

End Sub
VB

ここでは、

A列の最終行を lastRow に入れる
“A2:C” & lastRow で、「A2 から C最終行まで」の文字列を作る
その範囲を Range として Set する
その Range に対して Interior.Color などの処理をする

という流れです。

「最終行を使って、可変長の Range を作る」
このパターンを覚えると、かなり自由度が上がります。


どの列を基準に最終行を取るか、を意識する

「A列に必ずデータが入っている」とは限らない

さっきの例では A列を基準にしましたが、
実務では「どの列を基準にするか」がとても重要です。

例えば、こんな表があるとします。

A列:ID(必ず入っている)
B列:名前(必ず入っている)
C列:金額(空欄の行もある)

この場合、「C列の最終行」を取ると、途中で空欄があったときに、
本当の最終行より手前で止まってしまう可能性があります。

なので、

「この表では、A列には必ずデータが入っている」
→ A列を基準に最終行を取る

というように、“必ず埋まっている列”を基準にするのが鉄則です。

列番号を変えるだけで、他の列にも応用できる

A列 → 1
B列 → 2
C列 → 3

なので、例えば B列を基準にしたければ、こう書きます。

lastRow = ws.Cells(ws.Rows.Count, 2).End(xlUp).Row   ' B列の最終行
VB

列番号を変えるだけで、同じパターンがそのまま使えます。


他の最終行取得パターンもあるけれど、まずは「End(xlUp)」を軸にする

UsedRange や CurrentRegion という方法もある

最終行を取る方法は他にもあります。

lastRow = ws.UsedRange.Rows(ws.UsedRange.Rows.Count).Row
VB

とか、

lastRow = ws.Range("A1").CurrentRegion.Rows.Count
VB

など。

ただ、超初心者の段階では、
「Cells(Rows.Count, 列).End(xlUp).Row」だけをまず完璧に使いこなす方が圧倒的に価値があります。

理由はシンプルで、

どの本・どのサイトにも必ず出てくる
ほぼすべての現場コードで使われている
「一番下から Ctrl+↑」というイメージが分かりやすい

からです。


まとめ:「最終行取得」は“可変長の表”を扱うための入口

最終行取得の本質は、

「毎回行数が変わる表に対して、“どこまでがデータなのか”をコードで知ること」

です。

押さえておきたいポイントをコンパクトにまとめると、

定番形は Cells(Rows.Count, 列).End(xlUp).Row(一番下から Ctrl+↑ のイメージ)
最終行を lastRow に入れて、「2 ~ lastRow までループ」「A2:C lastRow を Range にする」が基本パターン
“必ず埋まっている列”を基準に最終行を取るのが大事
まずはこのパターンを“おまじない”として丸暗記しつつ、「何をしているか」を言葉で説明できるようにする

タイトルとURLをコピーしました