VBAで自動化 VBA一覧 最終行・最終列 配列・データ操作

【VBA】For文で空白行まで繰り返す方法|安全な実務設計

Excel VBAでデータ処理をしていると、
「A列のデータが空白になるまで処理したい」
「最終行を取得せず、空白行を区切りにしてループしたい」
「途中に空白が出たら処理を止めたい」
という場面がよくあります。

特に、一覧表やCSV取込データ、日報データ、名簿データなどでは、データの件数が毎回変わるため、固定行数で処理するとミスが起きやすくなります。

ただし、「空白行まで繰り返す」といっても、実務では少し注意が必要です。
空白セルを見つけたら止めるのか、完全な空白行で止めるのか、途中の空白は無視するのかによって、コードの書き方が変わります。

この記事では、VBAのFor文を使って空白行まで繰り返す基本方法から、実務で安全に使うための設計、Do Whileとの違い、途中空白がある場合の注意点まで詳しく解説します。

目次

✅ VBAのFor文で空白行まで繰り返す基本の考え方

VBAで空白行まで処理したい場合、最初に考えるべきことは「どの列を基準に空白を判断するか」です。
なんとなくA列を見て処理してしまうと、実務では途中に空白があるだけで処理が止まってしまうことがあります。
特に、名簿や売上表のように一部の項目だけ空白になる可能性がある表では、基準列の選び方が非常に重要です。
ここを曖昧にしたままコードを書くと、処理漏れや想定外の終了につながります。
また、For文は本来「開始行から終了行まで決まった範囲を繰り返す」構文なので、空白を見つけたときに途中終了するには設計が必要です。
まずは、空白行まで繰り返す処理の基本的な考え方から整理していきましょう。

・空白行まで繰り返すとは何を意味するのか

「空白行まで繰り返す」とは、たとえば次のような表で、A列が空白になった行まで処理することを指します。

A列:社員番号B列:氏名
21001山田
31002佐藤
41003鈴木
5

この場合、2行目から4行目まで処理し、5行目で処理を終了します。

実務では、次のような場面でよく使います。

  • 名簿データを上から順番に処理する
  • A列の商品コードが空白になるまで集計する
  • CSV取込後のデータを1行ずつ確認する
  • 入力済みの行だけ転記する
  • 空白行をデータ終了の合図として扱う

つまり、空白行まで繰り返す処理は、データ件数が毎回変わる表を処理するための基本パターンです。

・For文で空白行まで処理するときの基本方針

For文で空白行まで繰り返す場合は、次のような流れにします。

  1. 開始行を決める
  2. 十分に大きな終了行を設定する
  3. 各行の基準セルを確認する
  4. 空白ならExit Forでループを抜ける
  5. 空白でなければ処理を続ける

ポイントは、空白を見つけたらExit Forで終了することです。

たとえば、A列が空白になるまで処理する場合、基本形は次のようになります。

Sub LoopUntilBlankRowBasic()

    Dim targetWorksheet As Worksheet
    Dim rowIndex As Long
    Dim startRow As Long
    Dim maxCheckRow As Long
    
    Set targetWorksheet = ActiveSheet
    
    startRow = 2
    maxCheckRow = 1000
    
    For rowIndex = startRow To maxCheckRow
        
        If targetWorksheet.Cells(rowIndex, "A").Value = "" Then
            Exit For
        End If
        
        ' ここに空白行まで繰り返したい処理を書く
        Debug.Print targetWorksheet.Cells(rowIndex, "A").Value
        
    Next rowIndex

End Sub

このコードでは、A列が空白になった時点でFor文を終了します。

・この書き方を使う理由

この書き方の良い点は、処理の流れが非常に分かりやすいことです。

  1. 上から順番に確認する
  2. 空白なら止める
  3. 空白でなければ処理する

という構造なので、あとから見ても処理内容を理解しやすくなります。

また、Exit Forを使うことで、空白行を見つけた時点で無駄な処理を止められます。
データが100行しかないのに1000行まで確認し続ける必要がなくなるため、処理速度の面でも有利です。

