更新日:、 作成日:
VBA For 文でループする (For Each, For Next)
はじめに
Excel VBA マクロの For 文でループする方法を紹介します。
For Next は For インデックス = 初期値 To 最終値 のようにして、指定した回数だけループします。
For Each は For Each 要素 In コレクション のようにして、コレクションのすべての要素をループします。
Exit For のようにして、For ループを抜けます。
GoTo Continue のようにして、ループをスキップできます。
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
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