Developer

【ExcelVBA】For Each~Nextステートメント
2022.08.31
Lv1

【ExcelVBA】For Each~Nextステートメント

For Each~Nextステートメントとは

For Each~Nextステートメントは以前説明したFor NextやDo Loopと同様同じ処理を何度も繰り返すような必要がある際に使用される繰り返し処理の1つです。
For NextやDo Loopを使用すればどんな繰り返し処理も記述することができます。
そのため、For Each~Nextを使用しなくても何とかなるのですが、For Each~Nextを使用することで他の繰り返し処理よりも簡潔にコードを記述できることがあります。
ではFor Each~Nextの書式から見ていきましょう。

For Each~Nextの構文

For Eachの構文は以下のようになります。

For Each 変数 In データの集合
	繰り返す処理
Next

データの集合とは配列のような関連する複数のデータが格納されているものになります。
For Each~Nextステートメントは、指定されたデータの集合から1つずつ値を取り出して処理する際に使用します。
まずデータの集合から先頭の値を1つ取り出し、For Eachの後ろで指定した変数に格納します。
そして繰り返す処理が終了すると今度は2番目の値を取り出し変数に格納します。
これを値がなくなるまで繰り返し処理をします。
データがなくなるまで繰り返すのでFor NextやDo Loopのようにループのカウンタや終了条件、継続条件を指定する必要がありません。
また取り出しの処理を別途記述する必要がありません。
そのためデータの集合がありデータの数だけ繰り返すといった処理の場合は、For NextやDo Loopよりも使いやすく簡潔にコードを記述することができます。
逆に回数を指定して繰り返す、条件を付けて繰り返すといった場合は、For NextやDo Loopなどのほうが使いやすいことがあります。

For Each~Next

ではサンプルコードで使い方を見ていきましょう。
1、2、3、4が格納されている配列の中身をすべて加算する処理をFor Each~Nextで記述してみましょう。

Sub VBA基礎第37回_1()
    
    Dim score(4) As Integer
    Dim num As Variant
    sum = 0
   
    score(0) = 1
    score(1) = 2
    score(2) = 3
    score(3) = 4
    '値がなくなるまでデータを読み込んでいく
    For Each num In score
        sum = sum + num
    Next
    MsgBox sum
       
End Sub

実行結果は以下のようになります。

処理を見ていきましょう。
For Each~Nextで配列を使用する場合は、変数をVariant型にしなければならないという決まりがあります。
繰り返し処理の部分はscoreから値を1つ取り出しnumに格納しそれをsumに加算するという処理になっています。
最初の処理では先頭の1がnumに格納され、繰り返しの2回目はnumに2が格納されます。
4日目の繰り返し処理でnumに4が格納された後は配列にデータがもうないため繰り返し処理の終了となります。

同様の処理をFor Nextで記述すると以下のようになります。

Sub VBA基礎第37回_2()
    
    Dim score(4) As Integer
    Dim num As Integer
    sum = 0
   
    score(0) = 1
    score(1) = 2
    score(2) = 3
    score(3) = 4
    '値がなくなるまでデータを読み込んでいく
    For i = 0 To 3
        num = score(i)
        sum = sum + num
    Next
    MsgBox sum
       
End Sub

For Nextを使用する場合は、繰り返し回数を指定する必要があります。
またnum = score(i)といったように、配列から値を取り出す処理が必要となります。

もう一つ使い方を見ておきましょう。
シートに以下のような数値が記入されているとします。

数値の合計値を出してみましょう。

Sub VBA基礎第37回_3()
    
    Dim num As Variant
    sum = 0
   
    '範囲内のデータを読み込んでいく
    For Each num In Range("A1:A7")
        sum = sum + num
    Next
    
    MsgBox sum
       
End Sub

結果は以下になります。

セルの範囲を指定してその範囲内の値を順番に取り出して加算しています。
今回は使用していませんが、途中で処理を終了したい場合はExit Forを使用して終了させることができます。

繰り返し処理を行うためのステートメントは複数あり、それぞれの記述について覚えておいて下さい。
今回のようにデータの集合から値を順番に取り出して、値の数だけ繰り返し処理をする処理にFor Each~Nextは向いています。
Do Loopの際にも述べましたが、個人的にはそれ以外の繰り返し回数が決まっている処理の場合、For Nextステートメントのほうが使いやすい場合が多く、繰り返す回数が不定で終了条件がはっきりしている場合はDo Loopステートメントが使いやすいのではないかと思います。

まとめ

For Each~NextステートメントはFor NextやDo Loopなどと同じ繰り返し処理に使えるステートメントです。
データの集合から値を順番に取り出し処理をすることでき、そのような際には他の繰り返し処理のステートメントよりも使いやすいものとなります。

確認問題

以下の「○○○」に当てはまる文言を解答してください。

・For Each NextはFor NextやDo Loopなどと同じ○○○処理に使えるステートメントです。

・構文は以下のようになります。

For ○○〇 変数 ○○〇 データの集合
	繰り返す処理
Next
答え


・For Each NextはFor NextやDo Loopなどと同じ繰り返し処理に使えるステートメントです。

・構文は以下のようになります。
[vb] For Each 変数 In データの集合
繰り返す処理
Next
[/vb]

次回は、「【ExcelVBA】VBAの関数 文字列操作①」です。

 

連載目次リンク

ExcelVBA 入門 連載目次