Excel VBA 逆引き集 | 連続データの最終行

Excel VBA
スポンサーリンク

連続データの最終行

「連続して並ぶデータの“末尾”を正確に掴む」ための定番テクを、初心者向けに最短コードでまとめます。基本は 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 を使い、バージョン差異に依存しないコードにする。
タイトルとURLをコピーしました