〖ExcelVBA〗最終行を正しく取得する基本コードまとめ|空白があっても対応できる定番3パターン

ExcelVBA

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の安定性は、こうした「基本コードの正しさ」で大きく変わります。
ぜひあなたのマクロ作成の土台として使ってみてください。

スポンサーリンク
スポンサーリンク
ExcelVBA
いがぴをフォローする

コメント

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