VBAで最終行を正確に取得する方法|複数パターンと使用シーンを徹底解説

Excel VBA(Visual Basic for Applications)を使って業務効率化を図る上で、データの最終行を正確に取得する処理は欠かせません。
最終行の取得方法は1つではなく、状況や用途に応じて使い分けることが重要です。この記事では、VBAでの最終行の取得方法について、代表的なコードの書き方とその違い、メリット・デメリットを含めて、初心者でも理解しやすく丁寧に解説していきます。


Cells(Rows.Count, 1).End(xlUp).Rowを使う基本パターン

最もよく使われる方法がこちらです。
たとえば、A列の最終行を取得したい場合、次のように書きます。

Dim lastRow As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row

このコードは、A列(第1列)の一番下の行から上に向かってデータがあるセルを探し、その行番号を返します。
「空白を飛ばして一番下まで探したい」ケースで非常に有効です。

特徴

  • データが途中に空白行を含んでいても、最終的なデータがあればその行を返す
  • 特定の列(例:B列なら Cells(Rows.Count, 2))に対して使える

UsedRangeを使った最終行の取得

ブックの使用されている範囲全体から最終行を調べたい場合は、以下のような方法があります。

Dim lastRow As Long
lastRow = ActiveSheet.UsedRange.Rows(ActiveSheet.UsedRange.Rows.Count).Row

この方法は、ワークシートの使用範囲全体に対して最終行を取得します。
ただし、セルの書式や空白を含めて「使用されている」と判断されるので、不要なデータがあると誤差が出ることがあります。

特徴

  • シート全体を対象にしたい時に有効
  • セルの書式設定などが影響して過剰に大きい数値になることも

Range.Findメソッドを使った取得方法

データが特定の値で始まっているとき、その値を探して最終行を取得する場合は、Findメソッドが役立ちます。

Dim lastRow As Long
With Worksheets("Sheet1")
Dim rng As Range
Set rng = .Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious)
If Not rng Is Nothing Then
lastRow = rng.Row
Else
lastRow = 1 ' データがない場合
End If
End With

この方法は、セルの内容を探すため、見た目上「空白でも書式が残ってる」場合に対応できます。

特徴

  • シート内の全体データをスキャンして、最終行を取得
  • 空白が多いデータや不規則な入力があるシートでも信頼性が高い

ワークシート関数COUNTAを使った方法

Dim lastRow As Long
lastRow = WorksheetFunction.CountA(Range("A:A"))

この方法は、A列のデータがいくつあるかを数え、その数値を最終行とする簡易的な方法です。
ただし、途中に空白があると正しい行番号にならない可能性があります。

特徴

  • シンプルなカウント式で軽量処理
  • 途中に空白行があると誤差が出る

最終行取得方法の比較と使い分け方

方法特徴向いているケース
Cells(Rows.Count, x).End(xlUp)実務で最も多用される。途中の空白に強い。データが連続していない場合
UsedRangeシート全体の使用範囲で取得。使用範囲全体で最終行を見たい時
Findメソッド最も正確。空白や書式にも強い。高精度が求められる時
WorksheetFunction.CountA軽量処理。簡単だが精度は低め。簡易的なチェックや試作スクリプト

エラーが出た場合のチェックポイント

CellsやRangeでの変数型エラー

最終行の変数は Long 型で定義するのが基本です。
数値が大きくなる可能性があるため、Integer では足りません。

FindでNothingになる場合

空白シートや非表示セルだけのケースでは FindNothing を返すことがあります。
このときは If Not rng Is Nothing での判定を忘れずに。

UsedRangeで異常に大きな数値が返る

削除したセルの書式が残っていると「使用済み」と見なされることがあります。
不要なセルの書式をクリアする、行全体を削除するなどの対応が必要です。


実際の業務での活用例

複数シートにまたがる処理

たとえば複数のシートにデータがあって、それぞれのシートの最終行をループで取得することも可能です。

Dim ws As Worksheet
Dim lastRow As Long

For Each ws In ThisWorkbook.Worksheets
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
Debug.Print ws.Name & " の最終行は " & lastRow
Next ws

最終行に新しいデータを追加する処理

Dim lastRow As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row + 1
Cells(lastRow, 1).Value = "新しいデータ"

まとめ

VBAでの最終行の取得は、状況に応じた「適切な方法の選択」が鍵です。
シンプルな処理には Cells(Rows.Count, x).End(xlUp)、正確性が必要な場合には FindUsedRange を使うのが良いでしょう。
今回ご紹介した方法を覚えておけば、どんなシート構成でも対応できるVBAスキルが身につくはずです。

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