5回目:プログラムの制御-繰返し
全6回で勉強するプログラミング、5回目です。プログラム制御のひとつ、『繰返し制御』について学習します。(今回は長くなります)
繰返しとは
繰返しとは命令を繰り返す構造で、ループとも呼ばれます。繰返し制御は次のように3のタイプがあります。
- 必ず1回実行するループ
- 1度も実行しないことがあるループ
- ある範囲内で実行するループ
単純なループ
それぞれ見ていく前に、単純なループを見てみたいと思います。
‘命令の実行
Loop ‘Doに戻る
Doからループが始まり、Loopまで命令を実行するとまたDoに戻り、またLoopまで命令を実行します。Loopを見つけると必ずDoに戻ります。
つまり、この単純なループは無限ループと呼ばれるもので、永遠に終わりません。無限ループになるとプログラムで制御することができず、コンピュータに悪い影響を与えます。そのため、無限ループにならないようにループから抜ける命令を加える必要があります。
このループから抜ける命令の種類が上記で紹介した3つのタイプになります。
無限ループを中断するには
- Escキー
- CTRLキー+Breakキー
- タスクマネージャーで該当アプリを終了する
必ず1回実行するループ
必ず1回実行するループは一番最後のLoopでループを抜けるかどうかの判断をするものです。具体的にプログラムを見てみましょう。
Dim iCount As Integer
Dim intNum As Integer
iCount = 0
intNum = 0
Do
intNum = intNum + 1
iCount = iCount + 1
Loop Until intNum >= 0 ‘0以上になるまでループする
MsgBox “intNumは” & intNum & “です。” & iCount & ” 回繰り返しました。”
End Sub
プログラムを実行してみてください。Doから始まる命令を1回実行してループを抜けてます。これと比較するために次に進みます。
1度も実行しないことがあるループ
ループ内の命令を1度も実行せずに終了するループです。上記のプログラムと比べてみてください。
Dim iCount As Integer
Dim intNum As Integer
iCount = 0
intNum = 0
Do Until intNum >= 0 ‘0以上になるまでループする
intNum = intNum + 1
iCount = iCount + 1
Loop
MsgBox “intNumは” & intNum & “です。” & iCount & ” 回繰り返しました。”
End Sub
Doの最初のところで判断をしています。intNumが0以上になるまで命令を繰り返すという判断ですが、ループに入る前にすでにintNumは0のためループに入ることなく終了してます。
このように、判断を最初にするか後にするかで処理が大きく変わってきます。
VBAには「Until」(~までループを繰り返す)という条件の他に、「While」(~の間ループを繰り返す) というキーワードがあります。これについては、次で紹介します。
もう一つの無限ループ
上記でDo Until~Loop文の制御の仕組みを勉強しました。ここではもう一つのLoop文を紹介します。プログラムは次のようになります。
Dim iCount As Integer
Dim intNum As Integer
iCount = 0
intNum = 0
Do While intNum <= 5 ‘intNumが5以下の間は命令を実行する
intNum = intNum + 1
iCount = iCount + 1
Loop
MsgBox “intNumは” & intNum & “です。” & iCount & ” 回繰り返しました。”
End Sub
プログラムを書いて実行してみましょう。
無限ループになる条件
Until,Whileにループの終了・継続条件を書いてきましたが、この条件を間違えると無限ループになるという話をしましょう。
例えば、上記でDo While intNum <= 5とした条件を
Do While intNun <= 5
と、変数を書き間違えて実行してしまった場合。
この場合、intNunには値が設定されていなくて5以下の条件に当てはまってしまいます。そのため無限ループになってしまいます。
次のような場合も無限ループになります。
intNum = 0
Do While intNum >= 0
intNum = intNum + 1
iCount = iCount + 1
Loop
極端な例ですが、その条件で必ず終了するかよく確かめてから実行しましょう。
ある範囲内で実行するループ
あらかじめループを繰り返す条件の範囲が分かっている場合に使うループ構造です。早速プログラムを見てみましょう。intNumが1から10の間実行するプログラムです。
Dim intNum As Integer
Dim iCount As Integer
iCount = 0
For intNum = 1 To 10 ‘intNumが1から10まで命令を実行する
iCount = iCount + 1
Next
MsgBox “intNumは” & intNum & “です。” & iCount & ” 回繰り返しました。”
End Sub
このプログラムを実行すると、ループを抜けた後のintNumには11が入っていることが分かります。For~Nextステートメントと呼びますが、動作を詳しく見ていきましょう。
- Forに入る前のintNumは0です
- Forに入るとintNumに1が設定されます
- そして、Nextまで命令が実行され
- Nextで自動的にintNumに1が加算され
- 上限の10を超えていなければ再度For以下の命令がNextまで実行される
- 上限の10を超えるとループから抜ける
最後にもう一つ
Do~Loop文ではUntilとWhileに条件を付けてループを作りましたが、もう一つ条件の書き方があるので、紹介します。(個人的にはこの書き方の方がより分かりやすく使うことが多いです。)
ループにIF文を追加する
Do~Loop文にループを抜けるIF文を追加する方法です。
Dim iCount As Integer
Dim intNum As Integer
iCount = 0
intNum = 0
Do
intNum = intNum + 1
iCount = iCount + 1
If intNum >= 5 Then ‘intNumが5以上になったら
Exit Do ‘ループを抜ける
End If
Loop
MsgBox “intNumは” & intNum & “です。” & iCount & ” 回繰り返しました。”
End Sub
IF文はループの中のどの位置においてもかまいません。Doのすぐ後に置くこともできます。構造的にUntilやWhileと同じような処理を書くことができるのがIF文です。同様にIF文の終了条件が悪いと無限ループになります。
ループ文の中にIF文を書きましたが、ループ文の中にループ文を入れることも可能です。
最後に繰返し制御まとめ
プログラムの繰返し制御についてみてきました。他の言語にも同様のループ文があります。どのループを使うかは、何を処理するかによって変わります。まずは実践をこなして慣れるしかないと思います。
以下は今回使ったループ文です
- Do ~ Loop
- Do Until ~ Loop
- Do While ~ Loop
- Do ~ Loop Until
- Do ~ Loop While
- For~Next
4回目問題の解答例
4回目の一番最後の問題その2の解答例を次に示します。実際に書いて実行してみましょう。
Dim strBMI As String
If dblBMI < 18.5 Then
strBMI = “低体重”
ElseIf dblBMI >= 18.5 And dblBMI < 25 Then
strBMI = “普通体重”
ElseIf dblBMI >= 25 And dblBMI < 30 Then
strBMI = “肥満1度”
ElseIf dblBMI >= 30 And dblBMI < 35 Then
strBMI = “肥満2度”
ElseIf dblBMI >= 35 And dblBMI < 40 Then
strBMI = “肥満3度”
ElseIf dblBMI >= 40 Then
strBMI = “肥満4度”
Else
strBMI = “”
End If
BMI判断 = strBMI
End Function