Excelでデータを扱っていると、「最終行がどこなのか」を知りたい場面は非常に多いものです。
たとえば、毎月更新される売上データや、日々追加される顧客リストなど、行数が変わるデータを自動で処理したいときに、最終行の取得は欠かせないスキルと言えるでしょう。
最終行を取得する方法は大きく分けて、関数を使う方法とVBAを使う方法の2種類があります。
関数では COUNTA・MATCH・LOOKUP などが代表的で、VBAでは End(xlDown) や End(xlUp)、UsedRange などのコードがよく使われます。
本記事では、最終行を調べる基本的な考え方から、関数・VBAそれぞれの実践的な使い方、さらに最終行まで自動でループ処理を行う応用テクニックまで、順を追ってわかりやすく解説していきます。
初心者の方でも迷わず実践できるよう、画像イメージも豊富に掲載していますので、ぜひ最後までご覧ください。
エクセルで最終行を取得するならこの方法が最短!
それではまず、エクセルで最終行を取得する方法の結論からお伝えしていきます。
手軽に最終行の「行番号」を知りたい場合、関数だけで完結させる方法が最もシンプルです。
一方、マクロや自動処理を組み込みたい場合は、VBAの End(xlUp) を使う方法が定番中の定番と言えるでしょう。
それぞれの特徴を以下の表で比較してみましょう。
| 方法 | 主な用途 | 難易度 | リアルタイム更新 |
|---|---|---|---|
| COUNTA関数 | データ件数を数えて最終行を把握 | ★☆☆ | あり |
| MATCH関数 | 特定列の最終行番号を取得 | ★★☆ | あり |
| VBA End(xlUp) | マクロ内で最終行を動的取得 | ★★☆ | 実行時のみ |
| VBA UsedRange | シート全体の使用範囲から取得 | ★★☆ | 実行時のみ |
目的に合わせて方法を選ぶことが、効率的な作業への近道です。
COUNTA関数で最終行の行数を調べる
COUNTA関数は、指定した範囲の中で「空白でないセルの数」を返す関数です。
データが1行目のヘッダーから始まっている場合、COUNTA関数の結果にヘッダー行数を足すことで、最終行の番号を求めることができます。
【数式例】 =COUNTA(A:A)
A列のデータ件数(空白以外のセル数)を返します。
ヘッダーが1行ある場合、最終データ行 = COUNTA(A:A) の値がそのまま最終行番号になります。
以下のイメージ図をご確認ください。

