エクセルVBAのFor Each~Next文

<< エクセルVBAのIE制御に利用したステートメント一覧(VBAのIE制御入門) :前の記事

<< エクセルVBAのプログラムの制御構文(VBAの初心者入門) :前の記事

こちらは、エクセルVBAFor Each~Nextステートメントの解説になります。こちらは、特定のコレクションや配列に対して一括して同じ処理を行いたい場合に利用されます。

また、ステートメントとは「命令文」と訳されるようにコンピュータに具体的な動作を指定する最小単位のプログラムです。主にマクロの挙動を制御する構文や文法を指します。通常は1行で完結する部分を指しますが、If~Thenなど複数行にまたがる部分を意味することもあります。

目次

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

For Each~Nextステートメントは、コレクションや配列に対して、一括して同じ処理を繰り返すフロー制御ステートメントです。

For Each オブジェクトを格納する変数 In コレクション・オブジェクト
 繰り返す処理
Next

構文For Each element In group
[statements]
[Exit For]
[statements]
Next [element]
キーワード省略説明
element×配列やコレクションの各要素を繰り返す変数を指定します。配列の場合は引数elementにはバリアント型のみ指定でき、コレクションの場合はバリアント型 (Variant) 変数、総称オブジェクト型変数、または任意の固有オブジェクト型のオブジェクトの変数を指定することができます。
group×配列名 (ユーザー定義型の配列を除く)、オブジェクト コレクション名を指定します。
statements引数groupの各メンバに対して実行するステートメントを指定します。こちらにループ処理させる具体的な処理内容を記述していきます。

引数groupに要素が1つでも実行可能ですが、For Each...Nextステートメントを利用する場合は、複数の配列やコレクションの場合に有効です。ループ処理が開始されると、引数groupで指定した配列の数だけループ処理を行います。途中でループ処理を終了したい場合は、Exitステートメントを利用して「Exit For」を記述することで、強制的にループから抜け出します。

コレクションを設定したFor Each~Next文サンプルコード


Sub sample()

    Dim st As Object

    For Each st In Sheets

        MsgBox st.Name

    Next

End Sub

実行結果

コレクションを設定したFor Each~Next文の結果

解説

sampleのSubステートメントには引数の設定はされていません。まず、Dimステートメントを利用してオブジェクト変数stにオブジェクト型(Object)を宣言しています。次にFor Each~Next文のオブジェクトを格納する変数にはオブジェクト変数stをコレクションにはSheetsコレクションを設定しています。これによりSheetオブジェクトの数だけ次の行の処理を繰り返し行います。

繰り返し処理はMsgBox関数とSheetオブジェクトのNameプロパティを利用してシート名をメッセージボックスに表示させています。今回は、「Sheet1」「Sheet2」「Sheet3」の3シートですので、3回ループ処理が実行されました。

配列を設定したFor Each~Next文サンプルコード


Sub sample()

    Dim arrayData As Variant
    Dim i As Variant
    
    '配列
    arrayData = Array(1, 3, 5)

    
    For Each i In arrayData

        msgbox i
    
    Next i

End Sub

実行結果

配列を設定したFor Each~Next文の結果

解説

sampleのSubステートメントには引数の設定はされていません。まず、Dimステートメントを利用して変数arrayData,iにはバリアント型(Variant)を宣言しています。次にArray関数を利用して「1」「3」「5」の値を配列の要素として格納しています。

そして、For Each~Next文のオブジェクトを格納する変数には変数iを配列には配列arrayDataを設定しています。これにより配列の要素の数だけ次の行の処理を繰り返し行います。

ループ処理をネスト(入れ子)構造にしたFor Each~Next文サンプルコード


Sub sample()

    Dim arrayData As Variant
    Dim arrayData2 As Variant
    Dim i As Variant
    Dim j As Variant
    
    '配列
    arrayData = Array(1, 3, 5)
    arrayData2 = Array(10, 15)


    
    For Each i In arrayData
    
        For Each j In arrayData2
    
            MsgBox i & "×" & j & "=" & i * j
    
        Next j
    
    Next i

End Sub

実行結果

ループ処理をネスト(入れ子)構造にしたFor Each~Next文の結果

解説

今回の事例はFor Each~Next文(親)の中にFor Each~Next文(子)が記述されています。このような構造を「ネスト(入れ子)構造」と呼ばれます。

