Categories: excel

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になる場合

空白シートや非表示セルだけのケースでは Find が Nothing を返すことがあります。
このときは 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)、正確性が必要な場合には Find や UsedRange を使うのが良いでしょう。
今回ご紹介した方法を覚えておけば、どんなシート構成でも対応できるVBAスキルが身につくはずです。

upandup

Web制作の記事を中心に、暮らし、ビジネスに役立つ情報を発信します。 アフィリエイトにも参加しています。よろしくお願いいたします。