更新日:、 作成日:

VBA For 文でループする (For Each, For Next)

はじめに

Excel VBA マクロの For 文でループする方法を紹介します。

For Next は For インデックス = 初期値 To 最終値 のようにして、指定した回数だけループします。

For Each は For Each 要素 In コレクション のようにして、コレクションのすべての要素をループします。

Exit For のようにして、For ループを抜けます。

GoTo Continue のようにして、ループをスキップできます。

条件を満たすまでループするには「Do While, Do Loop 文」をご覧ください。

For Next

For インデックス = 初期値 To 最終値 のように入力し、改行して Next を入力します。指定した回数だけループします。

インデックス用の変数を宣言します。その値が初期値から最終値になるまで 1 ずつ加算しながらループします。

Dim i As Integer ' インデックス用の変数

' i が 1 から 3 まで 3 回ループする
For i = 1 To 3
    Debug.Print(i) ' 1 2 3
Next

For インデックス = 初期値 To 最終値 Step 加算値 のように Step を入力して、インデックスの値を加算や減算する値を指定できます。Step -1 なら逆順にループできます。

Dim i As Integer

' i が 1 から 5 まで 2 ずつ加算する
For i = 1 To 5 Step 2
    Debug.Print(i) ' 1 3 5
Next

' i が 3 から 1 まで -1 ずつ減算する
For i = 3 To 1 Step -1
    Debug.Print(i) ' 3 2 1
Next
一般的に Step は省略して 1 ずつ加算するループを使用します。それがわかりやすいからです。

For Next は配列のループによく使われます。

Dim list(2) As Integer ' 配列
Dim i As Integer       ' インデックス用の変数

For i = LBound(list) To UBound(list) ' 0 To 2
    list(i) = i * 10 ' 配列の要素に値を代入する
Next

For i = LBound(list) To UBound(list) ' 0 To 2
    Debug.Print(list(i)) ' 0 10 20
Next

For Each

For Each 要素 In コレクション のように入力し、改行して Next を入力します。コレクションのすべての要素をループをループします。

要素用の変数を宣言します。コレクションの要素が順番にその変数に設定され、最後の要素までループします。

Dim item As Range ' 要素用の変数

' item にセル A1 ~ A3 が順番に代入される
For Each item In Range("A1:A3")
    Debug.Print(item.Address) ' $A$1 $A$2 $A$3
Next
Dim item As Worksheet ' 要素用の変数

' item にシートが順番に代入される
For Each item In Worksheets
    Debug.Print(item.Name) ' Sheet1 Sheet2 Sheet3
Next

Range や Worksheets のように複数の要素を持っているものを「コレクション」と言います。

配列はコレクションではありませんがループできます。そのときは要素の型を Variant 型にします。

Dim list(2) As Integer ' 配列
list(0) = 0
list(1) = 1
list(2) = 2

Dim item As Variant ' Variant 型にする

For Each item In list
    Debug.Print(item) ' 0 1 2
Next

配列の値は取得できても代入はできないので、そのときは For Next で配列をループします。

For を抜ける

Exit For を入力して、すべての種類の For を抜けられます。

Dim i As Integer

For i = 1 To 5
    If i = 3 Then ' i が 3 になったら
        Exit For  ' For を抜ける
    End If

    Debug.Print(i) ' 1 2
Next
' Exit For の後はここから処理が行われる
Dim w As Worksheet

For Each w In Worksheets
    If w.Name = "Sheet3" Then ' シート名が Sheet3 だったら
        Exit For              ' For を抜ける
    End If

    Debug.Print(w.Name) ' Sheet1 Sheet2
Next
' Exit For の後はここから処理が行われる

何らかの理由でループを続行できなくなったときや、ループする必要がなくなったときに便利です。

ループをスキップする (Continue)

ループをスキップして次のループへ移りたいときがあります。他の言語では Continue などでできますが VBA にその機能はありません。そこで GoTo 文を使用して同じことができます。

GoTo Continue のように入力して、ループをスキップできます。

Dim i As Integer

For i = 1 To 5
    If (i Mod 2) = 0 Then ' i が偶数のときはスキップ
        GoTo Continue ' Continue: の行へ処理を飛ばす
    End If

    ' ここにループ処理
    Debug.Print(i) ' 1 3 5

Continue: ' GoTo Continue の後はここから処理が行われる
Next
GoTo 文については「GoTo 文」をご覧ください。