制御 実行を繰り返すフロー制御ステートメントFor~Each~Next

※より実装に近く表示させる為、コードの改行を避けています。スマホ等で閲覧される際は向きを変えてご覧ください。

※実装するバージョンによってはバージョンアップの仕様により動作しないコードもあります。実装には動作確認の上ご使用下さい。

For Each...Next ステートメント

配列やコレクションの各要素に対して、一連のステートメントを繰り返し実行するフロー制御ステートメントです。

  • 構文

  • For Each element In group
  • [statements]
  • [Exit For]
  • [statements]
  • Next [element]
  • For Each...Next ステートメントの構文は、次の指定項目から構成されます。
  • 指定項目 内容

  • element
  • 必ず指定します。
  • コレクションや配列の各要素を繰り返す変数を指定します。
  • コレクションの場合
    • 引数 element にはバリアント型 (Variant) 変数
    • 総称オブジェクト型変数
    • 任意の固有オブジェクト型のオブジェクトの変数
  • 配列の場合
    • 引数 element にはバリアント型のみ指定できます。
  • group
  • 必ず指定します。
    • オブジェクト コレクション名
    • 配列名 (ユーザー定義型の配列を除く) を指定します。
  • statements
  • 省略可能です。
  • 引数 group の各メンバに対して実行するステートメントを指定します。
  • 解説

  • 引数 group に要素が 1 つでもある場合、For Each ブロックは始まります。
  • ループがいったん開始されると、引数 group の最初の要素に対して、ループ内のすべてのステートメントは実行されます。
  • 引数 group の中に要素がある限り、ループ内のステートメントは、各要素に対して実行を続けます。
  • 引数 group の中にもう要素がなくなったとき、ループは終了し、Next ステートメントの次のステートメントに実行が移ります。
  • ループから抜け出す別の方法として、ループ内に任意の数の Exit For ステートメントを指定することができます。
  • 通常、Exit For ステートメントはいくつかの条件を評価した後で使用します。
  • たとえば、If...Then ステートメントを評価した後で、制御をキーワード Next の次のステートメントに直ちに移します。
  • For Each...Next ループはネスト (入れ子) 構造にすることができます。
  • つまり、For Each...Next ループの内部に別の For Each...Next ループを入れることができます。
  • ループをネスト (入れ子) 構造にするときは、それぞれの引数 element に別の変数名を指定してください。
  • メモ

  • Next ステートメントの引数 element を省略すると、引数 element が指定されているかのように実行を継続します。
  • Next ステートメントが対応する For ステートメントよりも前にあると、エラーが発生します。
  • For... Each ステートメントをユーザー定義型の配列に使用することはできません。
  • バリアント型は、ユーザー定義型の配列を持つことができないためです。

For Each...Next ステートメントの使用例

Option Explicit


Private Sub test1()
'************************************************
'あるコレクションの中の要素をすべて返す
'************************************************

Dim Found As Boolean
Dim Element As Variant
Dim MyCollection As Variant
Dim i As Long
MyCollection = Array(10, 20, 30, 40, 50, 30)
'初期化
i = 0
'MyCollectionのElementに対して繰り返します。
    For Each Element In MyCollection
    Found = False
    i = i + 1
    Debug.Print "i" & i & ":" & Found & ":" & Element
    Next
'i1:False:10
'i2:False:20
'i3:False:30
'i4:False:40
'i5:False:50
'i6:False:30
End Sub


Private Sub test2()
'************************************************
'あるコレクションの中の特定要素をすべて返す
'************************************************

Dim Found As Boolean
Dim strFound As String
Dim Element As Variant
Dim MyCollection As Variant
Dim i As Long, n As Long
MyCollection = Array(10, 20, 30, 40, 50, 30)
'初期化
strFound = "30"
i = 0: n = 0
'MyCollectionのElementに対して繰り返します。
    For Each Element In MyCollection
    Found = False
    i = i + 1
    Debug.Print "i" & i & ":" & Found & ":" & Element
        'ElementがstrFoundであれば、
        If Element = strFound Then
        n = n + 1
            'Found にTrueを設定。
            Found = True
            'For ループから抜け出します。
            Debug.Print "n" & n & ":" & Found & ":" & Element
        End If
    Next
'i1:False:10
'i2:False:20
'i3:False:30
'n1:True:30
'i4:False:40
'i5:False:50
'i6:False:30
'n2:True:30
End Sub


Private Sub test3()
'************************************************
'あるコレクションの中の特定要素があれば抜ける
'************************************************

Dim Found As Boolean
Dim strFound As String
Dim Element As Variant
Dim MyCollection As Variant
Dim i As Long, n As Long
MyCollection = Array(10, 20, 30, 40, 50, 30)
'初期化
strFound = "30"
i = 0: n = 0
'MyCollectionのElementに対して繰り返します。
    For Each Element In MyCollection
    Found = False
    i = i + 1
    Debug.Print "i" & i & ":" & Found & ":" & Element
        'ElementがstrFoundであれば、
        If Element = strFound Then
        n = n + 1
            'Found にTrueを設定。
            Found = True
            'For ループから抜け出します。
            Debug.Print "n" & n & ":" & Found & ":" & Element
            Exit For
        End If
    Next
'i1:False:10
'i2:False:20
'i3:False:30
'n1:True:30
End Sub

 

2000年01月01日|[VBサンプルコード]:[制御]