COUNTA関数は空白セルを無視するため、途中に空白行があると正確な最終行を取得できない点に注意が必要です。
データに空白が含まれない整ったリストであれば、最もシンプルな方法として活用できます。
MATCH関数で最終行番号を動的に取得する
MATCH関数を使うと、より柔軟に最終行番号を取得できます。
特に、数値データが並ぶ列で最終行を求めたい場合に有効な方法です。
【数式例】 =MATCH(MAX(A:A),A:A,0)
A列の最大値がある行番号(=最終データ行)を返します。
連番などの昇順データに最適です。
また、文字列データに対しては以下のような数式も有効です。
【数式例】 =MATCH(“zzz”,A:A,1)
文字列列の中で、最後にデータがあるセルの行番号を返します。
検索値に非常に大きな値や “zzz” などの文字列を指定し、一致モードを「1(以下)」にすることで最終行を求めるテクニックはよく使われます。
Ctrl+Endで最終行を目視確認する方法
関数を使わずに手軽に最終行を確認する方法もあります。
キーボードで Ctrl+End を押すと、データが入力されている最終セル(右下隅)へ一瞬でジャンプできます。
行番号を目視で確認したいだけのシーンでは、このショートカットが最も手っ取り早い方法でしょう。
ただし、一度データを削除したセルが「使用済み」として残ってしまう場合があるため、意図しない行が最終行として表示されることもある点に注意してください。
関数だけで最終行を取得するテクニック集
続いては、VBAを使わずに関数だけで最終行を取得するさまざまなテクニックを確認していきます。
Excelの関数を組み合わせることで、ダイナミックに変化するデータ範囲に対応した数式を作ることが可能です。
LOOKUP関数で最終行の値そのものを取得する
最終行の「行番号」ではなく、最終行に入力されている「値」を取得したい場面もあるでしょう。
そのような場合は LOOKUP関数が非常に便利です。
【数式例】 =LOOKUP(2,1/(A2:A1000<>””),A2:A1000)
A2〜A1000の範囲で、最後に値が入っているセルの「値」を返します。
空白セルが途中にあっても正しく動作します。
この数式の仕組みは少し複雑ですが、「空白でないセルに1、空白セルに0を割り当てて、最後の1に対応する値を探す」という考え方に基づいています。
空白が混在するデータでも安定して動作するため、実務でも頻繁に活用される数式です。
=LOOKUP(2,1/(A2:A1000<>””),A2:A1000)
| A | B | C | |
|---|---|---|---|
| 1 | 商品名 | 数量 | |
| 2 | りんご | 10 | |
| 3 | (空白) | ← 空白行があってもOK | |
| 4 | みかん | 25 | |
| 5 | バナナ | 8 | |
| 6 | |||
| 8 | 最終行の値 | =LOOKUP(2,1/(A2:A1000<>””),A2:A1000) → バナナ |
INDEX関数とCOUNTA関数を組み合わせる方法
INDEX関数と COUNTA関数を組み合わせると、最終行の値を取得する汎用的な数式が作れます。
【数式例】 =INDEX(A:A,COUNTA(A:A))
A列のデータ件数番目(=最終行)の値を返します。
ヘッダー行がある場合は =INDEX(A:A,COUNTA(A:A)+1) に調整しましょう。
INDEX関数は指定した行・列番号のセルの値を返す関数であり、COUNTA関数で求めた行数を組み合わせることで最終行を動的に参照できます。
数式がシンプルで読みやすいため、他のメンバーとファイルを共有する際にも理解されやすい方法でしょう。
ROW関数とIF関数で最終行番号を求める応用例
最終行番号をより細かく制御したい場合は、ROW関数・IF関数・MAX関数を組み合わせる方法もあります。
【配列数式例】 =MAX(IF(A2:A100<>””,ROW(A2:A100)))
Ctrl+Shift+Enter で確定(配列数式)します。
A2〜A100の範囲で、最後にデータがある行の「行番号」を返します。
この数式は途中に空白行があっても正確に機能するため、不規則なデータにも対応できます。
Excel 365や2019以降であれば、通常のEnterで確定できる場合もあります。
VBAで最終行を取得する方法(コード解説)
続いては、VBAを使って最終行を取得する方法を確認していきます。
VBAで最終行を取得できると、データ量に左右されない完全自動の処理を組み立てることができるようになります。
マクロの中で最もよく使われるのが End プロパティを利用した方法です。
End(xlUp)で最終行を取得する基本コード
VBAで最終行を取得する定番の書き方が「End(xlUp)」を使う方法です。
【VBAコード例】
Dim lastRow As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
MsgBox “最終行は ” & lastRow & ” 行目です”
このコードは「A列の最終行(Rows.Count行)から上方向に向かって、最初にデータが入っているセルを探す」という動きをします。
Rows.Count は Excel の最大行数(1,048,576)を示すため、どんなにデータが多くても対応できる点が強みです。
End(xlUp) は「下から上に向かって最初のデータを探す」動作のため、途中に空白行があっても最終行を正確に取得できます。
実務で最もよく使われる最終行取得の定番コードとして、ぜひ覚えておきましょう。
1列目以外を対象にする場合は、Cells(Rows.Count, 列番号).End(xlUp).Row のように列番号を変えるだけで対応できます。
End(xlDown)との違いと使い分け
End(xlDown) は「上から下に向かって最初の空白セルの手前で止まる」動きをします。
これは、データの先頭セルから下方向に向かってデータの途切れる直前の行を取得する方法です。
| コード | 方向 | 起点 | 空白行への対応 |
|---|---|---|---|
| End(xlUp) | 下→上 | 最終行から | 空白行があっても正確 |
| End(xlDown) | 上→下 | 先頭セルから | 途中の空白で止まる |
データに空白行が含まれる可能性がある場合は、End(xlUp) を使う方が安全です。
一方、必ずデータが連続していることがわかっている場合に限り End(xlDown) を使うと、よりシンプルなコードになります。
UsedRangeで使用範囲全体の最終行を取得する
シート全体の使用範囲から最終行を求めたい場合は UsedRange プロパティが便利です。
【VBAコード例】
Dim lastRow As Long
lastRow = ActiveSheet.UsedRange.Rows.Count + ActiveSheet.UsedRange.Row – 1
MsgBox “最終行は ” & lastRow & ” 行目です”
UsedRange はシートで使用されたことがある全範囲を指すため、一度データを入力して削除したセルも含まれてしまう点に注意が必要です。
正確さを求める場合は End(xlUp) の方が信頼性が高いと言えるでしょう。
最終行までVBAで自動処理・ループ操作する方法
続いては、取得した最終行を活用して、データを自動処理する方法を確認していきます。
最終行を動的に取得し、それを For ループの終点として設定すれば、データ量が変わるたびにコードを修正する手間がゼロになります。
For Nextループで最終行まで繰り返し処理する
最も基本的なパターンが For Next ループと組み合わせる方法です。
【VBAコード例】
Dim lastRow As Long
Dim i As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To lastRow
Cells(i, 3).Value = Cells(i, 1).Value & “さん”
Next i
上記の例では、A列の各データに「さん」を付けてC列に出力する処理を、2行目から最終行まで繰り返します。
lastRow を使うことで、データが何行あっても自動で対応できる汎用的なコードになります。
=A2&”さん” → オートフィルで最終行まで
| A | B | C(出力) | |
|---|---|---|---|
| 1 | 氏名 | 売上 | 表示名 |
| 2 | 山田 | 150,000 | =A2&”さん” → 山田さん |
| 3 | 鈴木 | 98,000 | 鈴木さん ↑オートフィル |
| 4 | 佐藤 | 210,000 | 佐藤さん ↑オートフィル |
| 5 | 田中 | 75,000 | 田中さん ↑オートフィル |
最終行を使ってデータを転記・コピーするVBAコード
最終行の取得は、データを別シートへ転記したり、特定条件でコピーする処理にも活用できます。
【VBAコード例 ― 別シートへの転記】
Dim lastRow As Long
Dim i As Long
Dim ws1 As Worksheet, ws2 As Worksheet
Set ws1 = Sheets(“データ”)
Set ws2 = Sheets(“転記先”)
lastRow = ws1.Cells(ws1.Rows.Count, 1).End(xlUp).Row
For i = 2 To lastRow
If ws1.Cells(i, 3).Value >= 100000 Then
ws1.Rows(i).Copy Destination:=ws2.Cells(ws2.Rows.Count, 1).End(xlUp).Offset(1, 0)
End If
Next i
このコードでは「データ」シートの最終行まで順にループし、C列の値が10万以上の行だけを「転記先」シートに貼り付けています。
lastRow があることで、データ量の変化に対してコードを変更しなくてよくなります。
最終行の次の行に自動入力する方法
データの最終行の「次の行」にデータを追記したい場面もよくあります。
【VBAコード例】
Dim nextRow As Long
nextRow = Cells(Rows.Count, 1).End(xlUp).Row + 1
Cells(nextRow, 1).Value = “新しいデータ”
.Row に +1 するだけで「最終行の次の行」を指定でき、データの自動追記処理を簡単に実装できます。
フォームからの入力内容をリストに追記するようなマクロでは、このパターンが頻繁に登場します。
nextRow = Cells(Rows.Count, 1).End(xlUp).Row + 1
| A | B | |
|---|---|---|
| 1 | 氏名 | 売上 |
| 2 | 山田 | 150,000 |
| 3 | 鈴木 | 98,000 |
| 4 | 佐藤 | 210,000 |
| 5 | ← lastRow(最終行 = 4行目) | |
| 6 | 新しいデータ ← nextRow(5行目)に追記! |
まとめ エクセルの最終行の取得(VBAマクロも・値や行番号や列・最終行がいくつか調べる・最終行までの操作)
本記事では、Excelで最終行を取得するさまざまな方法を解説してきました。
関数を使う場合は、COUNTA・MATCH・LOOKUP・INDEX などが主な選択肢となり、データの性質(空白の有無、数値か文字列か)に合わせて使い分けることが重要です。
VBAでは、End(xlUp)が最もシンプルで信頼性が高い定番コードとして覚えておくといいでしょう。
最終行を動的に取得し For ループと組み合わせれば、データ量の変化に左右されない柔軟なマクロが実現できます。
最終行の取得はExcel業務の自動化における土台とも言えるスキルであり、一度身につけてしまえば、あらゆる場面で活用できる強力な武器となります。
ぜひ今回の内容を参考に、日々のExcel作業をさらに効率化してみてください。