MENU
\ お問い合わせはこちら! /

VBA ループ処理 完全ガイド|For Next・Do While・For Each の使い方を解説

  • VBAのFor NextとDo Whileの違いがわからない
  • ループを途中で抜けたり、スキップする方法が知りたい
  • セル範囲や配列をまとめて処理したい

このような疑問にお答えします。

VBAでループ処理を書くとき、For Next・Do While・For Each の3種類から選ぶことになります。それぞれ得意な場面が違うので、使い分けを理解しておくとコードがスッキリします。

この記事では各ループの基本構文から、ループを抜ける方法・よくある使いどころまで、コード例を交えて解説します。

VBAのループ処理とは

ループ処理とは、同じ処理を繰り返し実行する仕組みのことです。たとえば「A1からA100まで順番に値を確認する」といった処理をループで書けば、同じコードを100回書く必要がなくなります。

VBAには主に3種類のループ構文があります。

構文向いている場面
For Next回数が決まっているループ
Do While / Do Until条件が満たされるまで繰り返すループ
For Eachコレクション(セル範囲・シートなど)の全要素を処理するループ

それぞれ詳しく見ていきましょう。

For Next文の使い方

For Next は繰り返す回数があらかじめ決まっているときに使います。カウンター変数を使って指定した範囲を1つずつ処理します。

基本構文

VB
For カウンター変数 = 開始値 To 終了値
    ' 繰り返す処理
Next カウンター変数

実際にセルに1〜5の数字を入力する例です。

VB
Sub ForNextSample()
    Dim i As Long
    For i = 1 To 5
        Cells(i, 1).Value = i
    Next i
End Sub

Step でカウントを変える

Step を使うと、カウンターを1ずつではなく任意の数ずつ増減させられます。

VB
' 2ずつ増やす(1, 3, 5, 7, 9)
For i = 1 To 10 Step 2
    Debug.Print i
Next i

' 逆順(10, 9, 8 ... 1)
For i = 10 To 1 Step -1
    Debug.Print i
Next i

逆順ループは、行を下から削除していくときなどに役立ちます。

ネスト(二重ループ)

For Next を入れ子にすると、行と列を同時に処理できます。

VB
Sub NestedLoop()
    Dim i As Long, j As Long
    For i = 1 To 3  ' 行
        For j = 1 To 3  ' 列
            Cells(i, j).Value = i * j
        Next j
    Next i
End Sub

Do While / Do Until文の使い方

Do ループは繰り返し回数が決まっていないとき、つまり「ある条件を満たす間(または満たすまで)繰り返す」場合に使います。

Do While(条件が真の間繰り返す)

VB
Do While 条件式
    ' 繰り返す処理
Loop

A列のデータを上から順に読んで、空白セルが来たら止める例です。

VB
Sub DoWhileSample()
    Dim i As Long
    i = 1
    Do While Cells(i, 1).Value <> ""
        Debug.Print Cells(i, 1).Value
        i = i + 1
    Loop
End Sub

Do Until(条件が真になるまで繰り返す)

Do Until は「条件が満たされるまで」繰り返します。Do While の条件を反転させたイメージです。

VB
Sub DoUntilSample()
    Dim i As Long
    i = 1
    Do Until Cells(i, 1).Value = ""
        Debug.Print Cells(i, 1).Value
        i = i + 1
    Loop
End Sub

後判定(ループ後に条件チェック)

条件を Loop の後ろに書くと、最低1回は処理を実行してから条件を確認します。

VB
Do
    ' 最低1回は実行される
    処理
Loop While 条件式

For Each文の使い方

For Each はコレクションの全要素を順番に処理するときに使います。セル範囲・シート・コレクションなど、「数を数えなくていい」場面で便利です。

セル範囲を処理する

VB
Sub ForEachCells()
    Dim cell As Range
    For Each cell In Range("A1:A10")
        If cell.Value > 100 Then
            cell.Interior.Color = RGB(255, 255, 0)  ' 黄色でハイライト
        End If
    Next cell
End Sub

全シートを処理する

VB
Sub ForEachSheets()
    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Worksheets
        Debug.Print ws.Name
    Next ws
End Sub

シート数を気にせず全シートに同じ処理を適用できるので、シート数が変動するブックに便利です。

ループを抜ける・スキップする方法

Exit For / Exit Do でループを抜ける

条件が満たされたタイミングでループを終了させたい場合は Exit For または Exit Do を使います。

VB
Sub ExitForSample()
    Dim i As Long
    For i = 1 To 100
        If Cells(i, 1).Value = "終了" Then
            Exit For  ' ループを抜ける
        End If
        Debug.Print Cells(i, 1).Value
    Next i
End Sub

次のループへスキップする(Continue相当)

VBAには他の言語の continue にあたる構文がありません。GoTo でループの末尾に飛ばすのが一般的な方法です。

VB
Sub SkipSample()
    Dim i As Long
    For i = 1 To 10
        If Cells(i, 1).Value = "" Then GoTo Continue  ' 空白はスキップ
        Debug.Print Cells(i, 1).Value
Continue:
    Next i
End Sub

GoTo の使いすぎはコードを読みにくくするので、スキップ条件が複雑な場合は処理を別のSubプロシージャに切り出すほうがスッキリします。

よくある使いどころ

最終行まで処理する

データ件数が変動する場合は、最終行を取得してからループします。

VB
Sub ProcessToLastRow()
    Dim lastRow As Long
    Dim i As Long
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row  ' A列の最終行を取得
    For i = 2 To lastRow  ' 2行目(ヘッダー除く)から最終行まで
        Cells(i, 2).Value = Cells(i, 1).Value * 1.1
    Next i
End Sub

配列の全要素を処理する

配列のループには For NextUBound の組み合わせが定番です。

VB
Sub ArrayLoop()
    Dim arr As Variant
    Dim i As Long
    arr = Array("Apple", "Banana", "Cherry")
    For i = LBound(arr) To UBound(arr)
        Debug.Print arr(i)
    Next i
End Sub

LBound / UBound を使うと、配列のサイズが変わってもコードを変更する必要がありません。

まとめ:用途別の使い分け

3種類のループをまとめると次のとおりです。

構文使う場面
For Next回数が決まっている1行目から100行目まで処理する
Do While / Until条件次第で回数が変わる空白セルが出るまで処理する
For Eachコレクションの全要素を処理全シート・セル範囲を一括処理する

迷ったときは「回数が決まっているか?」を判断基準にすると選びやすいです。決まっているなら For Next、決まっていないなら Do ループ、コレクション全体なら For Each と覚えておきましょう。

この記事が気に入ったら
フォローしてね!

シェア・記事の保存はこちら!

この記事を書いた人

コメント

コメントする

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)