VBAで最終行を取得するには Cells(Rows.Count, 1).End(xlUp).Row を使います。これはExcelの一番下のセルから上に向かって検索し、データがある最初のセルの行番号を返します。ループ処理でよく使うコードなので、形を覚えておくと便利です。
この記事では、次の内容を順番に解説します。
- 最終行を取得するコードの意味
- 変数に入れて使う方法
- ループ処理への応用
- 最終行の1行下にデータを追加する方法
最終行を取得するコードとは?
次のコードが最終行を取得する基本の形です。
Cells(Rows.Count, 1).End(xlUp).Row
一見難しそうですが、3つのパーツに分けると理解しやすくなります。
① Cells(Rows.Count, 1) ― シートの一番下のセルを指定する
Rows.Count はシートの最大行数(Excel2007以降では1,048,576)を返します。つまり Cells(Rows.Count, 1) は「A列の一番下のセル(A1048576)」を指定しています。
列を変えたい場合は 1 の部分を変えます。B列なら 2、C列なら 3 です。
② .End(xlUp) ― 上に向かって検索する
一番下のセルから上に向かってデータを探します。Excelで Ctrl + 上矢印 を押す操作と同じです。データがある最初のセルで止まります。
③ .Row ― 行番号を取得する
見つかったセルの「行番号」を取り出します。これがないとセルそのものが返ってきてしまい、ループ処理などで使えません。
変数に入れて使うには?
最終行は毎回コードに直接書くより、変数に入れておく方が使い回しやすくなります。
Dim lastRow As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
lastRow にA列の最終行の行番号が入ります。この変数を使って「1行目から最終行まで処理する」といったループが書けます。
最終行までループ処理するには?
最もよく使うパターンです。A列に「〇」が入っている行を赤背景にする例です。
Dim lastRow As Long
Dim i As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
For i = 1 To lastRow
If Cells(i, 1).Value = "〇" Then
Cells(i, 1).Interior.Color = RGB(255, 0, 0)
End If
Next i
コードの流れ
- まずA列の最終行を取得して
lastRowに入れます。 - 1行目から最終行まで1行ずつ確認します。
- A列の値が「〇」であれば、そのセルを赤背景にします。
データの行数が変わっても、最終行を自動で取得しているので、コードを変更する必要がありません。
最終行の1行下にデータを追加するには?
新しいデータを表の一番下に追加したい場合は、最終行に1を足した行を指定します。
Dim lastRow As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
Cells(lastRow + 1, 1).Value = "新しいデータ"
lastRow + 1 がデータの入っていない次の行になります。
どの列を基準にするかが大切
最終行を取得するとき、基準にする列の選び方が重要です。途中で空白が入る可能性のある列を指定すると、正しい最終行が取れないことがあります。
必ずデータが入っている列(たとえばIDや日付など、絶対に空白にならない列)を基準にするのがおすすめです。
まとめ
最終行の取得はVBAで最もよく使うコードのひとつです。形を覚えてしまえば、あとは列番号を変えるだけでどんな場面にも使えます。
- 基本形:
Cells(Rows.Count, 列番号).End(xlUp).Row - 列を変える:
1の部分をB列なら2、C列なら3に変える。 - 変数に入れる:
lastRow = Cells(Rows.Count, 1).End(xlUp).Rowとして使い回す。 - ループに使う:
For i = 1 To lastRowでデータがある行だけを処理できる。 - 次の行に追加:
lastRow + 1で最終行の1行下を指定できる。
よくある質問
最終行が正しく取得できない場合は?
基準にしている列の途中に空白セルがある場合、空白の手前の行が最終行として返ってきます。空白のない列を基準に変えるか、データを整理してから実行しましょう。
最終列を取得したい場合は?
Cells(1, Columns.Count).End(xlToLeft).Column を使います。行ではなく列方向に探す場合は xlToLeft(左へ)を使い、.Row の代わりに .Column で列番号を取得します。
1行目がヘッダーの場合、ループを2行目から始めるには?
For i = 2 To lastRow のように開始行を2にします。1行目がヘッダーの場合はこの書き方が基本です。
別のシートの最終行を取得したい場合は?
Sheets("シート名").Cells(Rows.Count, 1).End(xlUp).Row のようにシート名を先頭に指定します。今開いているシート以外の最終行を取得したい場合に使います。
データが1件もない場合はどうなる?
A列にデータが何も入っていない場合、End(xlUp) は1行目まで上がって止まるため、1 が返ります。データがあるかどうか先に確認してからループを実行するのが安全です。
動画で学びたい方へ
「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。
VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。



