Excel VBAで最終行を取得する方法を徹底解説!用途別コード例付き

パソコン

Excel VBAでデータを扱う際、「最終行を取得したい」という場面はとても多いです。
たとえば、「データの最後まで自動で処理したい」「追加データを最終行の次に書き込みたい」といった場合、最終行を正確に取得できるかどうかでコードの完成度が大きく変わります。

この記事では、Excel VBAで最終行を取得するさまざまな方法を、初心者にもわかりやすく解説します。
「Endプロパティ」「UsedRange」「Findメソッド」など、状況に応じた最適な書き方を紹介し、実務でもすぐに使えるサンプルコードを掲載しています。


1. 最終行を取得する目的とは?

最終行を取得する理由は主に次の3つです。

  1. データの最終行まで自動処理したいとき
     たとえば、売上データを上から順番に処理したい場合、毎回行数を手で指定していては面倒です。
     最終行をVBAで自動的に取得できれば、どんな長さのデータでも対応可能です。
  2. 新しいデータを最終行の下に追加したいとき
     「毎回違う長さのデータに追記する」場合、どの行が空いているか自動で見つける必要があります。
  3. 不要データの削除やコピー範囲の指定に使いたいとき
     最終行がわかれば、コピー範囲や削除範囲を正確に指定できます。

このように、最終行の取得はExcel VBAを自動化する上で欠かせない基本テクニックです。


2. 最終行取得の基本:Endプロパティを使う方法

最も基本的でよく使われるのが、Endプロパティを利用する方法です。
Excelのショートカットキー「Ctrl+↓」と同じ動作をVBAで実行します。

Sub GetLastRow_End()
    Dim lastRow As Long
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row
    MsgBox "最終行は " & lastRow & " 行目です"
End Sub

コードの解説

  • Cells(Rows.Count, 1):ワークシートの最終行(1048576行目)のA列を指定
  • .End(xlUp):上方向に移動して、データがある最初のセルを見つける
  • .Row:そのセルの行番号を取得

つまり、「A列の最下行から上に向かって最初にデータがある行」を探しています。
この方法は連続データのある表に最適です。


3. 列を指定して最終行を取得する方法

データがA列だけにあるとは限りません。
特定の列に基づいて最終行を取得したい場合は、列番号を指定します。

Sub GetLastRow_SpecificColumn()
    Dim lastRow As Long
    lastRow = Cells(Rows.Count, "C").End(xlUp).Row
    MsgBox "C列の最終行は " & lastRow & " 行目です"
End Sub

このように "C" の部分を変更するだけで、任意の列の最終行を取得できます。
売上データや社員リストなど、特定列を基準にするケースで有効です。


4. UsedRangeを使って最終行を取得する方法

Excelシートの中で実際に使われている範囲を基に最終行を取得する方法です。

Sub GetLastRow_UsedRange()
    Dim lastRow As Long
    lastRow = ActiveSheet.UsedRange.Rows(ActiveSheet.UsedRange.Rows.Count).Row
    MsgBox "最終行は " & lastRow & " 行目です"
End Sub

特徴と注意点

  • UsedRangeは一度でも使われたセルを含みます。
  • そのため、以前にデータを削除しても「見た目より広い範囲」を取得することがあります。

削除後に正確な範囲を取りたい場合は、UsedRangeを再計算するために次のようにします。

ActiveSheet.UsedRange '再計算

この一文を入れるだけで、範囲がリセットされます。


5. Findメソッドを使って最終行を取得する方法

Findメソッドを使えば、より柔軟に最終行を取得できます。
特定の条件で検索して最後のセルを探すときに便利です。

Sub GetLastRow_Find()
    Dim lastRow As Long
    Dim rng As Range

    Set rng = Cells.Find(What:="*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious)
    If Not rng Is Nothing Then
        lastRow = rng.Row
        MsgBox "最終行は " & lastRow & " 行目です"
    Else
        MsgBox "データが見つかりませんでした"
    End If
End Sub

コードのポイント

  • What:="*":空白以外のセルを検索
  • SearchDirection:=xlPrevious:最後(下方向)から検索
  • Findを使うと、セルの位置に関係なく最終行を確実に特定できます。

この方法は、複雑な表構造(途中に空白行があるなど)の場合でも有効です。


6. UsedRangeとFindを組み合わせて精度を高める

途中に空白行があるような表では、End(xlUp)だけでは正確な最終行が取得できないことがあります。
その場合は、UsedRangeFindの組み合わせが有効です。

Sub GetLastRow_Combined()
    Dim lastRow As Long
    Dim rng As Range

    With ActiveSheet.UsedRange
        Set rng = .Find(What:="*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious)
        If Not rng Is Nothing Then
            lastRow = rng.Row
            MsgBox "最終行は " & lastRow & " 行目です"
        End If
    End With
End Sub

この方法は、空白行が多いシートや複雑なレイアウトのデータでも正確に最終行を取得できます。


7. 最終行を使ってデータを自動処理する例

実際の業務では、「最終行を取得してその行まで繰り返す」処理がよく使われます。
たとえば、A列のデータをB列にコピーする例を見てみましょう。

Sub CopyDataToNextColumn()
    Dim lastRow As Long
    lastRow = Cells(Rows.Count, "A").End(xlUp).Row

    Dim i As Long
    For i = 1 To lastRow
        Cells(i, "B").Value = Cells(i, "A").Value
    Next i
    MsgBox "A列のデータをB列にコピーしました"
End Sub

このように、lastRowを変数として使えば、データ量が変動しても自動的に対応できます。


8. 空白行を除外して最終行を取得する方法

データの途中に空白行があると、End(xlUp)では正確に取得できないことがあります。
そんな時は、下記のように逆方向ループで最後のデータを探します。

Sub GetLastRow_IgnoreBlanks()
    Dim i As Long
    For i = Rows.Count To 1 Step -1
        If Application.WorksheetFunction.CountA(Rows(i)) > 0 Then
            MsgBox "最終行は " & i & " 行目です"
            Exit For
        End If
    Next i
End Sub

この方法は、シート全体の中で一番下にあるデータ行を見つけられるため、より正確です。


9. 特定のシートから最終行を取得する

複数のシートを扱うときは、どのシートの最終行かを明確に指定する必要があります。

Sub GetLastRow_SpecifiedSheet()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("売上データ")

    Dim lastRow As Long
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

    MsgBox ws.Name & " の最終行は " & lastRow & " 行目です"
End Sub

ws(ワークシートオブジェクト)を使うことで、任意のシートを明示的に指定できます。


10. まとめ

Excel VBAで最終行を取得する方法は、目的やデータの構造によって使い分けるのがポイントです。

方法特徴向いているケース
End(xlUp)最も一般的・高速連続したデータ
UsedRange使用中の範囲全体を取得表全体を扱う場合
Find空白を含むデータにも対応複雑な表構造
逆方向ループ最も確実だが遅い精度重視の処理
シート指定複数シート対応自動処理・定期処理

最終行を正確に取得できるようになると、データ入力、集計、レポート作成など、あらゆる処理を自動化できます。
まずは自分のExcelデータに合わせて、最適な方法を選んで試してみましょう。

コメント

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