最終行・最終列を取得する
音声
目次
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 は条件の数と可読性で選びます。
注意(ここだけ)
削除・上書き・行/列の削除を行う前に、対象シートをコピーしてバックアップを作ってから進めます。
要約
End(xlDown)やEnd(xlUp)は起点に依存するため、Rows.CountからEnd(xlUp)を取る方法が安定します。
Cells(Rows.Count, 列).End(xlUp).Rowは、実務で最も信頼される最終行の取得方法です。
UsedRangeは手早い一方で、過去のフォーマットなどの影響で過大に返ることがあります。
lastRowやlastColを基にループと配列で動的に処理し、大量データはバルク処理で高速化します。
空白行はCountAなどで判定してスキップまたは別処理にし、Endメソッド単体の誤認を防ぎます。