ただし、最大行数を固定しているため、実務では次の章で紹介するように、最終行と組み合わせた設計にした方が安全です。


✅ VBAで空白行まで繰り返す基本コードと実務向けの書き方

空白行まで繰り返すコードは短く書くこともできますが、実務では「短さ」よりも「後から読めること」が重要です。
特に、どのシートを対象にしているのか、どの列を基準にしているのか、何行目から処理するのかが曖昧だと、仕様変更時に修正しづらくなります。
また、ActiveSheetに依存しすぎると、別のシートを開いた状態で実行したときに誤処理が起きる可能性もあります。
そのため、実務コードでは対象シート・開始行・判定列を変数として分けておくことが大切です。
ここでは、保守性を意識した書き方で、空白行まで繰り返す基本コードを作成します。
単に動くだけではなく、あとから流用しやすい構成として理解しておきましょう。

・実務向けコード:A列が空白になるまで繰り返す

次のコードは、A列の値が空白になるまで、2行目から順番に処理する例です。

Sub ProcessRowsUntilBlankCell()

    Dim targetWorksheet As Worksheet
    Dim currentRow As Long
    Dim startRow As Long
    Dim maxCheckRow As Long
    Dim keyColumn As String
    
    ' 処理対象のシートを明示する
    Set targetWorksheet = ThisWorkbook.Worksheets("Sheet1")
    
    ' 実務で変更されやすい条件は変数として分けておく
    startRow = 2
    maxCheckRow = 1000
    keyColumn = "A"
    
    For currentRow = startRow To maxCheckRow
        
        ' 基準列が空白になったらデータ終了と判断する
        If Trim(targetWorksheet.Cells(currentRow, keyColumn).Value) = "" Then
            Exit For
        End If
        
        ' 空白行まで繰り返したい処理
        Debug.Print "処理行:" & currentRow & _
                    " / 値:" & targetWorksheet.Cells(currentRow, keyColumn).Value
        
    Next currentRow

End Sub

このコードでは、次の条件を分かりやすく分離しています。

  • 処理対象シート:targetWorksheet
  • 開始行:startRow
  • 最大確認行:maxCheckRow
  • 空白判定に使う列:keyColumn
  • 現在処理中の行:currentRow

こうしておくと、あとから「A列ではなくB列を基準にしたい」「2行目ではなく5行目から始めたい」となった場合でも、修正箇所が分かりやすくなります。

・なぜTrim関数を使っているのか

空白判定では、単純に次のように書くこともできます。

If targetWorksheet.Cells(currentRow, keyColumn).Value = "" Then

しかし、実務ではセルに見えないスペースが入っていることがあります。

たとえば、次のようなケースです。

  • 半角スペースだけが入力されている
  • コピー貼り付けで余分な空白が入っている
  • CSVから取り込んだデータに空白文字が混ざっている

この場合、見た目は空白でも、VBA上は空白ではないと判断されることがあります。

そのため、次のようにTrimを使っています。

If Trim(targetWorksheet.Cells(currentRow, keyColumn).Value) = "" Then

Trimを使うことで、前後の余分なスペースを取り除いたうえで空白判定できます。
これは、実務で空白行判定を安定させるために非常に重要です。

・ActiveSheetを避けている理由

サンプルコードでは、次のように対象シートを明示しています。

Set targetWorksheet = ThisWorkbook.Worksheets("Sheet1")

これは、誤って別シートを処理しないためです。

ActiveSheetを使うと、現在表示されているシートが処理対象になります。
一見便利ですが、実務では次のようなミスにつながります。

  • 違うシートを開いたまま実行してしまう
  • ボタンを配置したシートと処理対象シートが違う
  • 複数シートを扱う処理で対象が分からなくなる

そのため、実務では可能な限り、処理対象のシートを明示する方が安全です。

