【VBA】繰り返し処理(For~Next/Do ~Loop)

Excel・VBA

繰り返し処理の方法に関して、For~Next やDo until ~ Loop、Do while ~ Loopの違いと使い方をまとめたので紹介します。

For ~ Next文

繰り返しの回数が予めわかっている場合には、For ~ Next文を使用します。

For Next文は次のように書きます。

《For ~ Next文》
 For 変数 = 初期値 To 終了値 (Step 増加値)
  処理
 Next
※()内は省略可能

For ~ Next文の書き方

For 変数 = 開始値 To 終了値 (Step 増加値) で書き始め、Nextで終わるが基本です。この間に繰り返しの処理内容を記入します。 

For~Next文では、繰り返し回数=終了値ー初期値+1です。変数の増加値は、”Step 増加値”を記載することで指定が可能ですが、省略することも可能です。省略した場合は、増加分が+1となります。

また、初期値と終了値は、変数(上の画像の場合は” i “)のとる値の範囲を示しています。この変数を用いてセルの検索などを行う場合は、初期値と終了値をセルの検索範囲に設定しておくと便利です。

繰り返し回数は少ないと処理が不十分となったり、多いとエラーが発生するので注意しましょう。

Do Until ~Loop文

繰り返し回数が分からない若しくは、変数がある条件に到達するまで繰り返し処理を行う場合に使用します。

《Do Untile ~ Loop文》
 
Do Untile 条件
  処理
 Loop

Do until 文の書き方

Do Until文は、Do Until 条件 で書き始め、Loopで終わります。この間に繰り返す処理の内容を記入します。条件に到達した場合、繰り返しのループから解放されます。(上の図の場合だと変数”ii”が10になるまで処理を繰り返すとなっています。)

Do Until ~Loop の注意点

Do Until ~ Loopで繰り返しを行う場合、繰り返しから抜け出す条件の指定に注意しましょう。条件の指定を間違えると、無限ループに陥ります。

たとえば、日々の売り上げのうち一番最初に一万円を超えた日を取得するコードを次のように書いたとします。

個の表から初めて売り上げが1万円を超える日を検索する
無限ループが発生するコード

colは行を検索するための変数です。売り上げが記載されている一番上の行が8行目なので初期値を8としています。また、売り上げが記載されている列は5列目なのでCells(col,5)となります。

上記の例では、colを1ずつ増加させつつ、Cells(col,5)の値が10000を超えているかを条件部分で判断しています。もし超えていた場合は繰り返しを終了し、日付を変数doyに格納します。

では、実際にこのプログラムを動かしたらどうなるでしょうか?

このコードでは、売り上げ列のセル値を参照し、繰り返し条件の判断を行っていますが表の中に条件に合致した金額が存在していないので、表の範囲を検索し終わっても引き続き検索が行われてしまうことになります。

改善策としては、表の範囲の検索が終わったら処理を終了する処理を追加します。

改善例

改善例では、colの値を増加させた後に、If ~ End If にてcolの値を判断しています。表の範囲が17行目までなのでcolの値が18になっていたら、変数doyにメッセージを格納し、Go To文によって繰り返しから抜け出ています。(If ~ End if文については、別の記事にて説明します)

Go To文は、処理を抜け出したい所にGo To 任意の名称と書いておき、抜け出したい先に、任意の名称:(:はダブルコロン)と書くことで”Go To 任意の名称”と書いたところから、”任意の名称:”と書いたところへ処理をスキップすることができる処理です。

このようにすることで、無限ループに陥ることがなくなります。なお、上記の例ではcolの値を判断していますが、セルの値が空白かどうかで判断させる方法もあります。この場合は表の大きさが変わっても対応可能なので汎用性が高いです。

Do While ~Loop文

Do Untilがある条件になるまで処理を繰り返すのに対して、Do Whileは条件の範囲内であれば処理を繰り返します。

《Do While ~ Loopの書き方》
 Do While 条件
  処理
 Loop

Do While分の書き方は、Do Until文と同様で、Do While 条件 で書き始め、Loopで終わります。条件部分の書き方もDo Untilと同様です。では使用例を見てみましょう。

累積売上額が1万円を超えた日を検索

表のケースにおいて、累積売上額が初めて1万円を超えた日を検索するために、Do While ~ Loopを使ってプログラムを書いてみます。

Do While ~ Loopの使用例

上記の例では、変数(uriage)の値を積算していき、条件(uriage<=10000)以内かどうかで処理を繰り返すか判断をしています。変数(uriage)が10000以下であれば処理を繰り返します。

Do While ~ Loopの注意点

Do While ~ Loopを使用する場合、Do Untilと同様に、繰り返し条件の指定の仕方によって無限ループに陥る可能性があるので注意してください。

前述の使用例のケースでは、表内の売上をすべて積算した場合でも、10000を超えなかった場合、無限に処理が繰り返されてしまいます。

条件の指定および、繰り返しから抜け出す処理をしっかり検討しましょう。

Do Until ~ LoopとDo While ~ Loop

Do UntilとDo Whileによる繰り返しでは、条件の書き方を変えればどちらも使えます。つまり、使用者の好みに合わせて使い分けられます。個人的には、ある条件に合致するまで処理を繰り返すDo Until ~ Loopの使用をお勧めします。

主観的な意見ですがDo Untilの方が、直感的にわかりやすい感じがします。


コメント

タイトルとURLをコピーしました