連続データの最終行
「連続して並ぶデータの“末尾”を正確に掴む」ための定番テクを、初心者向けに最短コードでまとめます。基本は End プロパティ(Ctrl+矢印の動き)で求める方法が速くて堅実。用途に応じて行基準や列基準を選び、空白の混在や表構造にも対策します。
考え方と使い分け
- 連続データの末尾: 起点から連続している塊の「最後のセル」。途中に空白があると、そこで止まるため「基準列(必ず埋まる列)」や「起点セル」を適切に選ぶのが重要です。
- 最短の基本技: Range(起点).End(方向) を使う。方向は連続の終端へ向かう矢印(下なら xlDown、右なら xlToRight、など)。
- “データ全体の最終行”とは別物: UsedRange/Find はシート全体の使用末尾を返すのに向くが、連続データの末尾とは目的が違うため、混同しないのがコツ。
基本1:上端が分かる縦の連続データ(A2から下へ)
Sub LastRow_Continuous_FromTop()
'A2から下方向に連続データの末尾を取得
Dim lastRow As Long
lastRow = Range("A2").End(xlDown).Row
MsgBox "連続データの最終行は " & lastRow
End Sub
VB- ポイント:
- 起点: 先頭セル(例:見出しの下の最初のデータ)から下へ辿る。
- 途中空白に注意: 空白がある列ではそこで止まる。必ず連続で埋まる列を使う。
基本2:下端が分かる縦の連続データ(列末から上へ)
Sub LastRow_Continuous_FromBottom()
'A列の最下行から上方向に連続データの先頭を探す(末尾の行番号を返す)
Dim lastRow As Long
lastRow = Cells(Rows.Count, "A").End(xlUp).Row
MsgBox "連続データの最終行は " & lastRow
End Sub
VB- ポイント:
- 定番の高速手法: 最下行から上へ向かうため、途中空白があっても“末尾側”は正確に掴める。追記やループ終端の算出に最適。
横方向:行内の連続データ最終列(B2から右へ)
Sub LastColumn_Continuous_Row()
'B2から右方向へ連続データの最終列を取得
Dim lastCol As Long
lastCol = Range("B2").End(xlToRight).Column
MsgBox "この行の連続データ最終列は " & lastCol
End Sub
VB- ポイント:
- 行ベース: 行の中で値が詰まっている部分の右端を素早く取得。
- 空白で停止: 途中に空白が入る行では、そこが終端になる。
起点が不明なときの安全テンプレート(上から下へスキャン)
Sub LastRow_Continuous_ScanTopDown()
'A列の見出し直下から下へ連続部分の末尾を探す(見出しがA1想定)
Dim r As Long
r = 2
Do While Cells(r, "A").Value <> ""
r = r + 1
Loop
MsgBox "連続データの最終行は " & r - 1
End Sub
VB- ポイント:
- ループで検出: 連続データが途切れた位置(空白)手前が末尾。
- 堅実だが遅め: 行数が非常に多い場合は End を優先。
テーブル構造の連続(ListObjectのデータ部)
Sub LastRow_Continuous_ListObject()
'テーブルのデータ行数から最終行を取得(アクティブシートにテーブルあり)
Dim lo As ListObject
Set lo = ActiveSheet.ListObjects(1)
Dim lastRow As Long
lastRow = lo.DataBodyRange.Rows(lo.DataBodyRange.Rows.Count).Row
MsgBox "テーブルの最終行は " & lastRow
End Sub
VB- ポイント:
- 表に強い: テーブルは行の追加・削除に強い構造。DataBodyRangeの末尾は“連続データの末端”として扱える。
例題で練習
例題1:売上キー列(A列)が連続のとき、最終行まで集計
Sub Example_SumToContinuousLast()
Dim last As Long, r As Long
last = Cells(Rows.Count, "A").End(xlUp).Row
For r = 2 To last
Cells(r, "F").Value = Cells(r, "C").Value * Cells(r, "D").Value
Next
End Sub
VB例題2:見出し下のデータが途切れるまでコピー(A2から連続)
Sub Example_CopyContinuousDown()
Dim startRow As Long, lastRow As Long
startRow = 2
lastRow = Range("A" & startRow).End(xlDown).Row
Range("A" & startRow & ":D" & lastRow).Copy Destination:=Range("H2")
End Sub
VB例題3:行ごとの連続最終列の右隣に印を付ける(B2開始)
Sub Example_MarkRowEnds()
Dim r As Long, lastCol As Long
For r = 2 To 100
lastCol = Range("B" & r).End(xlToRight).Column
Cells(r, lastCol + 1).Value = "→"
Next
End Sub
VB実務の落とし穴と対策
- 途中空白で停止する問題: 連続データ検出は空白で止まる。必ず「連続で埋まる列・起点」を選ぶ。見出し直下から開始する構造にしておくと安定。
- “最終行”の定義の混同: 連続データの最終行と、シート全体の使用末尾(UsedRange/Find)は目的が違う。追記や範囲指定は連続の末尾、全体初期化や使用箇所調査は UsedRange/Find を使い分ける。
- 巨大データの速度: ループでの検出は遅くなる。End(xlUp/xlDown/xlToRight) が高速・堅実。最終行・最終列取得は Rows.Count/Columns.Count を使い、バージョン差異に依存しないコードにする。
