【反復処理】Do~Loop(While)の使い方

今回の目標

  • Do~LoopとWhileを使用して反復処理をできるようになる

説明

始めに

他言語でWhile文を習得されている方は、下記リンクをお読みください。
ページ内リンク:他言語でWhile文を学んだ方へ
ご存じない方はこのまま下の説明をお読みください。

Do While...Loop 文(前判定)

最初に注意点があります。Do...Loop Whileは無限ループが発生しやすいため、実行前には必ず保存をしてください保存できずに強制終了することになり、入力したマクロを打ち直す必要があります。 もし、無限ループが発生してしまったら、キーボード左上の[Esc]キーを押すと処理を強制終了させることができます。 なお、終了させられないときがあるので、マクロの実行前に保存を行ってください。
For文と同様に反復(ループ)処理を行います。 しかし、Forの「Step 増加値」にあたる反復処理を続けるかの基準となる変数への加算は自分で行わなければならないためです。

基本構文です。

Do While 継続条件
    繰り返したい処理
Loop

『継続条件』とは、If文で学んだよう比較演算子で条件が真(True)になるときに反復(ループ)処理を継続します。 もし、偽(False)になるときはLoopの次の行へ処理が移動します。

使用サンプルです。下記サンプルでは、A2からA4までセルに100を格納します。

'A2~A4に100を格納するプログラム
Sub Sample_DoLoopWhile1()
    Dim i As Long          ' ・・・ ①
    i = 2                  ' ・・・ ②
    Do While i < 5         ' ・・・ ③
        Cells(i, 1) = 100  ' ・・・ ④
        i = i + 1          ' ・・・ ⑤
    Loop                   ' ・・・ ⑥
End Sub
【実行結果】

セルA2、セルA3、セルA4、それぞれを 100 にします。

上記サンプルの解説です。

  1. ①で変数を作成します。For文と異なり、変数作成が不要の場合があります。

  2. ②は①で作成した変数にループの開始行を設定します。

  3. ③で継続条件のキーとなる変数の値で反復処理を続けるか判断をしています。
     上記サンプルは「i<5」ですので、iが5未満の場合はループし続けます。

  4. ④で反復処理を行う命令をします。

  5. ⑤で継続条件のキーとなる変数に加算をしています。
     Forの「Step 増加値」にあたる部分です。

  6. ⑥で、③の「Do While...」にプログラムが戻ります(本説明の[3]に戻り値を調べます)。

Do~Loop While 文(後判定)

この文法では、ループの末尾でループを継続するかを判定します。

Do
    繰り返したい処理
Loop While 継続条件

Do While...Loop 文(前判定)との違いですが、Doの時点では継続するか判定しないため、必ず1度は「繰り返したい処理」を実行します。詳細は前判定と後判定で説明します。

下のプログラム「Sample_DoLoopWhile2」をご覧ください

'B2~B4に100を格納するプログラム
Sub Sample_DoLoopWhile2()
    Dim i As Long
    i = 2
    Do                     ' ・・・ ①
        Cells(i, 2) = 100  ' ・・・ ②
        i = i + 1          ' ・・・ ③
    Loop While i < 5       ' ・・・ ④
End Sub
【実行結果】

セルB2、セルB3、セルB4、それぞれを 100 にします。

プログラムの解説をします。

  1. ①で繰り返し処理の開始地点を定めます。

  2. ②はセルに値を設定します。

  3. ③で、繰り返し処理の判定の変数を加算します。

  4. ④は、変数「i」が『5』未満の時、繰り返し開始地点まで戻ります。『5』以上の時、1つ下のステップに移動します。

前判定と後判定

反復処理には「前判定」と「後判定」というものがあります。「前判定」はFor文やDo While...Loop文が当てはまり、ループの開始時(Forは変数の初期化後)に反復処理を終了させるか値を調べます
下のサンプル『Sample_DoLoopWhile3』をご覧ください。

'メッセージボックスを何度か表示させるマクロ
Sub Sample_DoLoopWhile3()
    Dim i As Long
    i = 5                  ' ・・・ ①
    Do While i < 5         ' ・・・ ②
        MsgBox "Hello!!"
        i = i + 1
    Loop                   ' ・・・ ③
End Sub
【実行結果】

(何も表示されません)

これを実行すると何も表示されません
①で変数に「5」を格納しています。②で5未満か真偽を調べて、偽となります。つまり、③の次の行まで処理が移動し、そのまま処理が終了してしまいます。

これに対して「後判定」は1ループの最後に反復させるかの判定を行います
実行結果で一番大きな違いは必ず一度はループ処理を行うことです。
「前判定」であるFor文やDo While...Loop文はループ処理開始時に継続条件が偽なら繰り返したい処理を一度も実行せずループを終了します。しかし、「後判定」である Do ~Loop While文では、ループ終了判定が最後にあるため必ず1度は実行します。

'メッセージボックスを1度表示させるマクロ!
Sub Sample_DoLoopWhile4()
    Dim i As Long
    i = 5                  ' ・・・ ①
    Do                     ' ・・・ ②
        MsgBox "Hello!!"
        i = i + 1
    Loop While i < 5       ' ・・・ ③
End Sub
【実行結果】

Hello!!

文字列や空のデータを終了条件とする

サンプルは次のファイルをダウンロードして実行してください。
ファイル:DoLoopSalesGlaph.xlsx

'セルB2,B3...と調べ、データが見つからなくなるまで反復する
Sub Sample_DoLoopWhile5()
    Dim i As Long
    i = 3
    Do While Cells(i, 2) <> ""    ' ・・・ ①
        Cells(i, 1) = 100  ' ・・・ ②
        i = i + 1          ' ・・・ ③
    Loop
