ループ処理は、条件分岐と並んで、プログラミングの重要なポイントである。コンピュータには人間のような大掴みという概念は存在せず、必ず順次処理を行う。それが高速で行われるために、大抵人間よりも処理が速いということであり、ループを使いこなすことはプログラミングにおいては絶対的に必要だと認識すべきである。
VBAにおいて、基本となるループ処理は2種類である。ループ回数があらかじめ判っている場合は「For 〜 Next」を用い、回数以外が条件の場合は「Do 〜 Loop」を用いる。これらは、一方でもう一方の代用とすることも可能である。ただし、「For 〜 Next」で「Do 〜 Loop」を代用する場合は、処理に無駄が出たり、プログラム構造が美しくない(理解し難い)ものとなる。
For 〜 Nextは下記のように記述される。ここでは、ループ回数を格納するための変数を「I」とし、これが1から10まで変化していくものである。有体に言えば、10回のループである。
For I = 1 to 10 −−処理−− Next I |
変化していく「きざみ」を指定するために、For文の末尾(最終値の後)に「Step」という語と数値を記述することも出来る。何も指定しなければ「きざみ」は1であり、大抵はそのままで処理が行えるであろう。とにかく手軽にループを組むことが出来るわけで、初心者向けと言うか、汎用性が低くても良い処理に向いている。ループの回数を規定するのため、データ数が変化するようなケースに対応させるのは難しい。次の例は、変数を2刻みで2から10まで変化させるもので、ループ回数は5回になる。
For I = 2 to 10 Step 2 −−処理−− Next I |
これのバリエーション(?)として、「For Each 〜 Next」というループ構文もあるが、ここでは説明は割愛させていただく。うまく使えば効果は高いが、プログラムはやや解り難くなるようである。
Do 〜 Loopには、更に4種類のパターンがある。条件式が成立している間(つまり条件式が成立しなくなるまで)ループするものと、条件式が成立するまでループするものがあり、それぞれについて、条件判別を処理前に行ったり処理後に行ったりするという2つのケースがあるためだ。それぞれをリストアップすると、
I = 1 Do While I <= 10 −−処理−− I = I + 1 Loop |
サンプルのプログラムとして、配列の中から指定する値を持つものを探すループを記述する。前提条件として、配列は1〜9で、探す値は99としている。プログラムの処理手順は、初期値のリセットを行った後、総当りでマッチングを取っていくループを回すだけである。ループから抜けた時点で、変数「I」は該当した値が入っている配列の引数となり、もしこれが10であれば指定した値が見付からなかったことを示す。(ちなみに、このプログラムの場合、配列の大きさは10以上が必要である)
I = 1 Do While ( I <= 9 ) AND ( HAIRETSU(I) <> 99 ) I = I + 1 Loop |
条件式は「ループ変数が9以下 かつ 配列変数の値が99ではない」場合を示す。どちらかの条件が成立しなくなるとループから抜けるので、「ループ変数が10になった場合」と「配列変数の値が99である場合」にループ処理が終了するしかけ。サンプルと言いながら、ちょっと簡単過ぎか。
同じ処理を、上記リストの2番目、つまり、成立するまで処理するパターンで記述する。これも簡単なので説明は不要だろう。この例の場合は、こちらの記述の方が素直で良いようだ。
I = 1 Do Until ( I = 10 ) OR ( HAIRETSU(I) = 99 ) I = I + 1 Loop |
このようなループをプログラムする際に注意すべきことは、一にも二にも条件式に尽きる。いつまでも成立しない条件式にしてしまうとプログラムが終了しなくなるし、予期せぬエラーを発生させることにもなる。条件式は「必ずいつかは成立する」ようにしなければならない。複雑怪奇な条件式や、いくつもの条件が複合しているようなものも、プログラムが正しく動作するかを確認することが難しので、できるだけシンプルな条件式を使うよう、プログラムの構想段階から考えておきたい。