空白行まで繰り返す処理では、どのシートを対象にするかを明確にしておくことが重要です。
ActiveSheetに依存すると、別のシートを開いた状態で実行したときに誤処理が起きる可能性があります。
アクティブセルやアクティブシートに頼らない安全な指定方法については、【VBA】アクティブセル・アクティブシートの考え方と安全な指定方法の記事で詳しく解説しています。


✅ VBAのFor文で空白行まで処理するときに最終行も組み合わせる方法

空白行まで繰り返す処理では、最大確認行を1000行や10000行のように固定することもできます。
しかし、データ件数が増えたり減ったりする実務では、固定値に頼る設計はあまり安全ではありません。
少ないデータなら問題なくても、データが増えたときに途中までしか処理されない可能性があります。
また、必要以上に大きな行数を指定すると、処理自体は止まるとしても設計意図が分かりにくくなります。
そこで実務では、最終行を取得したうえで、その範囲内をFor文で処理する方法がよく使われます。
この章では、空白行判定と最終行取得を組み合わせた、より安全な書き方を紹介します。

・最終行を取得してから空白行まで処理するコード

次のコードは、A列の最終行を取得し、その範囲内で空白セルが出たら処理を終了する例です。

Sub ProcessRowsUntilBlankWithLastRow()

    Dim targetWorksheet As Worksheet
    Dim currentRow As Long
    Dim startRow As Long
    Dim lastRow As Long
    Dim keyColumn As String
    
    Set targetWorksheet = ThisWorkbook.Worksheets("Sheet1")
    
    startRow = 2
    keyColumn = "A"
    
    ' 基準列の最終行を取得する
    lastRow = targetWorksheet.Cells(targetWorksheet.Rows.Count, keyColumn).End(xlUp).Row
    
    For currentRow = startRow To lastRow
        
        ' 途中で空白が出た場合は、そこで処理を終了する
        If Trim(targetWorksheet.Cells(currentRow, keyColumn).Value) = "" Then
            Exit For
        End If
        
        ' 実際の処理
        Debug.Print "処理行:" & currentRow & _
                    " / 値:" & targetWorksheet.Cells(currentRow, keyColumn).Value
        
    Next currentRow

End Sub

このコードでは、処理範囲の上限を実データの最終行に合わせています。

そのため、

  • 固定行数に依存しない
  • データ件数が増えても対応しやすい
  • 無駄な範囲を処理しない

というメリットがあります。

・最終行を取得しているのに空白判定も入れる理由

「最終行を取得するなら、空白行判定はいらないのでは?」と思うかもしれません。

たしかに、A列に途中空白がない表であれば、最終行まで処理すれば十分です。
しかし、実務では次のようなデータもあります。

A列:コードB列:内容
2A001売上
3A002売上
4
5A003売上

このような表で「空白行をデータ終了の合図」として扱うなら、4行目で止める必要があります。

一方、最終行だけを基準にすると、5行目まで処理されます。

つまり、

  • 最終行:データが存在する最後の行を知るため
  • 空白判定:途中で処理を止めるため

という役割の違いがあります。

・この方法が向いているケース

最終行取得と空白判定を組み合わせる方法は、次のようなケースに向いています。

  • 途中の空白行で処理を止めたい
  • データ件数が毎回変わる
  • 固定行数を使いたくない
  • 実務で長く使うマクロにしたい
  • 処理範囲をできるだけ安全に制御したい

特に、他の人も使うマクロでは、固定行数よりも最終行取得を使う方が安心です。

空白行まで処理する仕組みを作れたら、次に考えるべきなのは「その空白行をどう扱うか」です。
不要な空白行をまとめて削除したい場合は、Rows.Deleteを使った安全な処理方法を理解しておくと、データ整理の効率が大きく向上します。→【VBA】行を削除する方法|Rows.Deleteで空白行をまとめて処理


✅ VBAで空白行まで繰り返す処理とDo Whileの違い

