<HOME  <お願い事項  <Access2000 TOP   <Access97 TOP   <サイト内検索
  Ac2002--VBAの沼 > ループ処理
   1 2



ループ処理_1

さてさて・・・。
今回は、おそらく、VBAによるコード記述の中で、最も難所となるであろう「ループ」についてお話いたします。

こんな言い方をしておりますが、決して難しいわけではないんですよ。
「難所」とは、高度な知識が必要という意味で申し上げているのではゴザイマセン。
VBAをこれから学ぶ、という方の中には、プログラミングというものにあまり縁のなかった方も多いと思います。
そういう方にとっては、「ループ」というものがなぜ必要なのか、これがよくわからないと思うんですよね。

理屈ではなく、もっと潜在意識の部分で・・・
頭で理解しているつもりで構文を覚えてコードが書けるようになっても、どっかしら「地に足がついてない」感があるなあって思うんです。
それから、今までお話してきた内容だと、うっかり書き間違い状態で実行しても、せいぜいエラーメッセージが返ってくるくらいなもんでしたけれども、ループの場合は「永久ループ」などと申しまして、永遠に終わらないプロシージャになってしまう可能性も大なのです。
構文を理解するより前に、意味と必要性をしっかり抑えておかないとならないもんだ・・・ということで、「難所」ではないかな、と考える次第です。

ループというのは、要するに「繰り返し処理」のことです。
単純に申し上げますと、

 腕立て伏せ開始
   ひじを曲げて
    ひじを伸ばして
   ひじを曲げて
   ひじを伸ばして
   ひじを曲げて
   ひじを伸ばして
   ひじを曲げて
   ひじを伸ばして
 腕立て伏せ終わり

こういうプロシージャがあったとします。
こういう書き方でもいいんですよ。これでもちゃんと、腕立て伏せを4回やるよう指示を出したことになります。
20回やるよう指示を出したいなら、あと16回分書き足せばいいんですよね。全部で40行になりますか。

これを、以下のように書き直してみます。

 腕立て伏せ開始
  以下を4回繰り返す
    ひじを曲げて
    ひじを伸ばして
 腕立て伏せ終了

↑こう書くことが「ループ処理」です。
もうちょっとVBAっぽく書くと、

 腕立て伏せ開始
  回数が4回になるまで繰り返す
    ひじを曲げて
    ひじを伸ばして
  回数カウントアップ
 腕立て伏せ終了

こんな感じでしょうか。
「回数カウントアップ」というところが、VBA独特の言い回しというか考え方が出てくるところなので、こういうところをきちっとおさえておけば、後はそんなに難しいことも特殊なこともないでしょう。
ループ処理は、プロシージャのソースの行数を少なくして全体の処理を見渡しやすく分かりやすくするためのもの、と考えてよいと思います。



ループ処理にはいろんな書き方やり方があるんですが、代表的なものは以下のふたつですね。

  For  Next
  Do  Loop

今回は手始めに、For Nextを使って雰囲気をつかんでみましょう。
簡単に考えると、これは

 For
  なんかしら
 Next

で、「なんかしら」を繰り返す、という単純な構文です。



じゃあ、ひとつ例を。。。まずは簡単なやつからやってみましょう。
100に1ずつ、20回足し算をしてみましょう。
そんな顔しないでくださいよ。。。しょうがないじゃないですか〜。
For Nextの構造を知るためには、こういう簡単な例でお話せざるをえないんですから・・・。

前の章でお話した「変数」のことをもう一度思い出してみてください。

今回は100に1ずつ足し算する処理を20回やります。
20回の足し算が完了するまで、足し算の途中の「答え」をどう扱うか、を考えないとなりません。

  1回目 100+1=101
  2回目 101+1=102
     ・
     ・

ってなるわけですよね。
ここで勘違いしちゃいけないのが、「100に1を足す」ことを20回繰り返すんじゃないですよ。
100+1を何回やっても、答えは101です。
100がスタートで、そこから1ずつ加算するわけです。つまり、前の回で出した答えに、1を足すわけですよね。
前の回で出した答えを、どっかに書き留めておかないとなりません。
そこで、「変数」に書き留めておこう、というわけなんです。

今回は、Publicプロシージャを作成しましょう。
(別にPrivateプロシージャということで、コマンドボタンのクリック時とかに作ってもいいんですけど、デバッグの仕方などについて少しお話したいので)
前のコーナーでの実習で、既にModule1という名前のモジュールができている場合は、これを開いてください(デザインモードで)。
モジュールがまだ一個もない場合は、モジュールを新規作成してください。

このモジュールの中に、新しくプロシージャを一つ作ります。

うーん、Subプロシージャでいいかな・・・。
何か適当なプロシージャ名を付けて、次に進んでください。

そしたら・・まず、ループの準備をいたしましょう。
ループの準備からやらないといけないわけじゃないんですが・・・今回は、書き方に慣れるため、です。

 i というのが、変数名です。

この変数はちょうど、「カウンタ」の役割をにないます。
なんでもいいんですが、For Next というループ処理をやるとき、けっこう i っていう変数名にすること、多いんですよ。
多分、ヘルプで「コードのループ」っていうところを見たときのサンプルコードも、i とか x とか j とか、アルファベット1文字で変数を宣言しているケースが多いんじゃないかと思います。
なので、こういう1文字の変数名に慣れておいたほうが、もしかしたらFor Nextというループ処理に馴染みやすくなるかも、と思います。
まあ、でも、別に何でもいいんですよ。ほんとはね。
そしたら次に、実際に「20回繰り返し足し算をする処理を、For と Next の間に書きます。

実際にはここにもっと実のある処理が書かれることになるんでしょうが、今日は練習なので、足し算で我慢してください。

そしたらここで、デバッグの方法について少しお話をいたします。
イミディエイトウィンドウというウィンドウがありまして、いわば「テスト実行の結果」を表示することができるわけなんです。
イミディエイトウィンドウがVBEのウィンドウの中に見当たらない場合は、メニューバーの[表示]→[イミディエイトウィンドウ]で表示させましょう。

で、このプロシージャの中に、こんな命令を埋め込んでみましょう。
ループを抜けた後に、debugと入力して、半角のドットを入力してください。

これは、「この時点で、変数などの値がどうなっているか、イミディエイトウィンドウに出力したいときに使う命令文です。

こういうふうに↑しておくと、このプロシージャを実行したときに、kotaeがいくつかを、イミディエイトウィンドウに書き出してくれるわけなんです。

では・・・。
イミディエイトウィンドウに、プロシージャ名を入力してEnterキーを押します。

なんか、数字が返ってきますか?
kootaeという変数には、1ずつ足し算をしているので、とりあえず、20回計算を繰り返してはいるみたいですね。

ループに入る前に、変数に数字を代入しておくと、

こんなふうに↑なります。