今回解説する制御構文は前回に引き続きループ処理の For Each…Next です(^^)
は~い! よろしくお願いしますm(_ _)m
繰り返し処理の第2弾ですね。今回もしっかり勉強しま~す(^^)
前回のおさらいはこちらの記事です(^^)/ 下のカードをクリックすれば開きます
前回記事でわかったことは
・For…Nextステートメントについてしっかりと理解できました
・For…Nextの注意点についても知ることが出来ました
【この記事でわかることは】
・ループ処理「For Each…Next」の使い方がわかります
For Each…Next ステートメント
配列またはコレクションの各要素に対して、ステートメントのループを繰り返します
For Each…Next の構文
For Each…Nextステートメントは、コレクションや配列に対して、一括して同じ処理を繰り返すステートメントです
【構文】
For Each element In group
[statements]
[Exit For]
[statements]
Next [element]
elementには、コレクションや配列の要素を受け取る変数を指定します
groupには、コレクションや配列を指定します
パーツ | 説明 |
---|---|
element | 必須。 コレクションまたは配列の要素を反復処理するために使用される変数です コレクションの場合、要素(element)には、バリアント型の変数、 汎用オブジェクト変数、または特定のオブジェクト変数のみを指定できます 配列の場合は、element に使用できるのは Variant 変数だけです |
group | 必須。 オブジェクトのコレクションまたは配列の名前です (ユーザー定義型の配列を除きます) |
statements | 省略可能。 group の各アイテムに対して実行される 1 つ以上のステートメントです |
For Each…Next の動きを解説
・先ほどの構文をわかりやすく書くとこんな感じです(^^)
For Each バリアント型の変数 In オブジェクトのコレクションまたは配列
・・・実行する処理・・・
Next
・For…Nextと違い、step指定はできません
・変数が group 内の最初の要素から group にそれ以上要素がなくなるまでループします
・ループ内のすべてのステートメントが group 内の各要素に対して実行されます
・group にそれ以上要素がなくなると、ループは終了し、Next ステートメントの後のステートメントから実行が続けられます
・For Each…Next ループを別のループの内部に置くことによって、For Each…Next ループを入れ子に(ネスト)できます。ただし、各ループの element が一意である必要があります
Exit For でループを抜ける
・For Each…Next 間のステートメント内で Exit For を使えばループの途中でループを中断して抜けることが出来ます
・通常は、ステートメント内の条件評価(たとえば If…Then )によりそれ以降ループする必要なくなったと判断した場合ループを抜け、Next の直後のステートメントに制御を移します
For Each…Next 使用例(コレクション)
'ForEachNextサンプル
Sub ForEach_Sample1()
Dim ws As Worksheet
Dim msg As String
For Each ws In Worksheets '自ブックのワークシートコレクション
msg = msg & ws.Name & vbCrLf
Next ws 'wsは省略可能
MsgBox msg
End Sub
・WorksheetsコレクションのメンバーWorksheetの数だけループします
・ワークシート名をメッセージボックスに表示します
For Each…Next 使用例(配列、ネスト、Exit For)
'ForEachNextサンプル(配列)
Sub ForEach_Sample2()
Dim arr1 As Variant
Dim arr2 As Variant
Dim i As Variant
Dim j As Variant
'配列をセット
arr1 = Array(1, 2, 3)
arr2 = Array(10, 20)
'1つ目のループ
For Each i In arr1
'2つ目のループ
For Each j In arr2
MsgBox i & "×" & j & "=" & i * j
If i * j = 30 Then Exit For
Next j
Next i
End Sub
・2つの配列にデータをそれぞれデータを入れて、データ数分ループします
・1つ目の配列ループの中に、2つ目の配列ループを入れてネスト(入れ子)しています
・メッセージボックスにそれぞれの配列メンバー同士を掛け合わせは結果を表示します
・15行目でその結果を評価し「30」だった場合、Exit For でループを抜けます
For Each…Next の注意点
・このサンプルでは、Nextステートメントに element を指定しています
・Nextステートメントは element を省略しても、指定されているのと同様に継続されます
・注意しなければならないのは、Nextステートメントに指定する element を間違って指定するとエラーが発生します。これは、ネストが崩れたために発生するエラーです
・どうしても指定する場合は、ネストを崩さないように指定します
まとめ(おわりに)
今回はここで終了です!
For Each…Next ステートメントは理解できましたか?
はい! For…Nextの方がわかりやすかったけど、なんとか理解できました!
For Each…Nextではカウンターを使わないからかなぁ(^^ゞ
そうですね! For Each…Nextの場合、メンバー数を知りたい場合は group.count でメンバー数をカウントできます。
次回は Do…Loopステートメントです。楽しみに待っていてね(^^)/
まとめと感想など
・マクロ(VBA)を実行する際は必ずバックアップを取ってから行ってください!
・マクロ(VBA)は実行後にファイルを保存すると元に戻すことはできません!
・実行後にファイルを保存せず終了すれば、実行前に戻すことができます!
★★★ ランキング参加中! クリックしてね(^^)/ ★★★
今後の記事について
今回の記事はいかがだったでしょうか。皆さまのお役に立てたなら幸いです(^^;
当面は「初心者向けマクロVBA」の記事を継続して書いていきます
【検討中の今後の記事内容は・・・・・】
・実務に役立つものを提供できるよう現在検討中です
・その他雑記的に「小ネタなどいろいろ」・・・・・
・今後の記事にもご期待ください(^^)/
過去記事のサンプルファイルをダウンロードできます
この記事のサンプルはこのリンク先からダウンロードできます!
過去の記事で使用したサンプルファイルがダウンロードできるページを設置しています
こちら(このリンク先)からご利用ください
・For Each…Nextステートメントは配列またはコレクションでの使用に適しています
・For Each…Nextステートメントの使い方がわかりました