VBA講義室 > コードの構造化 > 繰り返し処理

繰り返し処理

繰り返し処理もコード構造化の基本中の基本である。

Do Loopステートメント

Do と Loop の間に書かれたステートメントを繰り返し実行する。
実行条件が満たされている間、もしくは終了条件が満たされるまで実行を繰り返す。

【構文1】先に条件を評価するもの。

Do の直後に条件を評価するので、条件によってはDo と Loop の間に書かれたステートメントが実行されない場合もある。


Do [{While | Until} condition]
[statements]
[Exit Do]
[statements]
Loop

【構文2】後に条件を評価するもの。

Loop に達してから条件を評価するので、Do と Loop の間に書かれたステートメントは最低一回は実行される。


Do
[statements]
[Exit Do]
[statements]
Loop [{While | Until} condition]

指定項目の説明

条件の評価


While condition
条件式condition がTrueの間、処理を繰り返す。条件式condition が True であれば、Do Loop間のステートメントを実行し、FalseになればLoopステートメントの次のステートメントへ処理を進める。
Until condition
条件式condition がTrueになるまで、処理を繰り返す。条件式condition が False であれば、Do Loop間のステートメントを実行し、TrueになればLoopステートメントの次のステートメントへ処理を進める。

【補足】

{While | Until} condition や Exit Do は省略できるが、全て省略してしまうとオーバーフローなどのエラーになって実行が中断するか、或いは無限ループに陥る。終了させる条件を最低ひとつは用意しておく必要がある。

While Wend ステートメント


While...Wend ステートメント

指定した条件が真 (True) である間、一連のステートメントの実行を繰り返すフロー制御ステートメント。

Do Loopと類似。条件を判断して処理を繰り返す目的で使用する。

構文


While condition
[statements]
Wend

指定項目の説明

条件式 condition がTrue であれば、While〜Wend 間に指定された statements を が実行。Wend に達したときに、処理が While へ戻り、再度条件式 condition を評価。評価した結果が True の場合は、この繰り返しとなり、また、False の場合は、Wend ステートメントの次のステートメントへ実行が移る。

Do Loopとの違い

While Wendステートメントと、Do Loopステートメントは条件によって処理を繰り返すと言うことにおいて、良く似た処理をする。根本的に違うのは、Do Loopステートメントでの Exit Doステートメントにあたる処理の途中でループから抜け出す手法がWhile Wendステートメントには用意されていないこと。
したがって、「構造化」と言う意味においてはDo Loopステートメントのほうが柔軟な処理が可能であるし、処理そのものについてもDo Loopステートメントで代用が出来るので、VBAコードを書くにあたってWhile Wendステートメントは必須ではないように思える。

For Nextステートメント

ステートメントを指定回数分繰り返す。

【構文】


For counter = start To end [Step step]
[statements]
[Exit For]
[statements]

Next [counter]

指定項目の説明

なお、start , end , step の各引数には数値型の変数を使用することも可能。

ループ制御の流れ

  1. 引数 counter に引数 start の値を代入
  2. 引数 counter と引数 end の値を引数 step の値を加味して評価。終了条件が満たされていれば終了。
  3. 終了条件が満たされていなければループ内のステートメント実行。
  4. 実行後、Nextステートメントで 引数 step の値を引数 counter に加算。
  5. 2.へ処理が戻り、終了条件評価。

1.の処理は一回だけ行なわれ、以後2. 〜 5.の処理が終了条件を満たすまで繰り返される。

ループの実行条件

引数 step で指定した値によりループの実行は次のように制御される。

【例】
・For i = 1 to 0
・引数 step は省略されているので Step 1 (加算値は正の数)が省略されているとみなされる。
・引数 counter として使用される変数 i の初期値は 1 。
・だが、その時点で最終値を超えているので実行ステートメントを実行せずにループは終了。
・For i = 1 to 0 Step -1
・引数 counter として使用される変数 i の初期値は 1 。
・Step -1 (加算値負の数)で最終値以上であるので、一回は実行ステートメントが実行される。
・For i = 1 to 1 Step 0
・引数 counter として使用される変数 i の初期値は 1 。
・Step 0 (加算値0)のため変数 i は何回ループしても最終値以上にならない(無限ループ)。
・ループを抜け出す処理が必要になるが、引数 counter をアテにしないループなら通常はDo Loopステートメントを使用する。

ループを強制終了

ループから強制的に抜け出す方法として、Exit For ステートメントが用意されている。
ループ内に任意の数を指定することができる。
If Then ステートメント、Select Caseステートメントなど条件を評価できるステートメントで条件を評価した上でExit For ステートメントによりループから抜け出す。
抜け出した後は キーワード Next の次のステートメントへ実行が移る。

【補足】

【例】


For i = 1 To 10
For j = 1 To 10
...
Next j
Next i

For Each Nextステートメント

配列やコレクションの各要素に対して、一連のステートメントを繰り返し実行。

構文


For Each element In group
[statements]
[Exit For]
[statements]

Next [element]

指定項目の説明

ループ制御の流れ

  1. 引数 group に要素がある場合処理開始
  2. 引数 group の要素のインデックスの小さいメンバより引数 element に格納(または参照を格納)
  3. 引数 element に格納(または参照を格納)したメンバに対して、ループ内のステートメントを実行。
  4. 実行後、引数 group の要素の次のインデックスのものがあれば、2.へ処理が戻る。
    引数 group の中に要素がある限り、2.〜4.を繰り返す。引数 group の中にもう要素がなくなれば、ループを終了し、Next ステートメントの次のステートメントに実行が移る。

ループの強制終了

ループから強制的に抜け出す方法として、Exit For ステートメントが用意されている。
ループ内に任意の数を指定することができる。
If Then ステートメント、Select Caseステートメントなど条件を評価できるステートメントで条件を評価した上でExit For ステートメントによりループから抜け出す。
抜け出した後は キーワード Next の次のステートメントへ実行が移る。

【補足】

【例】


For Each Sh In Worksheets
For C In Sh.Cells
...
Next C
Next Sh


前(条件分岐) 目次 次(分岐処理)


SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送