sampleのSubステートメントには引数の設定はされていません。まず、Dimステートメントを利用して変数arrayData,arrayData2,i,jをVariant型で宣言しています。次にArray関数を利用して変数arraDataには「1」「3」「5」を変数arrayData2には「10」「15」の値を配列の要素として格納しています。

そしてFor Each~Next文(親)のオブジェクトを格納する変数には変数iを配列には配列arrayDataを設定しています。次の処理では更に、For Each~Next文(子)が設けられており、こちらはオブジェクトを格納する変数には変数jを配列には配列arrayData2を設定しています。

それぞれ配列の要素の数だけ次の行の処理を繰り返し行います。繰り返し処理はMsgBox関数と算術演算子を利用して変数iと変数jを掛け合わせた値を表示させています。

Exit Forステートメントを利用したFor Each~Next文サンプルコード


Sub sample()

    Dim arrayData As Variant
    Dim i As Variant
    
    '配列
    arrayData = Array(1, 2, 3, 4, 5)

    
    For Each i In arrayData

        If i <= 3 Then
        
            MsgBox i & "回目のループです。"
        
        Else
        
            Exit For
        
        End If

    
    Next i

End Sub

実行結果

基本形のFor Each~Next文の結果

解説

こちらでは、ループ処理を途中で止めるExit Forステートメントを利用しています。sampleのSubステートメントには引数の設定はされていません。 まず、Dimステートメントを利用して変数arrayData,iにはバリアント型(Variant)を宣言しています。

次にArray関数を利用して「1~5」の値を配列の要素として格納しています。そして、For Each~Next文のオブジェクトを格納する変数には変数iを配列には配列arrayDataを設定しています。

For Each~Next文の中の処理ですが、こちらはIf~Then~Elseステートメントを利用して変数iが3以下の場合は真(True)を返し、4以上の場合は偽(False)を返す処理になっています。

変数iが3までは通常通りメッセージボックスが表示されますが、4の場合は偽(False)となり「Exit For」が実行されます。

「Exit For」はFor Each~Next文のループを抜ける制御ステートメントですので、ループ処理から抜け出します。これにより本来変数iが5まで処理を繰り返すところを強制的に抜け出すことにより処理内容が変更されました。

ある条件の下にループ処理を解除したい場合は有効ですので、その際は利用するようにしましょう。

エクセルVBAのプログラム制御構文一覧

次の記事: エクセルVBAのDo~Loopステートメント >>

Excel VBAでIEを思いのままに操作できるプログラミング術 Excel 2013/2010/2007/2003対応

近田 伸矢, 植木 悠二, 上田 寛

IEのデータ収集&自動操作のプログラミング本はこの1冊だけ!IEの起動やポップアップウィンドウ、表示を制御する基本的なコードはもちろん、テキストボックスやラジオボタン、表、ハイパーリンクなどのHTML部品を制御する方法など、自動操作に欠かせないノウハウを丁寧に解説。

  • このエントリーをはてなブックマークに追加
ExcelのVBAについてのQ&A掲示板

↑ExcelのVBA全般について分からない事があればこちらの掲示板よりご質問ください^^

VBAのInternetExplorer操作入門

↑ExcelのVBAをマスターできたら、エクセルVBAのIE(InternetExplorer)操作にも挑戦してみてください^^

VBAのIE制御入門RSS

RSSフィードを登録すると最新記事を受け取ることができます。

VBAIE操作のスカイプレッスン

エクセルVBAのステートメント

こちらでは、エクセルVBAの事例で利用したステートメントをまとめたものです。ExcelのVBAには様々な機能が用意されていますので一度ご確認ください。

エクセルVBAのオブジェクト

こちらでは、エクセルVBAの事例で利用したオブジェクトをまとめたものです。ExcelのVBAには様々な機能が用意されていますので一度ご確認ください。

エクセルVBAのプロパティ

こちらでは、エクセルVBAの事例で利用したオブジェクトのプロパティをまとめたものです。ExcelのVBAには様々な機能が用意されていますので一度ご確認ください。

エクセルVBAのメソッド

こちらでは、エクセルVBAの事例で利用したオブジェクトのメソッドをまとめたものです。ExcelのVBAには様々な機能が用意されていますので一度ご確認ください。

エクセルVBAのイベント

こちらでは、エクセルVBAの事例で利用したオブジェクトのイベントをまとめたものです。ExcelのVBAには様々な機能が用意されていますので一度ご確認ください。