For Each Next文を使った繰り返し処理

VBA を使った繰り返し処理の一つである For Each ... Next 文の使い方です。 For Each ... Next ではコレクションに含まれるオブジェクトを順に取り出したり、配列に含まれる要素を順に取り出して処理を行いたい場合に使用します。ここでは Excel VBA で For Each Next 文を使った繰り返し処理を行う方法について解説します。

(Last modified: )

For Each...Nextの使い方

VBA で繰り返し処理を行う方法の一つである For Each ... Next の使い方です。書式は次の通りです。

For Each 変数 In コレクションまたは配列
    実行する処理
Next

コレクションからオブジェクトを一つ取り出し変数に代入します。そのあとで繰り返し処理を 1 回行います。再びコレクションからオブジェクトを一つ取り出して変数に代入し繰り返し処理を行います。これをコレクションに含まれるオブジェクトがなくなるまで繰り返します。

配列を指定した場合も同じように配列から要素を一つ取り出して変数に代入したあと繰り返し処理を行います。配列のすべての要素を取り出すまで繰り返します。

繰り返し処理が何回行われるのかはコレクションに含まれるオブジェクトの数、または配列に含まれる要素の数によって決まります。

サンプルコード

それでは簡単なサンプルを作成して試してみます。

Option Explicit

Sub テスト()
    Dim r As Range

    For Each r In Range("B2:B5")
        r.Value = r.Value * 0.9
    Next
End Sub

このサンプルではセル範囲 B2:B7 に含まれるセルを順番に取り出し、それぞれのセルの値に 0.9 を乗算した結果をセルに新しい値として入力します。

プログラムの実行前にワークシートには次のような値を入力してあります。

For Each...Nextの使い方(1)

それでは実際にプログラムを実行してみます。

For Each...Nextの使い方(2)

プログラムを実行するとワークシートの値が次のように変更されました。

For Each...Nextの使い方(3)

サンプルコード

もう一つ別のサンプルを作成して試してみます。

Option Explicit

Sub テスト()
    Dim pref(4) As String
    Dim I As Variant

    pref(0) = "東京都"
    pref(1) = "大阪府"
    pref(2) = "愛知県"
    pref(3) = "北海道"

    For Each I In pref
        Debug.Print I
    Next I
End Sub

このサンプルでは 4 つの要素を持つ配列から要素を順番に取り出し、イミディエイトウィンドウに出力しています。

それでは実際にプログラムを実行してみます。

For Each...Nextの使い方(4)

プログラムを実行するとイミディエイトウィンドウに次のように出力されました。

For Each...Nextの使い方(5)

このようにコレクションや配列に含まれるオブジェクトや要素を順番に取得して繰り返し処理を行いたい場合に For Each...Next を使用すると便利です。

For Each...Nextで使用する変数のデータ型について

For Each ... Next ではコレクションや配列からオブジェクトや要素を取り出して変数に代入します。

For Each 変数 In コレクションまたは配列
    実行する処理
Next

この変数のデータ型は RangeWorksheet などのオブジェクトを表すデータ型または Variant 型しか指定することができませんので注意が必要です。

コレクションからオブジェクトを取り出す場合はそのオブジェクトを表すデータ型を指定すればいいので問題ないですが、配列から要素を取り出す場合にはその要素のデータ型を指定してしまうとエラーとなるので注意が必要です。

例えば先ほどのサンプルを次のように変更してみます。

Option Explicit

Sub テスト()
    Dim pref(2) As String
    Dim I As String

    pref(0) = "東京都"
    pref(1) = "大阪府"

    For Each I In pref
        Debug.Print I
    Next I
End Sub

配列は String 型の配列なので、 For Each ... Next で使用する変数のデータ型を String 型にしてみます。

このプログラムを実行すると次のように「For Each を配列で使用する場合は、バリアント型の配列でなければなりません。」というエラーが表示されます。

For Each...Nextで使用する変数のデータ型について(1)

このように For Each ... Next で使用する変数のデータ型については Variant 型しか使用できない点に注意してください。

-- --

Excel VBA で For Each Next 文を使った繰り返し処理を行う方法について解説しました。

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。