はじめに|この記事で得られる価値
「最終行が正しく取れていない…?」「マクロが途中で止まる…」そんな悩みを抱えていませんか?
特に未経験1年目エンジニアとして既存マクロの修正・運用を任されている方にとって、空白行による最終行の誤取得は深刻な問題です。
本記事では、Cells(Rows.Count, 1).End(xlUp).Row を“最強”にする3つの理由を、失敗例・図解イメージ・コピペテンプレ付きで徹底解説します。
・VBA最終行取得で毎回ハマる人
・xlDownとxlUpの違いを本質から理解したい人
・安定テンプレをそのまま実務に使いたい人
におすすめの内容です。
(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
このコードは次の動作を行います。
- Rows.Count でシート最下行(例:1048576行)へ移動
- A列の一番下セルを起点にする
- End(xlUp) で上方向に検索
- 最初に見つけたデータで停止
つまり「下から探す」ため、途中に空行があっても無視できます。
用語解説: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. UsedRangeやCurrentRegionとの比較
| 方法 | 空行耐性 | 安定度 | 推奨度 |
|---|---|---|---|
| xlDown | × | 低 | 非推奨 |
| xlUp | ◎ | 高 | 推奨 |
| UsedRange | △ | 中 | 条件付き |
用語解説:UsedRange
Excelシート上で実際に使われている範囲(データが入力されているセルの集合)を自動的に判定するプロパティ。用語解説:CurrentRegion
空白行や空白列で囲まれた連続データの範囲を自動的に取得するExcelのプロパティ。テーブル状データの抽出に便利。
結論: 最終行取得で迷ったら xlUp 一択です。
まとめ|最終行取得で悩まないエンジニアへ
Cells(Rows.Count, 列番号).End(xlUp).Row は、
・空行に強い
・安定性が高い
・実務で再現性がある
という理由から、VBA最終行取得の“鉄板”です。
このテンプレを活用すれば、デバッグ時間は確実に減り、
安定したマクロ開発に自信を持てるようになります。