空白行まで繰り返す処理では、For文だけでなくDo While文もよく使われます。
どちらでも実現できますが、考え方が少し異なります。
For文は「範囲がある程度決まっている処理」に向いており、Do Whileは「条件を満たす間だけ繰り返す処理」に向いています。
この違いを理解せずに使うと、ループが止まらない、処理範囲が分かりにくいといった問題が起こることがあります。
特にVBA初心者の場合、Do Whileで行番号を増やし忘れて無限ループになるケースも少なくありません。
ここでは、For文とDo Whileの違いを実務目線で整理します。

・Do Whileで空白行まで繰り返す基本コード

Do Whileを使う場合は、次のように書けます。

Sub ProcessRowsUntilBlankByDoWhile()

    Dim targetWorksheet As Worksheet
    Dim currentRow As Long
    Dim keyColumn As String
    
    Set targetWorksheet = ThisWorkbook.Worksheets("Sheet1")
    
    currentRow = 2
    keyColumn = "A"
    
    Do While Trim(targetWorksheet.Cells(currentRow, keyColumn).Value) <> ""
        
        ' 空白になるまで繰り返したい処理
        Debug.Print "処理行:" & currentRow & _
                    " / 値:" & targetWorksheet.Cells(currentRow, keyColumn).Value
        
        ' 次の行へ進む
        currentRow = currentRow + 1
        
    Loop

End Sub

Do Whileは、A列が空白でない間だけ処理を続けます。
そのため、「空白になるまで処理する」という目的には非常に分かりやすい構文です。

・For文とDo Whileの使い分け

書き方向いている場面
For文開始行と終了行の範囲を意識したい場合
Do While空白になるまで単純に進めたい場合
For文+Exit For範囲内で条件により途中終了したい場合
Do While+行加算データ終了まで順番に処理したい場合

実務では、どちらが正解というより、処理の目的によって選びます。

たとえば、次のように考えると分かりやすいです。

  • 最終行までの範囲を意識したい → For文
  • 空白になるまでひたすら進めたい → Do While
  • 途中終了も含めて制御したい → For文+Exit For

今回のテーマは「For文で空白行まで繰り返す処理方法」なので、基本はFor文を中心に考えます。
ただし、実務ではDo Whileの方が自然なケースもあります。

・Do Whileで注意すべきポイント

Do Whileで最も多いミスは、行番号を増やし忘れることです。

Do While Trim(targetWorksheet.Cells(currentRow, keyColumn).Value) <> ""
    
    Debug.Print targetWorksheet.Cells(currentRow, keyColumn).Value
    
Loop

このように書くと、currentRowが増えないため、同じ行を永遠に処理し続けます。

必ず次の処理を入れる必要があります。

currentRow = currentRow + 1

For文ではNextによって自動的に行番号が進みますが、Do Whileでは自分で増やす必要があります。
この点が、For文との大きな違いです。


✅ VBAで途中に空白がある表を安全に処理する方法

空白行まで繰り返す処理で最も注意すべきなのが、「途中の空白をどう扱うか」です。
実務データでは、すべての行がきれいに入力されているとは限りません。
たとえば、備考欄が空白、電話番号が未入力、担当者が未設定ということはよくあります。
もし空白セルを見つけた時点で処理を止める設計にしていると、本来処理すべき後続データまで処理されない可能性があります。
そのため、空白を見つけたら必ず止めるのではなく、「その空白はデータ終了を意味するのか」を判断する必要があります。
この章では、途中空白がある表でも安全に処理する考え方を解説します。

・途中空白で止まってしまう失敗例

次のようなデータを考えます。

A列:商品コードB列:商品名
2A001商品A
3A002商品B
4商品C
5A004商品D

この状態でA列が空白になったら処理終了にすると、4行目で処理が止まります。
その結果、5行目の商品Dは処理されません。

これは、実務ではかなり危険です。

特に次のような表では注意が必要です。

  • 一部の列に未入力がある
  • 必須項目と任意項目が混ざっている
  • 途中に空白行が入りやすい
  • データの入力ルールが統一されていない

