「最終行取得」は“どこまでデータが入っているか”を知るための超重要テクニック
まずイメージから。
「最終行取得」は「この列は、いったい何行目までデータが入っているのか?」をコードで調べることです。
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 にする」が基本パターン
“必ず埋まっている列”を基準に最終行を取るのが大事
まずはこのパターンを“おまじない”として丸暗記しつつ、「何をしているか」を言葉で説明できるようにする
