Loading
  • LIGHT

  • DARK

ROUTE

ルートゼロの
アクティビティ

VBA最終行取得の鉄板テンプレート|xlUpで空白行も完全攻略!

2

はじめに|この記事で得られる価値

「最終行が正しく取れていない…?」「マクロが途中で止まる…」そんな悩みを抱えていませんか?
特に未経験1年目エンジニアとして既存マクロの修正・運用を任されている方にとって、空白行による最終行の誤取得は深刻な問題です。
本記事では、Cells(Rows.Count, 1).End(xlUp).Row を“最強”にする3つの理由を、失敗例・図解イメージ・コピペテンプレ付きで徹底解説します。
・VBA最終行取得で毎回ハマる人
xlDownxlUpの違いを本質から理解したい人
・安定テンプレをそのまま実務に使いたい人
におすすめの内容です。

(VBAの基礎や現場での活用については『SES現場でVBAできますか?未経験向けExcelマクロ実践術』もご参照ください)


1. 【悲報】VBA最終行取得、空行でマクロが止まる理由

■ なぜ End(xlDown) は空行で止まるのか?

End(xlDown) は「連続したデータブロックの末尾」まで移動する仕様です。
途中に空行があると、そこで連続が途切れたと判断して停止します。
これはExcelの Ctrl + ↓ と同じ挙動です。

■ 失敗例コード

Sub GetLastRowWithXlDownFailed()
    Dim lastRow As Long
    lastRow = ActiveSheet.Range("A1").End(xlDown).Row
    MsgBox "A列の最終行 (xlDown) は: " & lastRow & "行目です。"
End Sub

A列の途中に空行がある場合、正しい最終行ではなく
空行手前で停止してしまいます。

用語解説:VBA
ExcelなどのMicrosoft Office製品で使えるプログラミング言語。マクロの自動化や業務効率化に活用される。

用語解説:マクロ
繰り返し作業や複雑な処理を自動化するためのプログラム。ExcelではVBAで記述することが多い。

用語解説:End(xlDown)
Excelのセル移動メソッド。指定セルから下方向に連続したデータの末尾までジャンプする。途中に空白があるとそこで止まる。

用語解説:Ctrl + ↓
Excelで現在位置から下方向の連続データの終端まで一気に移動するショートカットキー。

(VBAでよくある配列操作やエラー対策については『VBA配列の使い方完全ガイド|高速化の仕組みとエラー対策まで』をご参照ください)


2. 【図解イメージ】なぜ xlUp は最強なのか?

■ 仕組み分解:Cells(Rows.Count, 1).End(xlUp).Row

このコードは次の動作を行います。

  1. Rows.Count でシート最下行(例:1048576行)へ移動
  2. A列の一番下セルを起点にする
  3. End(xlUp) で上方向に検索
  4. 最初に見つけたデータで停止

つまり「下から探す」ため、途中に空行があっても無視できます。

用語解説:Rows.Count
Excelシートの総行数を返すプロパティ。バージョンによって異なるが、一般的に1048576行。

用語解説:End(xlUp)
シート最下行から上方向にデータを検索し、最初に見つかったセルで止まるExcelのメソッド。空白行を飛び越えて最終データ行を取得できる。

用語解説:Cells(行, 列)
Excel VBAでセルを指定する方法。例:Cells(1,1)はA1セル。

■ 成功例コード

Sub GetLastRowWithXlUpSuccess()
    Dim lastRow As Long
    lastRow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
    MsgBox "A列の最終行 (xlUp) は: " & lastRow & "行目です。"
End Sub

空行があっても、正しい最終データ行を取得できます。

(日付や文字列の変換・型エラーの回避については『VBA日付文字列変換を完全理解|Format・CDateとエラー回避の原理』も参考になります)


3. xlUpが安定する3つの理由

① 出発点が“物理的最下端”

常にシート最下行から探索するため、データ終端を見逃しません。

② 空行をスキップできる探索方向

上方向探索のため、途中の空行に影響されません。

③ ロジックが単純で再現性が高い

「最下端 → 上へ検索」という明確な構造で、挙動が安定しています。


4. 【コピペ推奨】鉄板テンプレート集

■ A列専用テンプレ

Function GetLastRowInColumnA(ByVal targetSheet As Worksheet) As Long
    GetLastRowInColumnA = targetSheet.Cells(targetSheet.Rows.Count, 1).End(xlUp).Row
End Function

■ 任意列対応テンプレ

Function GetLastRowInSpecificColumn(ByVal targetSheet As Worksheet, ByVal columnNumber As Long) As Long
    GetLastRowInSpecificColumn = targetSheet.Cells(targetSheet.Rows.Count, columnNumber).End(xlUp).Row
End Function

■ シート全体最終行取得

Function GetOverallLastRowInSheet(ByVal targetSheet As Worksheet) As Long
    Dim maxLastRow As Long
    Dim col As Long
    Dim tempLastRow As Long
    maxLastRow = 1
    For col = 1 To targetSheet.UsedRange.Columns.Count
        tempLastRow = targetSheet.Cells(targetSheet.Rows.Count, col).End(xlUp).Row
        If tempLastRow > maxLastRow Then
            maxLastRow = tempLastRow
        End If
    Next col
    GetOverallLastRowInSheet = maxLastRow
End Function

5. UsedRangeCurrentRegionとの比較

方法 空行耐性 安定度 推奨度
xlDown × 非推奨
xlUp 推奨
UsedRange 条件付き

用語解説:UsedRange
Excelシート上で実際に使われている範囲(データが入力されているセルの集合)を自動的に判定するプロパティ。

用語解説:CurrentRegion
空白行や空白列で囲まれた連続データの範囲を自動的に取得するExcelのプロパティ。テーブル状データの抽出に便利。

結論: 最終行取得で迷ったら xlUp 一択です。


まとめ|最終行取得で悩まないエンジニアへ

Cells(Rows.Count, 列番号).End(xlUp).Row は、
・空行に強い
・安定性が高い
・実務で再現性がある
という理由から、VBA最終行取得の“鉄板”です。

このテンプレを活用すれば、デバッグ時間は確実に減り、
安定したマクロ開発に自信を持てるようになります。


RANKINGranking-icon

LATEST POSTS

もっとルートゼロを知りたいなら

DISCOVER MORE