・完全な空白行で止める方法

途中の一部セルが空白でも処理を続けたい場合は、行全体が空白かどうかで判断します。

Sub ProcessRowsUntilEntireBlankRow()

    Dim targetWorksheet As Worksheet
    Dim currentRow As Long
    Dim startRow As Long
    Dim lastRow As Long
    
    Set targetWorksheet = ThisWorkbook.Worksheets("Sheet1")
    
    startRow = 2
    lastRow = targetWorksheet.Cells(targetWorksheet.Rows.Count, "A").End(xlUp).Row
    
    For currentRow = startRow To lastRow
        
        ' A列からD列までがすべて空白なら、データ終了と判断する
        If WorksheetFunction.CountA(targetWorksheet.Range("A" & currentRow & ":D" & currentRow)) = 0 Then
            Exit For
        End If
        
        ' 実際の処理
        Debug.Print "処理行:" & currentRow
        
    Next currentRow

End Sub

このコードでは、A列からD列までがすべて空白の場合だけ、処理を終了します。

・なぜ行全体の空白判定が安全なのか

実務では、特定の列だけを基準にすると処理漏れが起きることがあります。

たとえば、A列の商品コードが空白でも、B列の商品名やC列の金額が入力されている場合、その行は完全な空白行ではありません。
そのような行を処理対象外にしてしまうと、必要なデータが抜け落ちます。

CountAを使って行全体を確認すれば、次のように判断できます。

  • 行に何か入力がある → 処理する
  • 行に何も入力がない → 処理を終了する

この方が、実務データには向いている場合があります。

・空白行で止めるか、最終行まで処理するかの判断

実務では、次の基準で判断すると安全です。

状況おすすめ
空白行がデータ終了の目印になっている空白行で止める
途中に空白が入りやすい最終行まで処理する
一部項目だけ空白になる行全体で判定する
必須列が決まっている必須列を基準に判定する

つまり、空白判定はコードの問題というより、データの運用ルールの問題です。


✅ VBAで空白行まで繰り返す処理を関数化して再利用する方法

空白行まで繰り返す処理は、さまざまなマクロで何度も使われます。
毎回同じようなコードを書くと、修正が必要になったときにすべてのコードを直さなければなりません。
また、人によって書き方が変わると、処理の基準がバラバラになり、保守が難しくなります。
そこで実務では、「空白行までの範囲を取得する処理」や「空白行を判定する処理」を関数化しておくと便利です。
関数化しておけば、他のマクロでも同じ基準で処理できるため、品質が安定します。
この章では、再利用しやすい形に整理した実務向けの設計を紹介します。

・空白行の直前までの最終処理行を取得する関数

次の関数は、指定した列を上から確認し、空白が出る直前の行番号を返します。

Function GetLastRowBeforeBlank( _
    ByVal targetWorksheet As Worksheet, _
    ByVal keyColumn As String, _
    ByVal startRow As Long _
) As Long

    Dim currentRow As Long
    Dim lastUsedRow As Long
    
    lastUsedRow = targetWorksheet.Cells(targetWorksheet.Rows.Count, keyColumn).End(xlUp).Row
    
    For currentRow = startRow To lastUsedRow
        
        If Trim(targetWorksheet.Cells(currentRow, keyColumn).Value) = "" Then
            GetLastRowBeforeBlank = currentRow - 1
            Exit Function
        End If
        
    Next currentRow
    
    GetLastRowBeforeBlank = lastUsedRow

End Function

この関数を使うと、メイン処理を次のように書けます。

Sub ProcessDataUsingReusableFunction()

    Dim targetWorksheet As Worksheet
    Dim currentRow As Long
    Dim startRow As Long
    Dim endRow As Long
    
    Set targetWorksheet = ThisWorkbook.Worksheets("Sheet1")
    
    startRow = 2
    endRow = GetLastRowBeforeBlank(targetWorksheet, "A", startRow)
    
    For currentRow = startRow To endRow
        
        ' 実際の処理
        Debug.Print "処理行:" & currentRow & _
                    " / 値:" & targetWorksheet.Cells(currentRow, "A").Value
        
    Next currentRow

