サイトについて      連絡先   検索

VBA For 文

はじめに

Excel VBA の For 文を使用してループする方法を紹介します。

For 文には For Next と For Each の二種類のループの仕方があります。

Exit For で途中でループを抜けられます。

For Next

For インデックス = 初期値 To 最終値 Step 加算値のようにして、インデックスの値が初期値から最終値になるまで 1 ずつ加算しながらループします。インデックス用の変数はあらかじめ宣言しておきます。


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

' i を 1 から 5 まで 1 ずつ加算するループ。
' 5 回ループしたいときなどの条件になります。
For i = 1 To 5 Step 1
   Debug.Print (i) ' 1 2 3 4 5
Next

' i を 5 から 1 まで 1 ずつ減算するループ。
For i = 5 To 1 Step -1
   Debug.Print (i) ' 5 4 3 2 1
Next

Step を省略すると自動で 1 ずつ加算するので通常は Step を省略します。Step は 2 や マイナスの値などを指定するときだけ書きます。


Dim i As Integer

' i を 1 から 5 まで 1 ずつ加算するループ。
For i = 1 To 5
   Debug.Print (i) ' 1 2 3 4 5
Next

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


Dim list(3) As Integer ' 配列
list(0) = 0
list(1) = 100
list(2) = 200
list(3) = 300

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

For i = 0 To UBound(list) ' UBound は 3 を返します。
   ' list 配列の要素を 0 ~ 3 までループする
   Debug.Print (list(i)) ' 0 100 200 300
Next

For Each

For Each 要素変数 In グループのようにして、配列やコレクションなどのグループのすべての要素を順番に要素変数に Set していくループです。

グループの型が Worksheets や Range などのコレクションのときは、要素変数の型を Variant 型か Object 型、またはグループの型にします。


Dim r As Range ' グループの要素を受け取る変数
' 型が不明のときは次のようにもできます。
' Dim r As Object
' Dim r As Variant

For Each r In Range("A1", "A3")
    ' r がセル A1 ~ A3 まで変化します。
    Debug.Print (r.Value)
Next

グループが配列のときは、要素変数の型を Variant 型にします。


Dim i As Variant ' コレクションの要素を受け取る変数

Dim list(3) As Integer
list(0) = 0
list(1) = 1
list(2) = 2
list(3) = 3

For Each i In list
    ' list 配列の要素をすべて取得します。
    Debug.Print (i) 0 1 2 3
Next

For Each は Worksheets や Range などのコレクションのループによく使います。

For を抜ける

For をループの途中で抜けたくなったらExit Forを使用します。


Dim i As Integer

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

   Debug.Print (i)
Next
' Exit For の後はここから処理が行われます。

Dim i As Integer
Dim w As Worksheet

For Each w In Worksheets
    i = i + 1
    If i = 3 Then ' 3 番目のシートでループを抜けます。
        Exit For
    End If

    Debug.Print (w.Name)
Next
' Exit For の後はここから処理が行われます。

次の For へ

ループを一回飛ばして次のループへ移りたいとき、他の言語でよくある Continue は VBA には存在しません。GoTo 文を使用して同じようなことができます。


Dim i As Integer

For i = 1 To 5
    If i = 3 Then
        GoTo Continue ' Continue: の行へ処理を飛ばします。
    End If
    
    Debug.Print (i) ' i が 3 のときはここは通りません。
    
Continue: ' GoTo Continue の後はここから処理が行われます。
Next

関連ページ