VBAで最終行を取得する方法|Cells(Rows.Count,1).End(xlUp).Rowの使い方

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が初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。

動画で学ぶExcelマクロ|JIMOVEオンラインスクール

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール