Excel VBAでデータを扱う際、「最終行を取得したい」という場面はとても多いです。
たとえば、「データの最後まで自動で処理したい」「追加データを最終行の次に書き込みたい」といった場合、最終行を正確に取得できるかどうかでコードの完成度が大きく変わります。
この記事では、Excel VBAで最終行を取得するさまざまな方法を、初心者にもわかりやすく解説します。
「Endプロパティ」「UsedRange」「Findメソッド」など、状況に応じた最適な書き方を紹介し、実務でもすぐに使えるサンプルコードを掲載しています。
1. 最終行を取得する目的とは?
最終行を取得する理由は主に次の3つです。
- データの最終行まで自動処理したいとき
たとえば、売上データを上から順番に処理したい場合、毎回行数を手で指定していては面倒です。
最終行をVBAで自動的に取得できれば、どんな長さのデータでも対応可能です。 - 新しいデータを最終行の下に追加したいとき
「毎回違う長さのデータに追記する」場合、どの行が空いているか自動で見つける必要があります。 - 不要データの削除やコピー範囲の指定に使いたいとき
最終行がわかれば、コピー範囲や削除範囲を正確に指定できます。
このように、最終行の取得は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)だけでは正確な最終行が取得できないことがあります。
その場合は、UsedRange+Findの組み合わせが有効です。
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データに合わせて、最適な方法を選んで試してみましょう。


コメント