5回目:プログラムの制御-繰返し

更新日:2023/9/7 [投稿日:2023/3/9]

全6回で勉強するプログラミング、5回目です。プログラム制御のひとつ、『繰返し制御』について学習します。(今回は長くなります)

繰返しとは

繰返しとは命令を繰り返す構造で、ループとも呼ばれます。繰返し制御は次のように3のタイプがあります。

  • 必ず1回実行するループ
  • 1度も実行しないことがあるループ
  • ある範囲内で実行するループ

単純なループ

それぞれ見ていく前に、単純なループを見てみたいと思います。

Do    ‘ループの始まり
  ‘命令の実行
Loop  ‘Doに戻る

Doからループが始まり、Loopまで命令を実行するとまたDoに戻り、またLoopまで命令を実行します。Loopを見つけると必ずDoに戻ります。

つまり、この単純なループは無限ループと呼ばれるもので、永遠に終わりません。無限ループになるとプログラムで制御することができず、コンピュータに悪い影響を与えます。そのため、無限ループにならないようにループから抜ける命令を加える必要があります。

このループから抜ける命令の種類が上記で紹介した3つのタイプになります。

無限ループを中断するには

もし無限ループになってしまった場合、次のどれかを早めに試して終了してください。
  • Escキー
  • CTRLキー+Breakキー
  • タスクマネージャーで該当アプリを終了する
通常Escキーでプログラムが中断します。

必ず1回実行するループ

必ず1回実行するループは一番最後のLoopでループを抜けるかどうかの判断をするものです。具体的にプログラムを見てみましょう。

Sub LastLoopU()
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度も実行せずに終了するループです。上記のプログラムと比べてみてください。

Sub FirstLoopU()
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文を紹介します。プログラムは次のようになります。

Sub FirstLoopW()
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以下の条件に当てはまってしまいます。そのため無限ループになってしまいます。

次のような場合も無限ループになります。

  iCount = 0
  intNum = 0

  Do While intNum >= 0
    intNum = intNum + 1
    iCount = iCount + 1
  Loop

極端な例ですが、その条件で必ず終了するかよく確かめてから実行しましょう。

ある範囲内で実行するループ

あらかじめループを繰り返す条件の範囲が分かっている場合に使うループ構造です。早速プログラムを見てみましょう。intNumが1から10の間実行するプログラムです。

Sub ForLoop()
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ステートメントと呼びますが、動作を詳しく見ていきましょう。

  1. Forに入る前のintNumは0です
  2. Forに入るとintNumに1が設定されます
  3. そして、Nextまで命令が実行され
  4. Nextで自動的にintNumに1が加算され
    • 上限の10を超えていなければ再度For以下の命令がNextまで実行される
    • 上限の10を超えるとループから抜ける

最後にもう一つ

Do~Loop文ではUntilとWhileに条件を付けてループを作りましたが、もう一つ条件の書き方があるので、紹介します。(個人的にはこの書き方の方がより分かりやすく使うことが多いです。)

ループにIF文を追加する

Do~Loop文にループを抜けるIF文を追加する方法です。

Sub LoopIf()
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の解答例を次に示します。実際に書いて実行してみましょう。

Function BMI判断(dblBMI As Double) As String
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
IF文の最後でElseを使ってます。通常ここに分岐することはないはずですが、念のために書いてます。保険のようなものです。