ExcelVBAでマクロを作るとき、ほぼ必ず出てくるのが「最終行の取得」です。
たとえば、次のような処理をしたいときに必要になります。
- データのある行までループしたい
- 新しい行に追記したい
- 範囲を自動で選択したい
- コピーや抽出の対象範囲を決めたい
ただし、最終行の取り方を間違えると、
- 途中で処理が止まる
- 余計な空白行まで処理する
- 見えないセルまで含まれて重くなる
などのトラブルが起きがちです。
そこでこの記事では、実務で使える「最終行の取得」基本コードを、初心者向けにわかりやすくまとめます。
結論:最終行の取得は「状況」で使い分ける
最終行の取り方は1つではありません。
次の3パターンを覚えておくと、ほぼ困りません。
- ① 定番:A列を基準に取得(速い・よく使う)
- ② 便利:UsedRangeから取得(シート全体の使用範囲)
- ③ 最強:Findで取得(空白に強い・ズレにくい)
①【定番】A列を基準に最終行を取得する
一番よく使うのがこの方法です。
「A列には必ずデータが入っている」表なら、これが最速で安全です。
Option Explicit
Sub GetLastRow_Basic()
Dim ws As Worksheet
Dim lastRow As Long
Set ws = ActiveSheet
' A列を基準に最終行を取得
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
MsgBox "A列基準の最終行は " & lastRow & " 行目です。", vbInformation
End Sub
ポイント(初心者向け)
Rows.Countは「そのシートの一番下の行番号」を意味します(Excelの最大行)- 一番下から上に向かって、データがあるセルまで移動して最終行を見つけます
よくある使い方(2行目から最終行までループ):
Dim r As Long
For r = 2 To lastRow
' ここに処理を書く
Next r
②【便利】UsedRangeを使って最終行を取得する
「基準列を決めたくない」「シート全体で使っている範囲の最終行が知りたい」
というときに便利です。
Option Explicit
Sub GetLastRow_UsedRange()
Dim ws As Worksheet
Dim lastRow As Long
Set ws = ActiveSheet
' UsedRange(使っている範囲)の最終行
lastRow = ws.UsedRange.Row + ws.UsedRange.Rows.Count - 1
MsgBox "UsedRange基準の最終行は " & lastRow & " 行目です。", vbInformation
End Sub
注意点
UsedRangeは、過去に使ったセルが残っていると、実際より下まで「使用範囲」と判断されることがあります。
「なんか最終行がやたら下になる…」という場合は、この影響の可能性が高いです。
③【最強】Findで「本当に最後のセル」を探して最終行を取得する
空白が混ざっていたり、列によってデータの入り方がバラバラな表の場合、
最もズレにくいのがFindを使う方法です。
Option Explicit
Sub GetLastRow_Find()
Dim ws As Worksheet
Dim lastRow As Long
Dim lastCell As Range
Set ws = ActiveSheet
' シート全体から「最後に使われているセル」を探す
Set lastCell = ws.Cells.Find( _
What:="*", _
LookIn:=xlFormulas, _
LookAt:=xlPart, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious)
If lastCell Is Nothing Then
MsgBox "シートにデータがありません。", vbExclamation
Exit Sub
End If
lastRow = lastCell.Row
MsgBox "Find基準の最終行は " & lastRow & " 行目です。", vbInformation
End Sub
この方法が強い理由
- 基準列に依存しない
- 空白が途中にあってもズレにくい
- 「シートの中で最後に使われたセル」を直接探す
おまけ:最終列(lastCol)も一緒に取得したい場合
表の範囲を自動で取得したい場合は、最終列もよく使います。
① 1行目(見出し行)を基準に最終列を取得
Dim lastCol As Long
lastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column
② Findで最終列を取得(ズレにくい)
Dim lastCol As Long
lastCol = ws.Cells.Find(What:="*", LookIn:=xlFormulas, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column
まとめ:最終行取得は「表のクセ」に合わせて選ぶ
最終行取得の基本は、次の使い分けがおすすめです。
- A列に必ずデータがある → ① End(xlUp) が最速
- シート全体の使用範囲が知りたい → ② UsedRange
- 空白が混ざる・構造がバラバラ → ③ Find が最強
VBAの安定性は、こうした「基本コードの正しさ」で大きく変わります。
ぜひあなたのマクロ作成の土台として使ってみてください。


コメント