Visual Basic 6.0 初級講座 |
第6回 繰り返し処理
「ループ」とは繰り返しのことです。たとえば、1000行書かなくてはいけないプログラムもうまくループを使えば5行くらいになることがあります。
この回の概要 ・ループを使うとプログラムの部分を繰り返して実行できる。 ・ループするには Do 〜 Loop、For 〜 Next を使う。 ・For 〜 Next を使ってたくさんの円を描く方法 ・Do 〜 Loop を使ってテキストファイルを読み込む方法 |
さて、円を書くにはCircleメソッドを使うのでした。たとえば、次のコードは赤い円を書きます。
Circle (1000,1000), 500, RGB(255, 0, 0) |
一つのCircleメソッドでは一つの円しか書けません。それでは1000個の円を書くには1000回もCircleメソッドを使わなければならないのでしょうか?そんなことはありません。これから1000個の円をたった3行で描く方法を説明しましょう。
冒頭にも書いたようにループとは「繰り返し(くりかえし)」のことです。
たとえば、次のプログラムはメッセージボックスを何回も繰り返して表示します。
(このプログラムをとめるには キーボードの[Ctrl] + [Pause(Break)]を押してください。)
Do MsgBox "Hello!" Loop |
この例のように Do 〜 Loop の間に書いたコードは繰り返し実行されます。この例ではMsgBoxしかかかれていませんが、ループの中には何行でもコードを書くことができます。
プログラムでループを終了させるには、ループの終了条件を書くか、自分でループを抜けるように命令します。またFor 〜 Next を使うと指定した回数だけ繰り返すようなループを作ることもできます。
For 〜 Nextを使った単純な例は次のようになります。
Dim K
As Long For K = 0 To 5 MsgBox "今" & K & "周目" Next K |
この例では6回繰り返した後自動的にループは終了します。
VBで特に用意されているループ構文には次のものがあります。
キーワード | 特徴 |
Do 〜 Loop | 終了条件または継続条件が指定できる。 |
For 〜 Next | 繰り返し数が指定できる。 |
For Each 〜 Next | コレクション用の特別なループ。 |
While 〜 Wend | 継続条件が指定できる。 |
2.真ん中に円を描く
それでは、For 〜 Next を利用した具体的な例を見てみましょう。まずはループを使わないで単純に円がフォームの真ん中に描かれるようにします。
円が描かれる場所は座標で指定するからフォームの真ん中にかかれるようにするにはフォームの真ん中の座標がわかればいいのです。フォームの横の長さは Form1.ScaleWidth でわかります。たての長さは Form1.ScaleHeight でわかります。たとえば次のコードはフォームのたて、横、たての長さと中心の座標を表示するものです。
Private Sub Form_Click()
Dim
Yoko As Long Yoko = Form1.ScaleWidth MsgBox
"よこ: " & Yoko & " たて: " & Tate End Sub |
注:Form_Clickにプログラムしたので、フォームをクリックすると作動します。
座標が分かれば円はすぐに書けます。次のコードはフォームの真ん中に半径200の緑の円を描きます。
Private Sub Form_Click()
Dim Yoko
As
Long Yoko =
Form1.ScaleWidth 'この下の2行はもうじゃまなので消してもよい。 MsgBox
"よこ: " & Yoko & " たて: " & Tate Circle (Yoko / 2, Tate / 2), 200, RGB(0, 255, 0) End Sub |
3.円を5個描く
中心に円を描けたところで手始めに5個の円を書きます。同じ円を書いてもつまらないので半径を少しずつ変えて描くことにします。
Circleメソッドだけでやると次のようになります。(これは悪い例なのでまねしないでください!)
'悪い例 Private Sub Form_Click() Dim Yoko
As Long Me.BackColor = vbBlack Yoko = Form1.ScaleWidth 'この下の2行はもうじゃまなので消してもよい。 MsgBox "よこ: "
& Yoko & " たて: " & Tate Circle (Yoko / 2, Tate / 2), 200, RGB(0, 255, 0) End Sub |
フォームをクリックすると大きさの違う緑の円が5個描かれるでしょう。その場でフォームの大きさを変えてもまたクリックすればちゃんと真ん中に描かれるので気持ちいいです。 分かりやすいようにフォームの背景色が黒になるようにもしてみました。
■画像1
しかし、5つのCircleメソッドは半径の数字が違うだけで後は同じですよね。そこで、次のように繰り返し命令(くりかえしめいれい)で処理できるわけです。
5つの円を書くよい例。
Private Sub Form_Click()
Dim Yoko
As
Long Me.BackColor = vbBlack
Yoko =
Form1.ScaleWidth 'この下の2行はもうじゃまなので消してもよい。 MsgBox
"よこ: " & Yoko & " たて: " & Tate For K = 100 To 600 Step 100 Circle (Yoko / 2, Tate / 2), K, RGB(0, 255, 0) Next K End Sub |
このコードを実行してもさっきと全く同じ5個の円が描かれます。それではいよいよでてきたFor Nextについて説明しましょう!
For Next は「この間にあるコードを繰り返せ」という命令です。この場合は間にあるのはCircle文なのでこれが繰り返されます。別にどんな文を間に入れてもかまわないし、2つ以上の文を入れてもよいです。ただし、Nextがないとエラーになります。
VBはこの命令でコードが何回繰り返したかを数えています。それが K です。
For K = 100 To 600 は 「Kは始め100で、これが600になるまでくりかえせ」という意味です。通常は1回繰り返すごとに自動的にKの値は1増えます。だから 234回目の繰り返しの時、K=334です。
ところが、
For K = 100 To 600 Step 100 と打つと少し違います。「1回繰り返すごとに自動的にKの値が1増える」というところだけちがくなって「1回繰り返すごとに自動的にKの値が100増える」ということになります。
だから、5回しか繰り返されません。これで5個の円が描かれる理由が分かりましたか?
さらに、Kを半径として指定すれば自動的に半径も100ずつ増えていくという見事さです!
それが、Circle(Yoko/2 , Tate/2),K,RGB(0,255,0) の半径がKになっている理由です。
さて、ここまで説明すれば円を1000個描く方法はすぐ分かるでしょう?
注: 当然のことですが K の名前は自分で勝手に変えてよいです。たとえば Hankei にするなら次のようになります。
Dim Hankei as Long For Hankei = 100 To 600 Step 100
Next Hankei |
4.1000個の円を描く
1000個の円を書くにはさっきの5個の円を描くコードの繰り返し部分を1000回繰り返すようにすればよいのです。Kは1回繰り返すと100ずつ増えるのだから、1000回繰り返させるにはKが100000にまでなるようにすればよいのだからつぎのようにたった数字一つを直すだけで終わりです。
Private Sub Form_Click()
Dim Yoko
As
Long Me.BackColor = vbBlack
Yoko =
Form1.ScaleWidth 'この下の2行はもうじゃまなので消してもよい。
MsgBox
"よこ: " & Yoko & " たて: " & Tate For K = 100 To 100000 Step 100 Circle (Yoko / 2, Tate / 2), K, RGB(0, 255, 0) Next K End Sub |
実行させてみるとどうです?目が回るでしょう?
しかし、これで安心してはいけません!課題はあります。
まず、はじめは「3行で書く」と言ったのに10行もあります。まあ、これは真ん中に描くようにしたのでながくなったのですが、もう一つ重要なことに この方がわかりやすい というのがあります。プログラムは短く書くよりわかりやすく書いた方がかっこいいし、後々のためです。
とはいっても約束通り3行でも書けるところをお見せしましょう。
次のように書けばやはり真ん中に1000個の円が描けます。
Private Sub Form_Click() Dim K As Long Me.BackColor = vbBlack
End Sub |
以上For 〜 Nextを使ってループする方法を説明しましたが、VBにはこの他にもDo 〜 Loop (Do = ドゥー, Loop = ループ)、While 〜 Wend(While = ホワイル, Wend = ホワイルエンド)、For Each 〜 Next (Each = イーチ)が用意されています。
While 〜 Wend はDo 〜 Loop の機能縮小版です。まず使わないので説明しません。またWhile Wendは知らない人が多いので混乱を招きますから使わないようにしてください。
For Each 〜 Next は特殊なループ構文ですので今回は解説しません。
Do 〜 Loop の特徴は終了条件 または継続条件を指定できる点です。For 〜 Next の場合は数値が指定した値になったときにループを終了するという単純な条件しか指定できませんでしたが、Do 〜 Loopを使うとIf文と同じくらい複雑な条件を指定できます。
Do 〜 Loop で終了条件を指定するには Until (Until = アンティル)を使います。
たとえば、次の例では変数の値が100を越えるとループは終了します。
Dim X
As Long X = 1 Do Until X > 100 X = X + X Debug.Print X Loop |
途中に出てくるDebug.Printはイミディエイトウィンドウに出力する命令ですから、結果を確認するにはイミディエイトウィンドウを見てみてください。イミディエイトウィンドウを表示するにはVBの[表示]メニューから[イミディエイトウィンドウ]をクリックします。
■画像2
結果を確認してみると分かるのですが、実際には最後に 128 と出力されます。 100を越えているのでおかしいようにも思えますが、X > 100 という終了条件の判断はループの一番先頭で行われている点に注意してください。
つまり、足し算→出力→判定 の順序なので 128 は判定されるより前に出力されてしまいます。
この例で128が出力されないようにするには次のようにします。
Dim X
As Long X = 1 Do Debug.Print X X = X + X Loop Until X > 100 |
この例では 出力→足し算→判定 の順序になるので 100 を超える値は絶対に出力されません。
ただし、前の例では出力されていなかった 1 が最初に出力されるようになります。
このように Do 〜Loop 文の条件は Do または Loop とともに指定することができます。ほとんどの人は Do のところで指定しているみたいですが、 Loopでも条件を指定できるということは時には重要な意味を持ってくる場合もあります。
Do 〜 Loop で継続条件を指定するには While (While = ホワイル)を使います。
たとえば、次の例では変数の値が100以下であればループを継続します。
Dim X
As Long X = 1 Do While X <= 100 X = X + X Debug.Print X Loop |
Do 〜 Loop はデータベースの処理や、ファイルの処理などに良く使われます。「最後まで読め」という命令がしやすいからです。For 〜 Next だと「何回繰り返せ」という形式になるので、はじめから繰り返し回数が分かっている場合にしか使えません。
次の例では Do 〜 Loop を使ってテキストボックスにテキストファイルの内容を表示します。
あらかじめ下の表のようにコントロールのプロパティを設定しておいてください。また、テキストファイルの内容を表示するのですからText1は大きめに配置してください。
コントロール | プロパティ | 値 |
Text1 (TextBox) | MultiLine | True |
MultiLineプロパティ (MultiLine = マルチライン) を Trueにしておくとテキストボックスに複数行のテキストを表示できるようになります。
Dim
FileName As String Dim Fn As Integer Dim LineText As String Text1.Text = "" FileName = "C:\Windows\vbaddin.ini" Fn = FreeFile() Open FileName For Input As #Fn Do Until EOF(Fn) Line Input #Fn, LineText Text1.Text = Text1.Text & vbNewLine & LineText Loop Close #Fn |
ファイル操作がらみのプログラムが増えてループがわかりにくくなっています。今回はファイル操作についての説明はしませんが、ループの説明のために簡単に補足だけします。
Line Inputはテキストファイルから1行分のテキストを読み込んできて変数にセットします。この例では 変数LineTextにセットされます。もう一度 Line Input を呼び出すと、今度は次の1行を読み込んできてくれます。これを利用してファイルの終わりまでLine Inputを呼び出すとファイルのすべての内容を読み込んだことになります。
ファイルの終わりまで読み込んだかどうかは EOF関数でわかりますから、これをループの終了条件にすればいいわけです。
7 補足
今回はループを使って1000個の円を描いたり、テキストファイルを終わりまで読み込んだりしてみました。
その中で説明し切れないループの性質が3つほどありましたので補足しておきます。
自分で命令してループから脱出することができます。
ループの種類 | 脱出命令 |
Do 〜 Loop | Exit Do |
For 〜 Next | Exit For |
While 〜 Wend | (なし) |
たとえば、For 〜 Next の中で Exit Forを呼び出すと、ループ回数がまだ残っていてもループを抜けることができます。
ループの中でループをすることもできます。Forループの中でDoループを使ったりもできます。もちろん同じ種類のループ同士をネストすることもできます。
繰り返し実行するには今回紹介した以外の方法もあります。たとえば、一定時間ごとに繰り返したい場合はDo 〜 Loop や For 〜 Next よりも タイマーコントロールを使った処理の方が適しています。
また、自分で自分を呼び出す再帰処理によってループを作ることも可能で、この再帰処理が非常に有効に働く場面もあります。
それぞれの詳細はまたの機会に説明します。