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

今回の目標

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

説明

始めに

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

Do While~Loop 構文(前判定)

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

構文です。

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

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

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

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

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

  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からB4に値が格納されます。「Sample_DoLoopWhile1」と似ていますが、B5までセルに値を入れるのではなく、B4までという点に注意してください。
3度目のループで、Cells(4, 2)(=セルB4)に値を入れた後、iの値が5になってしまい、④の判定でループを終了してしまうからです。

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

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

  2. ②は①で作成した変数に値を設定します。

  3. ③では、前判定と異なり何もしません。

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

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

  6. ⑥では、iの値が5以下か調べます。上記サンプルは「i<5」ですので、iが5未満の場合は③へ戻ります。


前判定と後判定

反復処理には「前判定」と「後判定」というものがあります。「前判定」は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
終了条件を文字列や空のデータに指定する

サンプルは次のファイルをダウンロードして実行してください。
ファイル: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以上ならD4列に「合格」、それ以外を「不合格」と入力しなさい。

    【解答例】

    前判定バージョンです。

    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
    

関連リンク

ページの先頭へ