最終行・最終列を取得する

投稿日:2026-01-07

音声

※ AI音声で読み上げます

目次

  1. End(xlDown)とEnd(xlUp)の使い方
  2. Cells(Rows.Count, 1).End(xlUp).Rowのパターン
  3. UsedRangeプロパティの活用と注意点
  4. データ件数に応じた動的な処理
  5. 空白行の扱い方と判定方法
  6. 注意(ここだけ)
  7. 要約

End(xlDown)とEnd(xlUp)の使い方

Endメソッドは起点から空白または値の端までジャンプします。End(xlDown)は下方向、End(xlUp)は上方向へ移動しますが、起点によって結果が変わる点は要チェックです。

ヘッダーや先頭セル(A1)からEnd(xlDown)を使うと途中の空白で止まることがあるため、安定して最終データを得るには下端(Rows.Count)からEnd(xlUp)で上へ探す方法が推奨されます。簡潔な確認用マクロ例です。

Sub 確認_End()
    Dim ws As Worksheet: Set ws = ActiveSheet
    ws.Range("A1").Select
    Selection.End(xlDown).Select
    MsgBox "End(xlDown): " & ActiveCell.Address
    MsgBox "End(xlUp): " & ws.Cells(ws.Rows.Count, 1).End(xlUp).Address
End Sub

Cells(Rows.Count, 1).End(xlUp).Rowのパターン

Rows.Countはシートの最終行番号を返し、そこから指定列で上へ探すと実データの最終行が得られます。途中に空白があっても末尾のデータ行を確実に取得でき、実務で最も信頼されるパターンです。最終列は同様にColumns.CountからxlToLeftを使います。

lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
lastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column

RangeとCellsの使い分けは可読性と動的参照次第です。日付扱いではValueとValue2の違いは要チェックです。

UsedRangeプロパティの活用と注意点

UsedRangeは最終使用セルを含む範囲を素早く取得でき、ループや書式変更に便利ですが、過去に書式やデータがあったセルも範囲に含まれるため過大に返ることがあります。

不要領域を消すには該当セルのClear(書式含む)や保存して再度開くなどでリセットする必要があります。

実務では最終行取得はCells(...).End(xlUp)のほうがより確実です。

MsgBox ws.UsedRange.Address & " (" & ws.UsedRange.Rows.Count & "行)"

データ件数に応じた動的な処理

lastRow/lastColを基にForループや配列で処理範囲を決めれば、データ件数に応じた自動処理が可能です。

大量データではセル単位の操作を繰り返すと遅くなるため、配列で読み書きしたり、範囲ごとに一括書式変更する等のバルク処理を検討してください。

簡単な処理例(ヘッダー1行想定)です。

For i = 2 To lastRow
    If Application.WorksheetFunction.CountA(ws.Rows(i)) > 0 Then
        ws.Cells(i, 2).Value = "処理済"
    End If
Next i

空白行の扱い方と判定方法

途中の空白行は多い実務パターンです。行全体を判定するには Application.WorksheetFunction.CountA(ws.Rows(i)) で 0 なら空白行と見なしてスキップします。特定列のみで判定する場合は、その列だけを範囲にします(例: CountA(ws.Range("A" & i)))です。End(xlDown) のみで最終行を取ると途中空白で誤判定しやすいため、Rows.Count からの End(xlUp)CountA で確認する組合せが安全です。

最小マクロ: このあとに示す短いVBAを使います。

貼り付け場所: VBEの「標準モジュール」に貼り付けます。

実行方法: Excelで Alt+F8 → マクロを選択 → 実行します。

確認方法: MsgBoxの表示やセルの変化で確認します。

よくあるミス: 貼り付け場所の違い(標準/シート/ThisWorkbook)で動かないことがあります。

使い分けの基準: If と Select Case は条件の数と可読性で選びます。

注意(ここだけ)

  • 削除・上書き・行/列の削除を行う前に、対象シートをコピーしてバックアップを作ってから進めます。

要約

  1. End(xlDown)やEnd(xlUp)は起点に依存するため、Rows.CountからEnd(xlUp)を取る方法が安定します。

  2. Cells(Rows.Count, 列).End(xlUp).Rowは、実務で最も信頼される最終行の取得方法です。

  3. UsedRangeは手早い一方で、過去のフォーマットなどの影響で過大に返ることがあります。

  4. lastRowやlastColを基にループと配列で動的に処理し、大量データはバルク処理で高速化します。

  5. 空白行はCountAなどで判定してスキップまたは別処理にし、Endメソッド単体の誤認を防ぎます。