End Sub

・この設計にしている理由

この設計では、「どこまで処理するかを決める処理」と「実際に行う処理」を分けています。

これにより、コードの役割が明確になります。

  • GetLastRowBeforeBlank:処理範囲を決める
  • ProcessDataUsingReusableFunction:データを処理する

このように分けることで、後から仕様変更があった場合にも修正しやすくなります。

たとえば、空白判定の条件を変更したい場合、関数側だけを修正すれば済みます。
すべてのマクロ内で空白判定を書いていると、修正漏れが発生しやすくなります。

・関数化が向いている業務

このような関数化は、次のような業務で特に有効です。

  • 複数のマクロで同じ処理範囲を使う
  • 毎月同じ形式の帳票を処理する
  • 担当者が変わっても同じ基準で処理したい
  • 空白行判定のルールを統一したい
  • 長く使う業務ツールとして整備したい

実務では、コードを短くすることよりも、判断基準を1か所にまとめることの方が重要です。


✅ VBAで空白行まで処理するときによくある失敗と対策

空白行まで繰り返す処理は基本的なように見えますが、実務では意外とトラブルが多い処理です。
特に、空白の判定方法、基準列の選び方、最終行の取り方を間違えると、処理漏れや誤処理につながります。
また、テストデータでは問題なく動いても、本番データでは途中空白やスペース混入によって想定外の動作をすることがあります。
こうしたミスは、コードの文法というより、データの状態を想定できていないことが原因です。
ここでは、現場で起こりやすい失敗と、その対策を整理します。
事前に知っておくことで、かなり多くのトラブルを防げます。

・失敗1:途中の空白セルで処理が止まる

最も多い失敗は、途中の空白セルをデータ終了と判断してしまうことです。

対策は次のどちらかです。

  1. 必須列を基準にする
  2. 行全体が空白かどうかで判断する

たとえば、商品コードが必ず入力されるルールなら商品コード列を基準にして問題ありません。
しかし、入力漏れがある可能性があるなら、行全体で判定した方が安全です。

・失敗2:スペースだけのセルを空白と判断できない

見た目は空白でも、セルにスペースが入っている場合があります。

この場合、次の判定では空白とみなされません。

If targetWorksheet.Cells(currentRow, "A").Value = "" Then

対策として、Trimを使います。

If Trim(targetWorksheet.Cells(currentRow, "A").Value) = "" Then

これにより、前後の余分なスペースを除去して判定できます。

・失敗3:対象シートを間違える

ActiveSheetを使っていると、想定外のシートが処理されることがあります。

対策として、対象シートを明示します。

Set targetWorksheet = ThisWorkbook.Worksheets("Sheet1")

業務で使うマクロでは、処理対象を明確にすることが非常に重要です。

・失敗4:固定行数に依存して処理漏れが起きる

次のように固定行数で処理すると、データが増えたときに漏れます。

For currentRow = 2 To 1000

1001行目以降にデータが増えた場合、処理されません。

対策として、最終行を取得します。

lastRow = targetWorksheet.Cells(targetWorksheet.Rows.Count, "A").End(xlUp).Row

これにより、データ量の変化に対応しやすくなります。


✅ VBAで空白行まで繰り返す処理を実務で使う具体例

空白行まで繰り返す処理は、単体で使うというより、転記・チェック・集計・データ整形などの中で使われます。
つまり、この処理は多くのVBA自動化の土台になります。
ここを安全に作れるようになると、日常業務の自動化で使える場面が一気に広がります。
特に、一覧表を上から順番に処理するマクロでは、空白行までのループ処理がよく登場します。
ここでは、実務で使いやすい具体例として、空白行までデータを転記する処理を紹介します。
単なるサンプルではなく、あとから変更しやすい構成で作成します。

・例:A列が空白になるまで別シートへ転記する

