※本記事の数式やコードは、Microsoft 365(旧Office365)にて動作検証を行っています。
VBAで最終行・最終列を一瞬で取得!コピペで使えるコード集
「データが何行あるか、毎回手で確認していませんか?」
「行数が変わるたびにコードを書き直して、時間をムダにしていませんか?」
VBAを使う上で「最終行・最終列の取得」は、あらゆるマクロの基礎中の基礎です。これを知っているだけで、データ量が変わっても自動で対応できる”使い回しのきくコード”が書けるようになります。
この記事では、現場でよく使われる取得方法をコピペで使えるコード付きで丁寧に解説します。
そもそも「最終行・最終列の取得」で何ができるの?
VBAのコードに「50行目まで処理する」と直接書いてしまうと、データが増えたり減ったりしたとたんにコードが使えなくなります。
最終行・最終列を自動で取得することで、データ量に関係なく動くコードが書けるようになります。
手動管理 vs 自動取得の比較
| 比較項目 | 行数を直接書く | 最終行を自動取得 |
|---|---|---|
| データが増えたとき | コードを書き直す必要あり | そのまま動く |
| ミスのリスク | 高い(入力ミス・更新漏れ) | 低い |
| 実務での使いやすさ | △ | ◎ |
| コードの再利用性 | 低い | 高い |
けんけん最終行を取得する3つの方法
方法①:End(xlUp) を使う方法(最もよく使われる)
特定の列の一番下にあるデータのセルを起点に、上方向へさかのぼって最終行を探す方法です。
手順
- VBEを開きます(
Alt + F11) - 「挿入」→「標準モジュール」をクリック
- 以下のコードを貼り付けて実行
Sub GetLastRow_EndUp()
Dim lastRow As Long
' A列の最終行を取得(100万行目から上に向かって探す)
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
MsgBox "A列の最終行は " & lastRow & " 行目です"
End SubRows.Count は、Excelの最大行数(1,048,576行)を表します。一番下のセルから上方向(xlUp)へ検索することで、データが入っている最後の行を確実に見つけられます。
方法②:End(xlDown) を使う方法(先頭から下に探す)
A1セルなど、データが必ず入っている先頭セルから下方向へ探す方法です。
Sub GetLastRow_EndDown()
Dim lastRow As Long
' A1セルから下方向に探す
lastRow = Range("A1").End(xlDown).Row
MsgBox "A列の最終行は " & lastRow & " 行目です"
End Sub⚠️ 注意: 途中に空白セルがあると、そこで止まってしまいます。データに空白がない場合に限って使いましょう。
方法③:UsedRange を使う方法(シート全体を見る)
シート上で使われているセル範囲全体の最終行・最終列を一度に取得できます。
Sub GetLastRow_UsedRange()
Dim lastRow As Long
Dim lastCol As Long
lastRow = ActiveSheet.UsedRange.Rows.Count + ActiveSheet.UsedRange.Row - 1
lastCol = ActiveSheet.UsedRange.Columns.Count + ActiveSheet.UsedRange.Column - 1
MsgBox "最終行:" & lastRow & "行目 / 最終列:" & lastCol & "列目"
End SubUsedRangeは便利ですが、書式だけ設定された空セルも「使用済み」と判定することがあるため、データの最終行にはEnd(xlUp)が最もおすすめです。
最終列を取得する方法
最終行と同じ考え方で、列方向にも使えます。
Sub GetLastColumn()
Dim lastCol As Long
' 1行目の最終列を取得(右端から左に向かって探す)
lastCol = Cells(1, Columns.Count).End(xlToLeft).Column
MsgBox "1行目の最終列は " & lastCol & " 列目です"
End Sub実務で即使える!応用コード集
応用①:最終行まで繰り返し処理する(For〜Next)
Sub LoopToLastRow()
Dim lastRow As Long
Dim i As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
' 2行目(ヘッダーの次)から最終行まで繰り返す
For i = 2 To lastRow
' ここに処理を書く(例:C列に「処理済み」と入力)
Cells(i, 3).Value = "処理済み"
Next i
MsgBox lastRow - 1 & " 件を処理しました"
End Sub応用②:最終行の次の行にデータを追記する
Sub AppendData()
Dim nextRow As Long
' 最終行の「次の行」を取得
nextRow = Cells(Rows.Count, 1).End(xlUp).Row + 1
Cells(nextRow, 1).Value = "新しいデータ"
Cells(nextRow, 2).Value = Date
MsgBox nextRow & " 行目にデータを追加しました"
End Sub応用③:最終行・最終列で囲まれた範囲を選択する
Sub SelectDataRange()
Dim lastRow As Long
Dim lastCol As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
lastCol = Cells(1, Columns.Count).End(xlToLeft).Column
' A1から最終行・最終列までを選択
Range(Cells(1, 1), Cells(lastRow, lastCol)).Select
MsgBox "選択範囲:A1 〜 " & Cells(lastRow, lastCol).Address
End Sub【画像:時短テクニックの図解(3つの応用コードの使いどころを図解)】
けんけんうまくいかないときのトラブルシューティング
❶ 取得した行番号が実際のデータと合わない
症状: lastRow の値が実際のデータ件数より多い、または少ない。
原因と対処:
| 原因 | 対処法 |
|---|---|
| 途中に空白セルがある | End(xlUp)(下から上方向)に切り替える |
| 書式だけ設定されたセルがある | セルの書式をクリアしてから再取得する |
| 取得する列がデータと合っていない | データが実際に入っている列を指定する |
❷ End(xlDown) が1048576行目を返す
症状: End(xlDown) を使ったら、最終行がExcelの一番下(1,048,576行)になる。
原因: 起点セルが空白だと、Excelが「データがない=最下行まで」と判断してしまいます。
対処法: 必ずデータが入っているセルを起点にするか、End(xlUp) に切り替えてください。
❸ 複数シートで思った行が取れない
症状: コードを実行すると、見ているシートとは別のシートの最終行が返ってくる。
原因: Cells(...) だけだと、アクティブシートが対象になりますが、ループ処理中などにシートが切り替わることがあります。
対処法: シートを明示的に指定しましょう。
' シートを明示的に指定する
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("データ")
Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Rowまとめ
Cells(Rows.Count, 列番号).End(xlUp).Rowが最もよく使われる最終行取得の鉄板コードEnd(xlDown)は空白がないデータ専用。不安ならEnd(xlUp)を使うUsedRangeは書式だけのセルも拾ってしまうため注意が必要- 最終行を変数に入れておくと、For〜Nextループや追記処理に応用できる
- シートをまたぐときはシートオブジェクトを明示的に指定する習慣をつける
最終行・最終列の取得をマスターすると、「データ量に左右されない、使い回せるコード」が書けるようになります。ここで学んだコードをぜひ実務のマクロに組み込んでみてください!
次のステップへ進もう
最終行・最終列の取得が使えるようになったら、次はこれらも合わせて覚えましょう。
オートフィルタの操作:最終行まで動的に取得した範囲を対象に絞り込みや集計を行えます。データ整理の自動化に直結する強力な機能です。だけをサッと消去する「現場で必須」の処理です。
For〜Next / For Each ループ:最終行まで繰り返し処理するための基本構文です。今回のコードとセットで使う場面が非常に多く、実務マクロの主役と言える存在です。
If〜Then〜Else(条件分岐):「この列が空白なら処理をスキップする」など、繰り返し処理の中で条件を加えることで、より実用的なコードが書けるようになります。