End Sub

※VBA習得者向けへの補足
 ””(空の文字列)とvbNullStringは別物ですが、説明用に同一としています。

For文とDo...Loop文どちらを使う?

For文とDo...Loop文でどちらを使うべきか悩まれるかもしれません。
終了条件が数値ならFor文を使用し、特定の文字列を終了条件にしたければDo...Loop文を使用してください。
迷ったらFor文を使用すべきです。For文を勧める理由として一番大きいのはデバッグをしやすいという点です。また、無限ループをさせにくい点も優秀だからです。

Do...Loop文では「セルに何も入力が無かったら終了」ということもできます。

これにて本ページの解説は終了で、下の説明はプログラミング言語を習得者向けです。
下記リンクから確認テストを行ってください。
ページ内リンク:確認テスト

他言語でWhile文を学んだ方へ

Microsoftは、While文ではなく 「Do...Loop ステートメント」と呼称しており、これが正式名称のようです。
文法も変更されているため併せて覚えましょう。

Excel VBA の Do...Loop文(While)

基本文です。
前判定のDo...Loop文です。

Do While 継続条件
    繰り返したい処理
Loop

後判定のDo~While文です。

Do
    繰り返したい処理
Loop While 継続条件

ポイントです。

  • 前判定と後判定で、DoとLoopの位置は変わらず、While 継続条件の位置が変わる

使用サンプルです。
サンプルは次のファイルをダウンロードして実行してください。
ファイル:DoLoopSalesGlaph.xlsx
C2以降で空白のセルが出現するまで、同じ行のD列の値を基準に成績を入力します。

Sub P_DoLoopWhile_Sample1()
    Dim i As Long
    i = 3
    Do While Cells(i, 2) <> ""
        If (Cells(i, 4) < 20) Then
            Cells(i, 5) = "不可"
        ElseIf (Cells(i, 4) < 30) Then
            Cells(i, 5) = "可"
        Else
            Cells(i, 5) = "良"
        End If
        i = i + 1
    Loop
End Sub

F8でステップインできるので、Excelを確認しつつ試すと良いでしょう。

その他豆知識

一部サイトでは「Do~While」と呼称されることがありますが「Do~Until」と比較していると思われます。余談ですが「Do~Loop While」文は、継続条件を記載するのに対し「Do...Until Loop」文では終了条件を指定します(Do...Until Loopの詳細は次章にて説明)。

「Do While...Loop」と「Do Until...Loop」文をまとめて『Do...Loop ステートメント』と呼称しているようです。これらを下図にまとめました(便宜上「While型」「Until型」と呼んでいます)。
DoLoop文の概要

確認テスト

Do~Loop(While)文を使い、次の問いに答えなさい。

  1. 前判定を用いて、セルA1~A3に「Hello」と入力しなさい。

    【解答例】

    '前判定を用いて、セルA1~A3に「Hello」と入力
    Sub TestDoWhileAns1()
        Dim i As Long
        i = 1
        Do While i <= 3
            Cells(i, 1) = "Hello"
            i = i + 1
        Loop
    End Sub
    
  2. 後判定を用いて、セルB1~B3に「Hello World」と入力しなさい。

    【解答例】

    '後判定を用いて、セルB1~B3に「Hello World」と入力
    Sub TestDoWhileAns2()
        Dim i As Long
        i = 1
        Do
            Cells(i, 2) = "Hello World"
            i = i + 1
        Loop While i <= 3
    End Sub
    
  3. 前判定を用いて、セルC3~D5に「New World」と入力しなさい。

    【解答例】

    '前判定を用いて、セルC3~D5に「New World」と入力
    Sub TestDoWhileAns3()
        Dim i As Long
        Dim j As Long
        i = 3
        Do While i <= 5
            j = 3
            Do While j <= 4
                Cells(i, j) = "New World"
                j = j + 1
            Loop
            i = i + 1
        Loop
    End Sub
    
  4. 後判定を用いて、セルA4~B5に「hoge」と入力しなさい。

    【解答例】

    '後判定を用いて、セルA4~B5に「hoge」と入力
    Sub TestDoWhileAns4()
        Dim i As Long
        Dim j As Long
        i = 4
        Do
            j = 1
            Do
                Cells(i, j) = "hoge"
                j = j + 1
            Loop While j <= 2
            i = i + 1
        Loop While i <= 5
    End Sub
    
  5. 次のダウンロードしたファイルの表を使用します。
     ☆ファイル:DoLoopQuestion.xlsx
    表のB4以降、B列が空白になるまでループを続け、C列の値が70以上ならD列に「合格」、それ以外を「不合格」と入力しなさい。

    【解答例】

    前判定バージョンです。

    Sub TestDoWhileAns5_前判定ver()
        Dim i As Long
        Dim val As Variant
        i = 3
        val = Cells(i, 4)
        Do While Cells(i, 2) <> ""
            If 70 <= val Then
                Cells(i, 5) = "合格"
            Else
                Cells(i, 5) = "不合格"
            End If
            i = i + 1
            val = Cells(i, 4)
        Loop
    End Sub
    

    後判定バージョンです。

    Sub TestDoWhileAns5_後判定ver()
        Dim i As Long
        Dim val As Variant
        i = 3
        val = Cells(i, 4)
        Do
            If 70 <= val Then
                Cells(i, 5) = "合格"
            Else
                Cells(i, 5) = "不合格"
            End If
            i = i + 1
            val = Cells(i, 4)
        Loop While Cells(i, 2) <> ""
    End Sub
    

関連リンク

ページの先頭へ