最終行を正しく取得する方法(End(xlUp)・UsedRange・CurrentRegion の違い)

公開日:2026年10月1日 執筆:Takuya カテゴリ:基本・高速化

データの最終行を取得する代表的な3つの方法と、空白行や書式だけ残ったセルで結果がずれる原因、実務で安全な書き方を解説します。

どんな場面で使うか

毎日行数が変わる売上データや、基幹システムから貼り付けた明細を処理するマクロでは、「どこまでデータがあるか」を毎回正しく求める必要があります。最終行を固定の数字で書いてしまうと、データが増えた日に一部が処理されず、減った日には空白行まで処理してしまいます。

最終行の取得方法はいくつかありますが、それぞれ「何を基準に最終行とみなすか」が違います。違いを知らずに使うと、ある日突然結果がずれる原因になります。

いちばん使う書き方:End(xlUp)

シートの一番下のセルから上方向に向かって、最初に値が入っているセルを探す方法です。Ctrl+↑キーを押したときと同じ動きをします。基準にする列(必ず値が入る列)を1つ決めて使います。

Sub GetLastRow()
    Dim ws As Worksheet
    Dim lastRow As Long

    Set ws = ThisWorkbook.Worksheets("明細")
    ' A列(伝票番号など、必ず値が入る列)を基準にする
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

    If lastRow < 2 Then
        MsgBox "データがありません(見出しのみ)"
        Exit Sub
    End If
    MsgBox "最終行は " & lastRow & " 行目です"
End Sub

ほかの方法との違い

UsedRange と CurrentRegion も最終行の取得に使われますが、次のような違いがあります。

  • End(xlUp):指定した列で値が入っている一番下の行。途中に空白行があっても影響を受けない。基準列が空のことがある場合は誤る
  • UsedRange:シートで「使われた」範囲。値を消しても書式や罫線が残っていると、その行まで含まれてしまう
  • CurrentRegion:指定したセルから空白行・空白列で区切られるまでのかたまり。途中に1行でも空白行があると、そこで止まる

結果がずれる典型的な原因

最もよくあるのは、基準にした列が空のレコードがあるケースです。たとえば「備考」列を基準にすると、備考が空の最後の行が数えられません。基準列には、伝票番号や日付など必ず値が入る列を選びます。

UsedRange の場合は、以前のデータを Delete キーで消しただけで行そのものを削除していないと、書式が残って最終行が大きくなります。毎回データを貼り直すシートでは、貼り付け前に行ごと削除するか、End(xlUp) を使う方が安全です。

また、Rows.Count を使わずに 65536 と書いた古いコードは、xlsx 形式(最大1,048,576行)では途中までしか探しません。行数は必ず ws.Rows.Count で取得します。

実務での使い分けのコツ

明細データのように「列ごとに必ず値が入る列がある表」は End(xlUp)、周りに何もない独立した表を丸ごと扱うときは CurrentRegion、が基本です。UsedRange は書式のゴミに弱いため、最終行の取得にはあまりおすすめしません。

なお、変数は Integer ではなく Long で宣言してください。Integer は 32,767 までしか扱えないため、行数が多いとオーバーフローのエラー(実行時エラー 6)になります。

※コードは Excel 2016 以降で動作を想定しています。シート名や列は実際のブックに合わせて変更してください。

ほかの記事