Excel VBAで一覧表を処理するとき、
- 最終行まで自動で繰り返したい
- データ件数が毎回変わる
- 固定行数のループをやめたい
- 売上データや顧客データを一括処理したい
といった場面は非常によくあります。
しかし、For文で「100行まで」など固定値を指定すると、データ件数が増減した際に処理漏れや不要な処理が発生します。
実務では、最終行を取得して、その行まで自動で繰り返す設計が一般的です。
この記事では、For文で最終行まで繰り返す方法と、実務で保守しやすいコード設計について解説します。
✅ VBAでFor文を最終行まで繰り返す必要がある理由
VBA初心者の頃は、For文の終了条件を固定値で書くことが少なくありません。
しかし実務データは毎回件数が変わります。
昨日は50件だったデータが、今日は300件になっていることもあります。
そのため、固定値によるループでは処理漏れや不要な処理が発生する可能性があります。
データ件数に合わせて処理範囲を自動で変化させることが、実務向けVBAでは重要になります。
最終行を取得してFor文へ渡すことで、柔軟に対応できるようになります。
・固定行数で繰り返す例
For rowIndex = 2 To 100
Next rowIndex
この方法では101行目以降のデータを処理できません。
✅ VBAで最終行を取得してFor文で繰り返す方法
最終行を取得してからFor文へ渡す方法が最もよく使われます。
途中に空白がない管理番号列や商品コード列を基準にすると安定した処理になります。
実務ではこの形が基本になります。
・まず最終行を取得する
次のコードではA列を基準に最終行を取得します。
この書き方にしている理由は、データ件数が変化してもコードを修正する必要がないためです。
Sub GetLastRow()
Dim targetWorksheet As Worksheet
Dim lastRow As Long
Set targetWorksheet = ThisWorkbook.Worksheets("売上データ")
lastRow = targetWorksheet.Cells(targetWorksheet.Rows.Count, "A").End(xlUp).Row
MsgBox lastRow
End Sub
・なぜEnd(xlUp)を使うのか
Excelの最終行から上方向へ移動することで、最後に入力されているセルを取得できます。
固定値を使う方法よりも保守性が高く、実務では定番の方法です。
今回はEnd(xlUp)を利用して最終行を取得しましたが、Endメソッドの仕組みや最終列取得まで詳しく理解しておくと、より柔軟なデータ処理が可能になります。「【VBA】Endメソッドで最終行・最終列を取得する方法|xlUp・xlToLeftの実務活用」もあわせてご覧ください。
✅ VBAでFor文を最終行まで繰り返す基本コード
最終行を取得した後は、その値をFor文の終了条件へ指定します。
これによりデータ件数が変わっても自動で対応できます。
・売上データを最終行まで処理するコード
次のコードではA列のデータを順番に読み取ります。
このコードでは処理対象シートを変数化し、後から流用しやすい構成にしています。
Sub LoopToLastRow()
Dim targetWorksheet As Worksheet
Dim lastRow As Long
Dim currentRow As Long
Set targetWorksheet = ThisWorkbook.Worksheets("売上データ")
lastRow = targetWorksheet.Cells(targetWorksheet.Rows.Count, "A").End(xlUp).Row
For currentRow = 2 To lastRow
Debug.Print targetWorksheet.Cells(currentRow, "A").Value
Next currentRow
End Sub
・実務で扱いやすい理由
変数名を見れば、
- currentRow
- lastRow
- targetWorksheet
の役割が分かります。
後から見返した場合も処理内容を理解しやすくなります。
✅ VBAで条件に一致したデータだけ処理する方法
実務では全行を処理するだけではありません。
条件によって処理を分岐することが多くあります。
例えば、
- 売上が0円以外
- 完了データのみ
- 未処理データのみ
などです。
・条件付きで処理するコード
次のコードではB列が「未処理」の場合だけ処理します。
この設計にしている理由は、後から条件を変更しやすいためです。
Sub ProcessUncompletedData()
Dim targetWorksheet As Worksheet
Dim lastRow As Long
Dim currentRow As Long
Set targetWorksheet = ThisWorkbook.Worksheets("売上データ")
lastRow = targetWorksheet.Cells(targetWorksheet.Rows.Count, "A").End(xlUp).Row
For currentRow = 2 To lastRow
If targetWorksheet.Cells(currentRow, "B").Value = "未処理" Then
targetWorksheet.Cells(currentRow, "C").Value = "処理済"
End If
Next currentRow
End Sub
・条件分岐を入れるときの考え方
条件式は後から変更されることが多いため、分かりやすく書くことが重要です。
複雑な条件を1行へ詰め込むより保守しやすくなります。
今回はループ内で簡単な条件分岐を行いましたが、実務では抽出条件が複雑になることも少なくありません。For文とIF文を組み合わせた実践的なデータ抽出については、「【VBA】条件に合うデータを抽出する方法|For文・IF文で実務データを自在に扱う」で詳しく解説しています。
✅ VBAで空白行まで処理する方法との違い
最終行まで繰り返す方法と、空白行まで繰り返す方法は混同されがちです。
しかし用途は異なります。
データ途中に空白が入る可能性がある場合は注意が必要です。
・空白行まで処理する例
Do While Cells(currentRow, "A").Value <> ""
currentRow = currentRow + 1
Loop
・どちらを選ぶべきか
最終行まで処理
- 一覧表
- 売上データ
- 顧客データ
空白行まで処理
- 入力フォーム
- 可変入力エリア
一般的な業務データでは最終行取得の方が安全です。
最終行まで繰り返す方法と空白行まで繰り返す方法は似ていますが、適した場面が異なります。途中に空白が入るデータを扱う場合は、「【VBA】For文で空白行まで繰り返す方法|安全な実務設計」も参考にしてみてください。
✅ VBAで最終行までループするときに注意するポイント
最終行取得ができても、実務ではいくつか注意点があります。
これを知らないと予期しない結果になることがあります。
事前に理解しておくことでトラブルを減らせます。
・空白が多い列を基準にしない
例えば備考列を基準にすると、
途中の空白によって最終行判定が狂うことがあります。
管理番号列など必ず入力される列を基準にしましょう。
・データが存在するか確認する
処理前に確認処理を入れることも重要です。
If lastRow < 2 Then
MsgBox "データがありません。"
Exit Sub
End If
・ActiveSheetへ依存しない
実務ではシートを明示した方が安全です。
ActiveSheet依存は誤動作の原因になりやすくなります。
✅ VBAで最終行までのデータを高速処理する考え方
データ件数が数千行を超える場合、セルを1件ずつ操作すると時間がかかります。
その場合は配列へ読み込んで処理する方法も検討できます。
ただし、まずはFor文と最終行取得を正しく理解することが重要です。
・大量データで意識したいポイント
- 最終行を1回だけ取得する
- ループ内で最終行を取得しない
- 不要なSelectを使わない
- 必要に応じて配列化する
・なぜ最終行を先に取得するのか
ループのたびに最終行を取得すると無駄な処理が発生します。
そのため、最初に取得して変数へ格納しておく設計が効率的です。
最終行を取得した後は、実際に可変範囲として処理へ利用する場面が多くなります。最終行までの範囲指定を実務でどのように設計するのかは、「【VBA】範囲指定を最終行まで指定する方法|可変データに対応する実務テクニック」で詳しく解説しています。
✅ まとめ:For文は最終行を取得してから繰り返そう
For文で最終行まで処理できるようになると、実務で扱う多くの一覧表へ対応できます。
この記事のポイント
- 最終行はEnd(xlUp)で取得する
- For文の終了条件へ最終行を指定する
- 固定行数より可変データに強い
- 条件分岐と組み合わせて活用できる
- 空白行まで処理する方法とは用途が異なる
- ActiveSheet依存を避ける
- 大量データでは配列化も検討する
実務のVBAでは、最終行取得とFor文の組み合わせは非常によく登場します。まずはこのパターンを確実に身につけ、さまざまな自動化処理へ応用してみてください。