エクセルVBAのFor Each~Nextステートメントについて解説しています。
<< エクセルVBAのIE制御に利用したステートメント一覧(VBAのIE制御入門) :前の記事
<< エクセルVBAのプログラムの制御構文(VBAの初心者入門) :前の記事
こちらは、エクセルVBAのFor Each~Nextステートメントの解説になります。こちらは、特定のコレクションや配列に対して一括して同じ処理を行いたい場合に利用されます。
また、ステートメントとは「命令文」と訳されるようにコンピュータに具体的な動作を指定する最小単位のプログラムです。主にマクロの挙動を制御する構文や文法を指します。通常は1行で完結する部分を指しますが、If~Thenなど複数行にまたがる部分を意味することもあります。
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」を記述することで、強制的にループから抜け出します。
Sub sample()
Dim st As Object
For Each st In Sheets
MsgBox st.Name
Next
End Sub
※ドラッグ(スワイプ)すると全体を確認できます。
sampleのSubステートメントには引数の設定はされていません。まず、Dimステートメントを利用してオブジェクト変数stにオブジェクト型(Object)を宣言しています。次にFor Each~Next文のオブジェクトを格納する変数にはオブジェクト変数stをコレクションにはSheetsコレクションを設定しています。これによりSheetオブジェクトの数だけ次の行の処理を繰り返し行います。
繰り返し処理はMsgBox関数とSheetオブジェクトのNameプロパティを利用してシート名をメッセージボックスに表示させています。今回は、「Sheet1」「Sheet2」「Sheet3」の3シートですので、3回ループ処理が実行されました。
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
※ドラッグ(スワイプ)すると全体を確認できます。
sampleのSubステートメントには引数の設定はされていません。まず、Dimステートメントを利用して変数arrayData,iにはバリアント型(Variant)を宣言しています。次にArray関数を利用して「1」「3」「5」の値を配列の要素として格納しています。
そして、For Each~Next文のオブジェクトを格納する変数には変数iを配列には配列arrayDataを設定しています。これにより配列の要素の数だけ次の行の処理を繰り返し行います。
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文(子)が記述されています。このような構造を「ネスト(入れ子)構造」と呼ばれます。
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を掛け合わせた値を表示させています。
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
※ドラッグ(スワイプ)すると全体を確認できます。
こちらでは、ループ処理を途中で止める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のDo~Loopステートメント >>
IEのデータ収集&自動操作のプログラミング本はこの1冊だけ!IEの起動やポップアップウィンドウ、表示を制御する基本的なコードはもちろん、テキストボックスやラジオボタン、表、ハイパーリンクなどのHTML部品を制御する方法など、自動操作に欠かせないノウハウを丁寧に解説。
ExcelのVBAについてのQ&A掲示板↑ExcelのVBA全般について分からない事があればこちらの掲示板よりご質問ください。
VBAのIE操作入門↑ExcelのVBAをマスターできたら、エクセルVBAのIE操作にも挑戦してみてください。
こちらでは、エクセルVBAの事例で利用したステートメントをまとめたものです。ExcelのVBAには様々な機能が用意されていますので一度ご確認ください。
こちらでは、エクセルVBAの事例で利用したオブジェクトをまとめたものです。ExcelのVBAには様々な機能が用意されていますので一度ご確認ください。
こちらでは、エクセルVBAの事例で利用したオブジェクトのプロパティをまとめたものです。ExcelのVBAには様々な機能が用意されていますので一度ご確認ください。
こちらでは、エクセルVBAの事例で利用したオブジェクトのメソッドをまとめたものです。ExcelのVBAには様々な機能が用意されていますので一度ご確認ください。
こちらでは、エクセルVBAの事例で利用したオブジェクトのイベントをまとめたものです。ExcelのVBAには様々な機能が用意されていますので一度ご確認ください。