はじめに
Excel VBAで作業を自動化する際に、必ずといっていいほど登場するのが「最終行の取得」です。たとえば、データの末尾に新しい情報を追加したり、表の範囲をループ処理したりするとき、「どこまでがデータか」を正確に把握しておかないと、意図しない処理ミスの原因になります。
しかし、VBAで最終行を取得する方法はいくつかあり、データの構造や状況によって「正しく取得できない」ケースもあるため、初心者の方がつまずきやすいポイントでもあります。
そこで本記事では、初心者にもわかりやすくVBAで最終行を取得する3つの方法を紹介します。
それぞれの方法のメリット・デメリットや実務での使い分け方まで詳しく解説するので、ぜひ参考にしてください。
この記事でわかること
- VBAで最終行とは何か? 基本の考え方をやさしく解説
- VBA初心者でも理解できる、最終行を取得する3つの方法
- それぞれの方法のメリット・デメリットと使い分けのコツ
- 実務で失敗しないための注意点とエラー対策

こんにちは、らくだです
VBAを独学で学び、VBAを仕事に多く取り入れてます
仕事に使っているExcelファイルにVBA・マクロを組込むことで
毎日5分掛ってた作業が3秒で終わり、月に1度3時間かかっていた作業が30分で終わるようになりました
浮いた作業時間を年間で計算すると620時間、1日8時間労働で計算すると77.5日分の作業時間を削減したことになります
仕事の処理量を増やしつつも、仕事に余裕が生まれ
余裕があるからミスも減り、新しい提案を考える余裕も生まれました
最終行とは?なぜ正確に取得する必要があるのか
最終行とは、Excelの中で「データが入力されている一番下の行」のことを指します。たとえば、A列に1〜10行目までデータが入力されている場合、最終行は「10行目」となります。
VBAでデータ処理や自動化を行う際は、「どこまでがデータか」を判断して、その範囲だけを対象に処理する必要があります。もし最終行の取得に失敗すると、以下のようなトラブルが起こる可能性があります。
- 空白行まで処理してしまい、エラーが発生
- 本来処理すべき行がスキップされてしまう
- 上書きされてはいけないセルに書き込んでしまう
特に、データの途中に空白行がある表や、前回の処理で行を削除したあとに再利用するシートなどでは、見た目では分かりにくい最終行のズレが発生しやすくなります。
そのため、VBAで最終行を正確に取得することは、あらゆるデータ処理の土台となります。
「なんとなくEnd(xlUp)を使っていたけど、最近うまく動かない…」と感じた方は、ここで一度最終行の取得方法をしっかり見直してみましょう。
VBAで最終行を取得する3つの方法
VBAで最終行を取得する方法はいくつかありますが、初心者の方がまず覚えておくべきなのは、次の3つです。
方法①:End(xlUp) を使う(もっとも基本)
Dim lastRow As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
特徴:
- 指定した列(上記はA列)の一番下から上に向かって、最初にデータがあるセルを探します。
メリット:
- シンプルで動作が速く、処理が軽い
- 基本的な表形式であれば十分対応できる
デメリット:
- 下の方に空白セルがあると、正しく取得できない場合がある
- 必ず「どの列を基準にするか」を明確にする必要がある(例:1列目=A列)
方法②:UsedRange を使う(全体の使用範囲から取得)
Dim lastRow As Long
lastRow = ActiveSheet.UsedRange.Rows(UsedRange.Rows.Count).Row
特徴:
- シート上で使われている範囲(UsedRange)の最終行を取得する方法です。
メリット:
- シート全体の使用状況から取得できるため、汎用性が高い
- 列を指定しなくてよい
デメリット:
- 過去に使っていたセルの履歴が残っていると、意図より大きい行が取得されることがある
- 一度保存し直さないと反映されないことがある
方法③:Find を使う(もっとも正確)
Dim lastRow As Long
Dim rng As Range
Set rng = Cells.Find(What:="*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious)
If Not rng Is Nothing Then
lastRow = rng.Row
Else
lastRow = 1 ' データがない場合は1行目を仮に指定
End If
特徴:
- ワイルドカード「*」で、すべてのセルの中から最後に使われている行を検索します。
SearchOrder:=xlByRows
:行単位で検索します。SearchDirection:=xlPrevious
:後ろから前へ向かって検索します(つまり、最終行を見つける)。
メリット:
- 空白セルがあっても、最も下のデータ行を正確に取得できる
- データの構成が複雑な場合でも対応可能
デメリット:
- コードがやや複雑になるため、初心者にはとっつきにくい
- データが1つもないときにエラーになるため、条件分岐が必要
どの方法を使えばいいの?
状況例 | おすすめの方法 | 理由 |
データが連続している | End(xlUp) | シンプルで速い |
空白セルが混在する表 | Find | 空白に左右されず正確に取得 |
シート全体の範囲を確認したい | UsedRange | 手軽に全体を見ることができる |
私はよくEnd(xlUp)をよく使いますが
3つの方法にはそれぞれ長所・短所があります。
「どれか一つ覚えればOK」ではなく、場面に応じて使い分けられることが、実務でのVBAスキルアップにつながります。
よくあるエラーとその対処法
最終行の取得は一見簡単に見えますが、少しの油断でエラーや予期せぬ動作につながることもあります。ここでは、初心者がつまずきやすいポイントと対処法をまとめておきます。
Object variable or With block variable not set エラー(Findの使用時)
原因:Find("*")
で該当セルが見つからなかった場合、Set rng = Nothing
となり、次の .Row
の取得でエラーになります。
対処法:If Not rng Is Nothing Then
のように、オブジェクトがセットされているか確認してから使うのが鉄則です。
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(xlUp)
を使っているが、途中の行が空白になっているUsedRange
が「過去に使ったセル」を残してしまっている
対処法:
- 空白のある可能性がある表では
Find("*")
を使う UsedRange
の精度を高めたい場合は、一度保存して開き直すと改善されることがある
実務でのアドバイス
- まずは
End(xlUp)
で試してみて、データが正しく取れないと感じたらFind("*")
に切り替える - マクロ記録機能を活用して、コードの動作を目で確認しながら理解を深める
- 処理対象の列・シートが固定なら、セル範囲を明示的に指定することで予期せぬバグを防げる
まとめ|最終行取得を正しく使いこなそう
VBAで「最終行を取得する」処理は、データを扱う自動化において避けて通れない超重要スキルです。
この記事で紹介した3つの方法には、それぞれ向き・不向きがあります。
End(xlUp)
:シンプル&高速。基本の一手。UsedRange
:全体をざっくり把握したいときに便利。Find("*")
:空白があるデータでも正確に取得したいときに最適。
重要なのは、**「どんなデータを扱っているか」**を意識して、正しく使い分けることです。
最終行をしっかり取得できるようになると、ループ処理やデータの追加、削除など、実務でのマクロ作成が一気にレベルアップしますよ。
VBA初心者におすすめの学習方法
「もっとVBAを深く学びたい」「最終行以外にも便利な処理を知りたい」という方は、本やネット教材を活用すると効率的です。
特に、初心者向けにステップバイステップで解説された書籍は理解の助けになります。
初心者におすすめのVBA本3選
『できるExcel VBA 実践編』シリーズ(インプレス)
→ 図解が豊富でとにかくわかりやすい。初心者がつまずかない構成。
『たった1秒で仕事が片づく Excel最強の教科書』
→ 実務で「どこでVBAが役立つか」が具体的にわかる。やる気が出る系の良書。
『Excel VBAを実務で使い倒す技術』(日経BP)
→ 中級者向け寄りだが、実務効率化の視点で体系的に学べる。
本で学習するときの注意点
- いきなり難しいコードに挑戦しない(まずは「記録→読解→応用」がおすすめ)
- 学んだらすぐにExcelで手を動かす(「読んだだけ」はすぐ忘れる)
- サンプルファイルを活用して動作を確認する(動かしてナンボ)
最後に
最終行の取得方法は、VBAの基礎でありながら奥が深いテーマです。
本記事を参考に、自分の業務に合った方法をぜひ見つけてください。
今後もVBAや業務効率化に役立つ情報を発信していくので、よければブックマーク&ブログをチェックしてみてくださいね!
コメント