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

VBA For 文

はじめに

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

For Next と For Each の 2 種類があります。

Exit For で途中でループを抜けたり、Continue のように次のループへ飛ばせます。

  • 目次
    • For Next
    • For Each
    • For を抜ける
    • 次のループへ

For Next

For Next は指定した回数だけループするときに使います。

For インデックス = 初期値 To 最終値のように入力し、改行してNextを入力します。その間の処理をループします。


For i = 1 To 3
    ' ここにループする処理
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 を入力して、インデックスの値を加算や減算する値を指定できます。


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 はコレクションのすべての要素をループするときに使います。

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


For Each cell In Range("A1:A3")
    ' ここにループする処理
Next

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


Dim item As Range ' 要素用の変数

' item にセル A1 ~ A3 が 1 つずつ設定される
For Each item In Range("A1:A3")
    Debug.Print(item.Address) ' $A$1 $A$2 $A$3
Next

Dim item As Range ' 要素用の変数

' item にワークシートが 1 つずつ設定される
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 を抜ける

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 の後はここから処理が行われる

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

次のループへ

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


Dim i As Integer

For i = 1 To 3
    If i = 2 Then
        GoTo Continue ' Continue: の行へ処理を飛ばす
    End If
    
    ' ここにループ処理
    Debug.Print(i) ' 1 3、i が 2 のときはここを通らない
    
Continue: ' GoTo Continue の後はここから処理が行われる
Next
  • 目次
    • For Next
    • For Each
    • For を抜ける
    • 次のループへ