次のコードは、Sheet1のA列が空白になるまで、A列からC列のデータをSheet2へ転記する例です。

Sub CopyRowsUntilBlankCell()

    Dim sourceWorksheet As Worksheet
    Dim destinationWorksheet As Worksheet
    Dim sourceRow As Long
    Dim destinationRow As Long
    Dim startRow As Long
    Dim lastRow As Long
    Dim keyColumn As String
    
    Set sourceWorksheet = ThisWorkbook.Worksheets("Sheet1")
    Set destinationWorksheet = ThisWorkbook.Worksheets("Sheet2")
    
    startRow = 2
    destinationRow = 2
    keyColumn = "A"
    
    lastRow = sourceWorksheet.Cells(sourceWorksheet.Rows.Count, keyColumn).End(xlUp).Row
    
    For sourceRow = startRow To lastRow
        
        ' A列が空白になったら、以降はデータなしと判断して終了する
        If Trim(sourceWorksheet.Cells(sourceRow, keyColumn).Value) = "" Then
            Exit For
        End If
        
        ' 必要な列だけを転記する
        destinationWorksheet.Cells(destinationRow, "A").Value = sourceWorksheet.Cells(sourceRow, "A").Value
        destinationWorksheet.Cells(destinationRow, "B").Value = sourceWorksheet.Cells(sourceRow, "B").Value
        destinationWorksheet.Cells(destinationRow, "C").Value = sourceWorksheet.Cells(sourceRow, "C").Value
        
        destinationRow = destinationRow + 1
        
    Next sourceRow

End Sub

このコードでは、元データのA列が空白になるまで処理を続け、A列からC列だけを転記しています。

・このコードを実務向けにしているポイント

このコードでは、次の点を意識しています。

  • 元シートと転記先シートを明示している
  • 開始行を変数にしている
  • 空白判定の基準列を変数にしている
  • 転記元行と転記先行を別々に管理している
  • 空白が出たら安全に終了する

特に重要なのは、sourceRowdestinationRowを分けていることです。

元データの行番号と転記先の行番号は、常に同じとは限りません。
将来的に「条件に合う行だけ転記する」ように変更する場合、行番号を分けておいた方が修正しやすくなります。

・別の書き方との違い

簡単なコードでは、次のように書くこともできます。

Sheets("Sheet2").Range("A2:C2").Value = Sheets("Sheet1").Range("A2:C2").Value

しかし、このような書き方では、複数行を繰り返し処理するには不向きです。
また、シート名や範囲がコード内に直接散らばるため、修正箇所が増えます。

実務では、多少コードが長くなっても、処理対象・処理条件・処理内容を分けて書く方が安全です。


 

✅ まとめ:VBAのFor文で空白行まで繰り返す処理を安全に使いこなそう

  • For文で空白行まで処理する場合は、空白を見つけたらExit Forで終了する
  • どの列を基準に空白判定するかを最初に決めることが重要
  • 実務ではTrimを使ってスペース混入に備えると安全
  • 固定行数ではなく、最終行取得と組み合わせると保守しやすい
  • 途中空白がある表では、行全体の空白判定も検討する
  • Do Whileでも実現できるが、行番号の加算忘れに注意する
  • 繰り返し使う処理は関数化すると再利用しやすい
  • 転記処理では、元データの行番号と転記先の行番号を分けると拡張しやすい

VBAで空白行まで繰り返す処理は、データ転記・集計・チェック・抽出など、さまざまな自動化の土台になります。

ただし、実務で使う場合は、単に「空白なら止める」と考えるだけでは不十分です。
空白の意味、基準列、途中空白、最終行、対象シートを整理したうえでコードを書くことで、長く使える安定したマクロになります。

まずは、A列が空白になるまで処理する基本形を理解し、次に最終行取得や関数化を組み合わせて、実務でも安心して使える形に整えていきましょう。

    -VBAで自動化, VBA一覧, 最終行・最終列, 配列・データ操作