- 詳細
- 投稿者: Super User
- カテゴリ: PC・モバイル
- 公開日:2013年6月24日
VBAの中でループ処理を行うためのFor文には、2種類の構文があります。
1つはFor~Nextステートメントで、カウンタを利用してループ処理を行います。
もう1つは、For Each~Nextステートメントで、コレクションや配列に対して要素の1つ1つを取り出しながらループする方法です。
For~Nextステートメントの記述方法
For カウンタ = 初期値 To 終了値 [Step 増減値]
Next [カウンタ]
※[]で囲まれている部分は省略可能です。
これだけではわかりにくいので、例を挙げて説明します。
Dim Cnt As Integer
For Cnt = 1 To 10 Step 1
MsgBox Cnt & "回目"
Next Cnt
このマクロでは、Cntの初期値を1とし終了値を10にしてFor~Nextの間の処理を繰り返します。
つまり、Cntの値は1から10まで1ずつ増えていき、合計10回のMsgBoxが実行されることになります。
MsgBoxの引数にCntがあるので、"1回目"、"2回目"…"10回目"というメッセージボックスが表示されるのがわかりますでしょうか?
10回のループを終えた後はCntが11になり、終了値の10を超えるためループは終了します。
このようにFor~Nextステートメントは、ループの回数を指定して決められた回数だけ処理を進めるために利用されます。
For~Nextステートメントでは省略可能な部分があるので、上の例は省略すると以下の通りになります。
Dim Cnt As Integer For Cnt = 1 To 10 MsgBox Cnt & "回目" Next
Stepの部分と、Nextの次のCntが省略されています。
Stepについては、省略すると1を指定した=1ずつ増えるという決まりがありますので、1以外にする時には省略してはいけません。
Nextの次のCntについては省略しても構いませんが、省略することでどのForに対応しているかわかりずらくなって保守性を損なうので、
可能な限り省略しないのが良いとされています。
For Each~Nextステートメントの記述方法
For Each 要素 In グループ
Next [要素]
※[]で囲まれている部分は省略可能です。
これだけ見てすぐにピンとくる人はまずいませんから、同じように例を上げてみます。
Dim Rng As Range For Each Rng In Range("A1:A3") MsgBox Rng Next Rng
グループにRange("A1:A3")を指定しているように、複数の要素を指定するのがポイントです。
このマクロでは、RngにRange("A1:A3")の1つずつを入れてFor Each~Next間の処理を繰り返します。
For~Nextの場合と違い、開始条件と終了条件がありませんね。
For Each~Nextでは、グループに指定している要素の数だけ自動的にループしていきます。
つまり、グループにどのくらいの数があるかどうかは意識せずにループ処理を行うことができるという訳です。
数がわからない場合のループ処理に使われることが多いのが、For Each~Nextステートメントの特徴です。
実際には、Range("A1")の値、Range("A2")の値、Range("A3")の値の順番でメッセージボックスが表示されます。
Range("A3")まで進むと、もうRange("A1:A3")には他の要素がありませんからループを抜けていきます。
For~Nextと同じように、Nextの次のRngについては省略しても構いませんが、できれば省略しないで書いておきたいものです。
ループを抜けたい場合は?
このように2つのFor文は異なる目的で使用されますが、ループを途中でやめたい場合にはどうするのでしょうか?
For文でループを抜けるには、「Exit For」と記述することで可能になります。
Exit Forは、For~Nextステートメントでも、For Each~Nextステートメントでも共通です。
Dim Cnt As Integer For Cnt = 1 To 10 Step 1 If Cnt = 3 Then Exit For MsgBox Cnt & "回目" Next Cnt
上のマクロでは、If文を使ってCntが3になったら直ちにループを抜けるようにしています。
従って、メッセージボックスで表示されるのは、"1回目"と"2回目"だけになります。