Excelで日々の業務を自動化していると、データの最終行を自動で取得する処理が欠かせません。
たとえば「最終行まで繰り返し処理をしたい」「入力済みの範囲だけをコピーしたい」といった場面で、最終行の取得を誤るとデータが途中で途切れたり、余分な空白行まで含まれたりしてしまいます。
この記事では、VBAのRowsプロパティを中心に、最終行を正確に取得する方法とその活用例を詳しく解説します。
初心者でも理解できるよう、複数の実装パターン・注意点・実務での応用まで丁寧に紹介します。
目次
- ✅ 最終行を取得する目的とRowsの基本理解
- ・Rowsとは何か?
- ✅ 最終行を取得する最も基本的な方法(Endプロパティ)
- ・基本構文
- ✅ 列を指定して最終行を取得する方法
- ✅ UsedRangeを利用して最終行を取得する方法
- ✅ Rowsを使って最終行を活用する方法
- ・最終行を取得して、その行を削除する例
- ・最終行に新しいデータを追加する例
- ✅ 最終行と最終列を組み合わせて範囲を指定する
- ✅ For文と組み合わせて最終行までループ処理を行う
- ✅ 応用:最終行を別シートにコピーする処理
- ✅ 特殊ケース:空白セルがある場合の最終行取得
- ・UsedRangeとEndを併用する
- ✅ 実務での応用例と注意点
- ・応用1:最終行に新しい請求データを追記
- ・応用2:売上データの集計範囲を動的に指定
- ・注意点1:Rows.Countはシートの種類によって異なる
- ・注意点2:Mergedセル(結合セル)に注意
- ✅ まとめ:Rowsを活用して最終行を正確に取得・活用しよう
✅ 最終行を取得する目的とRowsの基本理解
まず、なぜ最終行を取得する必要があるのかを理解しておきましょう。
Excelのデータは日々増減します。そのため、毎回固定行数で処理を書くと対応できないという課題があります。
VBAで「最終行を取得する」というのは、入力済みのデータ範囲を自動で検出するということ。
このときに活躍するのがRowsプロパティやEndプロパティです。
・Rowsとは何か?
Rowsは、シート内の行(Row)を扱うためのプロパティです。
たとえば「このシートの行数を取得したい」「特定行を指定したい」場合に使われます。
Sub RowsExample()
MsgBox Rows.Count
End Sub
このコードを実行すると、アクティブシートの総行数(Excel 2016以降では「1048576」)が表示されます。
つまり、Rowsはシート全体の行情報を持つプロパティだということが分かります。
✅ 最終行を取得する最も基本的な方法(Endプロパティ)
VBAで最終行を取得する最も一般的な方法は、End(xlUp)を使うパターンです。
これは、Excelで「Ctrl + ↑」を押す操作と同じ動作をプログラムで再現するものです。
・基本構文
Sub GetLastRow()
Dim lastRow As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
MsgBox "最終行は " & lastRow & " 行目です"
End Sub
このコードでは、次のような動きをします:
Rows.Countでシートの最終行番号(1048576)を取得- その行のA列(第1列)を基準として、上方向に向かってデータがあるセルを探す
- 最初にデータが見つかったセルの行番号を取得
これで、A列にデータが入っている最後の行がわかります。
✅ 列を指定して最終行を取得する方法
シートによっては、A列ではなく他の列にデータが入力されている場合もあります。
そのようなときは、列番号を指定して取得します。
Sub GetLastRow_ColumnC()
Dim lastRow As Long
lastRow = Cells(Rows.Count, 3).End(xlUp).Row
MsgBox "C列の最終行は " & lastRow & " 行目です"
End Sub
このように、Cells(Rows.Count, 3)の「3」は列番号を意味します。
B列なら「2」、D列なら「4」といった具合に変更することで、任意の列を基準にできます。
✅ UsedRangeを利用して最終行を取得する方法
別のアプローチとして、UsedRangeを使う方法もあります。
これは「実際に使用されている範囲」を自動的に検出してくれる機能です。
Sub GetLastRow_UsedRange()
Dim lastRow As Long
lastRow = ActiveSheet.UsedRange.Rows.Count
MsgBox "使用範囲の最終行は " & lastRow & " 行目です"
End Sub
ただし注意が必要です。
この方法では、途中に空白行があっても最後に一度でもデータが入力された行までを対象にするため、完全に空白な行を削除していないと正しい結果にならないことがあります。
そのため、確実性を求める場合はEnd(xlUp)を使う方が安全です。
参考:【VBA】UsedRangeプロパティ:最終行と最終列数
✅ Rowsを使って最終行を活用する方法
Rowsを使うと、最終行を取得したあとに行全体を指定して操作することが可能になります。
・最終行を取得して、その行を削除する例
Sub DeleteLastRow()
Dim lastRow As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
Rows(lastRow).Delete
End Sub
このコードは、A列を基準に最終行を取得し、その行を削除します。
定期的なデータ更新や不要データの削除に便利です。
・最終行に新しいデータを追加する例
Sub AddDataToLastRow()
Dim lastRow As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
Cells(lastRow + 1, 1).Value = "新しいデータ"
End Sub
このマクロは、A列の最終行を探して、その次の行に「新しいデータ」を書き込みます。
売上データやログを追加する処理など、実務で非常に頻繁に使われるパターンです。
✅ 最終行と最終列を組み合わせて範囲を指定する
最終行だけでなく、最終列も取得すれば「データが存在する範囲全体」を自動で特定できます。
これにより、コピー・貼り付け・集計などを柔軟に行えるようになります。
Sub GetLastRowAndColumn()
Dim lastRow As Long
Dim lastCol As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
lastCol = Cells(1, Columns.Count).End(xlToLeft).Column
Range(Cells(1, 1), Cells(lastRow, lastCol)).Select
End Sub
このコードは、シートの左上(A1)から最終行・最終列までの範囲を自動で選択します。
これにより、データの範囲を毎回指定せずに済みます。
✅ For文と組み合わせて最終行までループ処理を行う
最終行を取得すれば、「1行目から最終行まで繰り返す処理」を簡単に書けます。
Sub LoopToLastRow()
Dim i As Long
Dim lastRow As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To lastRow
Cells(i, 2).Value = Cells(i, 1).Value * 2
Next i
End Sub
この例では、A列の数値を2倍にしてB列に書き込む処理を行っています。
データ数が変動しても、最終行を自動取得することで常に正しい範囲を処理できます。
✅ 応用:最終行を別シートにコピーする処理
実務では「最新行を別のシートに転記する」ケースも多いです。
最終行のデータだけを抜き出してコピーすることも、Rowsを使えば簡単です。
Sub CopyLastRow()
Dim lastRow As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
Rows(lastRow).Copy Destination:=Sheets("Result").Rows(1)
End Sub
この例では、アクティブシートの最終行を「Result」シートの1行目にコピーします。
最新データだけを別シートで管理したい場合に最適です。
✅ 特殊ケース:空白セルがある場合の最終行取得
空白行を含むデータでは、End(xlUp)を使うと途中で止まることがあります。
その場合は、別の方法を組み合わせることで対策可能です。
・UsedRangeとEndを併用する
Sub GetLastRow_Accurate()
Dim lastRow As Long
lastRow = ActiveSheet.UsedRange.Rows(ActiveSheet.UsedRange.Rows.Count).Row
MsgBox "正確な最終行:" & lastRow
End Sub
このコードは、UsedRangeの最終行を直接取得するため、空白行があってもより安定します。
ただし、以前に入力して削除したセルがあるとUsedRangeが広がっている可能性があるため、UsedRangeのリセット(Ctrl + Endで確認)も有効です。
✅ 実務での応用例と注意点
・応用1:最終行に新しい請求データを追記
営業日ごとにExcelに追加していくような帳票では、最終行の下に自動で入力を追加する処理がよく使われます。
これにより、人為的な入力ミスを防ぎ、作業時間を削減できます。
・応用2:売上データの集計範囲を動的に指定
データ数が増減しても、Range("A2:A" & lastRow)のように最終行を使えば、常に最新の範囲を集計対象にできます。
・注意点1:Rows.Countはシートの種類によって異なる
通常シートでは1048576行ですが、古いExcel形式(xls)では65536行です。
シートによって結果が異なるため、最新形式(.xlsx/.xlsm)で作業するのが安心です。
・注意点2:Mergedセル(結合セル)に注意
結合セルを含む範囲で最終行を取得すると、予期せぬ結果を返す場合があります。
必要に応じて、対象列を明示的に指定しておくことが重要です。
✅ まとめ:Rowsを活用して最終行を正確に取得・活用しよう
Cells(Rows.Count, 列番号).End(xlUp).Rowで最終行を取得できるRows(lastRow)を使えば、その行全体の操作(削除・コピーなど)が可能UsedRangeとの併用で空白行にも対応できる- ループ処理やデータ転記など、実務で多用される基本テクニック
- 数値・空白・結合セルに注意し、テストを重ねて安定化させることが大切
VBAで最終行を取得するスキルは、あらゆる自動化の土台になります。
一度習得しておけば、集計・転記・ループ処理など、どんな業務でも柔軟に対応できるようになるでしょう。