VBAで最終行・最終列を一瞬で取得!コピペで使えるコード集

INFO

※本記事の数式やコードは、Microsoft 365(旧Office365)にて動作検証を行っています。


「データが何行あるか、毎回手で確認していませんか?」
「行数が変わるたびにコードを書き直して、時間をムダにしていませんか?」

VBAを使う上で「最終行・最終列の取得」は、あらゆるマクロの基礎中の基礎です。これを知っているだけで、データ量が変わっても自動で対応できる”使い回しのきくコード”が書けるようになります。

この記事では、現場でよく使われる取得方法をコピペで使えるコード付きで丁寧に解説します。


目次

そもそも「最終行・最終列の取得」で何ができるの?

VBAのコードに「50行目まで処理する」と直接書いてしまうと、データが増えたり減ったりしたとたんにコードが使えなくなります。

最終行・最終列を自動で取得することで、データ量に関係なく動くコードが書けるようになります。

手動管理 vs 自動取得の比較

比較項目行数を直接書く最終行を自動取得
データが増えたときコードを書き直す必要ありそのまま動く
ミスのリスク高い(入力ミス・更新漏れ)低い
実務での使いやすさ
コードの再利用性低い高い
けんけん
最終行・最終列の取得は、VBAの「基礎の基礎」です。ここをマスターするだけで、コードの品質が一気に上がります!

最終行を取得する3つの方法

方法①:End(xlUp) を使う方法(最もよく使われる)

特定の列の一番下にあるデータのセルを起点に、上方向へさかのぼって最終行を探す方法です。

手順

  1. VBEを開きます(Alt + F11
  2. 「挿入」→「標準モジュール」をクリック
  3. 以下のコードを貼り付けて実行
Sub GetLastRow_EndUp()
    Dim lastRow As Long
    
    ' A列の最終行を取得(100万行目から上に向かって探す)
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row
    
    MsgBox "A列の最終行は " & lastRow & " 行目です"
End Sub

Rows.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 Sub

UsedRangeは便利ですが、書式だけ設定された空セルも「使用済み」と判定することがあるため、データの最終行には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つの応用コードの使いどころを図解)】

1 最終行まで繰り返し処理(For〜Next) 使いどころ:全行に同じ処理をかけたいとき 顧客名  購入金額 ステータス 田中   12,000 鈴木    8,500 佐藤   23,000 …(N行) For i = 2 To lastRow 全行をループ 顧客名 購入金額 ステータス 田中  12,000 処理済み 鈴木   8,500 処理済み 佐藤  23,000 処理済み …(全行に自動入力) 2 最終行の次の行にデータを追記 使いどころ:フォームから入力したデータをリストに蓄積するとき 日付    内容 10/01  田中受注 10/02  鈴木受注 ← 現在の最終行 ← ここに追記(lastRow+1) nextRow = lastRow + 1 日付    内容 10/01  田中受注 10/02  鈴木受注 10/03  新規データ ✓ 次はここに追記… 3 最終行・最終列で範囲を選択 使いどころ:データ範囲全体に書式や集計を一括適用するとき A列   B列   C列   D列 C001 田中 12,000 10/01 C002 鈴木  8,500 10/02 C003 佐藤 23,000 10/03 A1 ← Cells(lastRow, lastCol) = D4 Range(Cells(1,1), Cells(lastRow, lastCol)) 書式一括設定 コピー・貼付 印刷範囲設定
けんけん
「最終行 + 1」で追記先の行が自動で決まるテクは、データ登録フォームのマクロで大活躍します!

うまくいかないときのトラブルシューティング

❶ 取得した行番号が実際のデータと合わない

症状: 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(条件分岐):「この列が空白なら処理をスキップする」など、繰り返し処理の中で条件を加えることで、より実用的なコードが書けるようになります。

よかったらシェアしてね!
  • URLをコピーしました!
目次