ヘッダー
Visual Basic サンプル集
 

条件指定の繰り返し(Do と While)

2022/12/4

→ C# のサンプルに切り替える → Python のサンプルに切り替える

 

無限に繰り返す

この例では、「こんにちは!」と出力してから1秒待つという処理を無限に繰り返します。

VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応 Visual Studio 2022

Do
    Debug.WriteLine("こんにちは!")
    Task.Delay(1000).Wait() '何もしないで1秒待つ。
Loop

Debug.WriteLineが表示される場所

メモ:最初の行を Do While True にしたり、最後の行をLoop While True にしても無限に繰り返します。

 

 

これでもできます。

VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応 Visual Studio 2022

While True
    Debug.WriteLine("こんにちは!")
    Task.Delay(1000).Wait() '何もしないで1秒待つ。
End While

Debug.WriteLineが表示される場所

 

 

条件付きで繰り返す。条件は1周ごとに最初に判断する。

この例は、変数 i が 5 より小さい間処理を繰り返します。

VB2015対応 VB2017対応 VB2019対応 Visual Studio 2022

Dim i As Integer
Do While i < 5
    i += 1
    Debug.WriteLine($"現在{i}周目です。")
Loop

Debug.WriteLineが表示される場所

実行すると下記の通り出力されます。

現在1周目です。
現在2周目です。
現在3周目です。
現在4周目です。
現在5周目です。

 

これでもできます。

VB2015対応 VB2017対応 VB2019対応 Visual Studio 2022

Dim i As Integer
While i < 5
    i += 1
    Debug.WriteLine($"現在{i}周目です。")
End While

Debug.WriteLineが表示される場所

実行すると下記の通り出力されます。

現在1周目です。
現在2周目です。
現在3周目です。
現在4周目です。
現在5周目です。

 

 

条件付きで繰り返す。条件は1周ごとに最後に判断する。(Do)

この例は、変数 i が 5 より小さい間処理を繰り返します。

VB2015対応 VB2017対応 VB2019対応 Visual Studio 2022

Dim i As Integer
Do
    i += 1
    Debug.WriteLine($"現在{i}周目です。")
Loop While i < 5

Debug.WriteLineが表示される場所

実行すると下記の通り出力されます。

現在1周目です。
現在2周目です。
現在3周目です。
現在4周目です。
現在5周目です。

 

 

条件がFalseになった場合に1回だけ処理を実行する

VB2015対応 VB2017対応 VB2019対応 Visual Studio 2022

Dim i As Integer

'条件が False になったときに実行する処理をあらかじめ定義します。
Dim falseOp = Function()
                  Debug.WriteLine("条件が False になったのでループはこれで終わります。")
                  Return False '必ず False を返す必要があります。
              End Function

'While条件で、False時に falseOpで定義した処理を実行するようにします。
Do While If(i < 3, True, falseOp())
    i += 1
    Debug.WriteLine($"現在{i}周目です。")
Loop

Debug.WriteLineが表示される場所

メモ:もし、最初から条件が False の場合、ループ本体は実行されず、falseOp の処理だけが実行されます。

実行すると下記の通り出力されます。

現在1周目です。
現在2周目です。
現在3周目です。
条件が False になったのでループはこれで終わります。

 

 

途中でループから抜け出す(Exit Do, Exit While)

この例では、Do ~ Loop文の条件で 変数 i が 10より小さい限り繰り返す指定になっていますが、If 文で条件判断してi が 3 のときループを抜けます。

VB2015対応 VB2017対応 VB2019対応 Visual Studio 2022

Dim i As Integer
Do While i < 10
    i += 1
    If i = 3 Then
        Exit Do
    End If

    Debug.WriteLine($"i = {i}")
Loop

Debug.WriteLine("終了")

Debug.WriteLineが表示される場所

実行すると下記の通り出力されます。

i = 1
i = 2
終了

 

While の場合は Exit Do の代わりに Exit Whileを使用します。この例は上記の Do ~ Loop の例と全く同じ結果になります。

VB2015対応 VB2017対応 VB2019対応 Visual Studio 2022

Dim i As Integer
While i < 10
    i += 1
    If i = 3 Then
        Exit While
    End If

    Debug.WriteLine($"i = {i}")
End While

Debug.WriteLine("終了")

Debug.WriteLineが表示される場所

 

この例は、摂氏(℃)と華氏(゜F)の対応表を出力します。「華氏が100度を超える」とExit Doして終了します。

VB2015対応 VB2017対応 VB2019対応 Visual Studio 2022

Dim c As Double '摂氏。日本で通常使用する温度の単位。℃。
Dim f As Double '華氏。主にアメリカで使用する温度の単位。゜F。

Do
    f = (9.0 / 5.0 * c) + 32 '摂氏(℃)から華氏(゜F)を算出。

    If f > 100 Then
        '華氏が100を超える場合、ループを終了します。
        Debug.WriteLine("Exit Doします。")
        Exit Do
    End If


    ' ,5:0.0 の意味は「5文字分の幅で小数1桁」という書式指定。
    Debug.WriteLine($"{c,5:0.0}℃ = {f,5:0.0}゜F")
    c += 10
Loop

Debug.WriteLineが表示される場所

実行すると下記の通り出力されます。(掲載の都合上スペースは省いています)

0.0℃ = 32.0゜F
10.0℃ = 50.0゜F
20.0℃ = 68.0゜F
30.0℃ = 86.0゜F
Exit Doします。

 

 

ループがすべて完了したか確認する (たとえば、Exit Doしていないかどうか)

この例では 変数 i が 9999 の場合 Exit Do します。ループの処理がすべて終わった後に Exit Do して終わったのか、Exit Do しないで終わったのかメッセージを出力します。 このまま実行すると i は 9999 にならないので Exit Do は発生しないで終了します。

VB2015対応 VB2017対応 VB2019対応 Visual Studio 2022

Dim isBreak As Boolean = False
Dim i As Integer = 0

Do While i < 10
    i += 1
    Debug.WriteLine($"i = {i}")

    If i = 9999 Then '←ここを i == 2 などに変えると、最後のメッセージが出力されなくなります。
        isBreak = True
        Exit Do
    End If
Loop

If Not isBreak Then
    Debug.WriteLine("Exit Doしないでループを終了しました。") '←これが出力されます。
End If

 

While でも同様です。この例は上記の Do ~ Loop の例と全く同じ結果になります。

VB2015対応 VB2017対応 VB2019対応 Visual Studio 2022

Dim isBreak As Boolean = False
Dim i As Integer = 0

While i < 10
    i += 1
    Debug.WriteLine($"i = {i}")

    If i = 9999 Then '←ここを i == 2 などに変えると、最後のメッセージが出力されなくなります。
        isBreak = True
        Exit While
    End If
End While

If Not isBreak Then
    Debug.WriteLine("Exit Whileしないでループを終了しました。") '←これが出力されます。
End If

 

 

その周を中断し、次の周を開始する(Continue Do, Continue While)

If 文で条件判断して2周目と3周目であれば処理を中断して次の周を開始します。

VB2015対応 VB2017対応 VB2019対応 Visual Studio 2022

Dim i As Integer = 0
Do While i < 5
    i += 1

    Debug.WriteLine($"i = {i} 開始")

    If i = 1 OrElse i = 2 Then
        Continue Do
    End If

    Debug.WriteLine($"i = {i} 終了")
Loop

Debug.WriteLineが表示される場所

実行すると下記の通り出力されます。

i = 1 開始
i = 2 開始
i = 3 開始
i = 3 終了
i = 4 開始
i = 4 終了
i = 5 開始
i = 5 終了

 

While でも同様です。この例は上記の Do ~ Loop の例と全く同じ結果になります。

VB2015対応 VB2017対応 VB2019対応 Visual Studio 2022

Dim i As Integer = 0
While i < 5
    i += 1

    Debug.WriteLine($"i = {i} 開始")

    If i = 1 OrElse i = 2 Then
        Continue While
    End If

    Debug.WriteLine($"i = {i} 終了")
End While

Debug.WriteLineが表示される場所

 

この例は、摂氏(℃)と華氏(゜F)の対応表を出力します。華氏が整数になる場合にだけ出力します。華氏が100度より下である限り繰り返します。

Dim c As Double '摂氏。日本で通常使用する温度の単位。℃。
Dim f As Double '華氏。主にアメリカで使用する温度の単位。゜F。

Do
    f = (9.0 / 5.0 * c) + 32 '摂氏(℃)から華氏(゜F)を算出。

    If f >= 100 Then
        '華氏が100以上になった場合、ループを終了します。
        Exit Do
    End If

    c += 1

    If f - Math.Truncate(f) <> 0 Then
        '小数部が 0 出ない場合、何もせず次の繰り返しにジャンプします。
        Continue Do
    End If

    ' ,5:0.0 の意味は「5文字分の幅で小数1桁」という書式指定。
    Debug.WriteLine($"{c - 1,5:0.0}℃ = {f,5:0.0}゜F")
Loop

Debug.WriteLineが表示される場所

実行すると下記の通り出力されます。(掲載の都合上スペースは省いています)

0.0℃ = 32.0゜F
5.0℃ = 41.0゜F
10.0℃ = 50.0゜F
15.0℃ = 59.0゜F
20.0℃ = 68.0゜F
25.0℃ = 77.0゜F
30.0℃ = 86.0゜F
35.0℃ = 95.0゜F

 

 

条件達成まで繰り返す。条件は1周ごとに最初に判断する。(Do Until)

この例は、変数 i が 5 になるまで処理を繰り返します。

VB2015対応 VB2017対応 VB2019対応 Visual Studio 2022

Dim i As Integer
Do Until i = 5
    i += 1
    Debug.WriteLine($"現在{i}周目です。")
Loop

Debug.WriteLineが表示される場所

実行すると下記の通り出力されます。

現在1周目です。
現在2周目です。
現在3周目です。
現在4周目です。
現在5周目です。

 

 

条件達成まで繰り返す。条件は1周ごとに最後に判断する。(Do Until)

この例は、変数 i が 5 になるまで処理を繰り返します。

VB2015対応 VB2017対応 VB2019対応 Visual Studio 2022

Dim i As Integer
Do
    i += 1
    Debug.WriteLine($"現在{i}周目です。")
Loop Until i = 5

Debug.WriteLineが表示される場所

実行すると下記の通り出力されます。

現在1周目です。
現在2周目です。
現在3周目です。
現在4周目です。
現在5周目です。

 

 

5回繰り返す

VB2015対応 VB2017対応 VB2019対応 Visual Studio 2022

Dim i As Integer
Do While i < 5
    i += 1
    Debug.WriteLine($"現在{i}周目です。")
Loop

Debug.WriteLineが表示される場所

メモ:この例のように単純に回数を指定して繰り返すには For の方が適しています。

実行すると下記の通り出力されます。

現在1周目です。
現在2周目です。
現在3周目です。
現在4周目です。
現在5周目です。

 

これでもできます。

VB2015対応 VB2017対応 VB2019対応 Visual Studio 2022

Dim i As Integer
Do
    i += 1
    Debug.WriteLine($"現在{i}周目です。")
Loop While i < 5

Debug.WriteLineが表示される場所

メモ:この例のように単純に回数を指定して繰り返すには For の方が適しています。

 

これでもできます。

VB2015対応 VB2017対応 VB2019対応 Visual Studio 2022

Dim i As Integer
While i < 5
    i += 1
    Debug.WriteLine($"現在{i}周目です。")
End While

Debug.WriteLineが表示される場所

メモ:この例のように単純に回数を指定して繰り返すには For の方が適しています。

 

 

条件判断と同時に変数に代入する

次の例は、1~6のランダムな数値を生成します。6が生成されると何もせず終了します。

Visual Studio 2022

Dim i As Integer

Dim assign = Function(ByRef v As Integer, value As Integer)
                 v = value
                 Return value
             End Function

Do While assign(i, Random.Shared.Next(1, 7)) <= 5
    Debug.WriteLine(i)
Loop

Debug.WriteLineが表示される場所

メモ:C#の代入演算子 = は代入した値を返しますが、VBの代入演算子 = は何も値を返さないので、VBでは代入と条件判断を組み合わせて記述することができません。この例では、代入を実行し、代入した値を返す関数を 変数 assign で定義することでC#の代入演算子を同じことを実現しています。しかし、この方式はサンプルを見てわかるように少しトリッキーです。ここまでして代入と条件判断を組み合わせる必要はないはずなので、このサンプルは参考程度にご活用ください。

 

条件を最後に判断しても同様ですが、この例では、最初に必ず 0 が出力されます。

Visual Studio 2022

Dim i As Integer

Dim assign = Function(ByRef v As Integer, value As Integer)
                 v = value
                 Return value
             End Function

Do
    Debug.WriteLine(i)
Loop While assign(i, Random.Shared.Next(1, 7)) <= 5

Debug.WriteLineが表示される場所

 

 

参考:プログラミング言語ごとの条件付きループの比較

方法 Visual Basic C# Python
条件の省略 Do で可能。
省略すると無限ループします。
不可 不可
ループ先頭での条件判断 Do と While で可能 while で可能 while で可能
ループ最後での条件判断 Do で可能 do で可能 不可
条件が false と評価された
場合に実行する処理の記述
不可 不可 else で可能
ループを継続する条件の記述 Do と While で可能 do と whileで可能 while で可能
ループを終了する条件の記述 Do で 可能
(Untilを使う)
不可 不可
ループの終了 Exit Do または Exit While で可能 break で可能 break で可能
次の周へのジャンプ Continue Do または
Continue While で可能
continue で可能 continue で可能
条件判断と代入を
組み合わせと記述
不可 = で可能 := で可能

この表は言語に用意されている機能を表現しています。「不可」となっている部分の多くはロジックを自作することで実現は可能です。

 


VB6対応 VB6では Do ~ Loop または While ~ Wend 使用します。

VB.NET2002対応 VB.NET2003対応 VB2005対応 VB2008対応 VB2010対応 VB2012対応 VB2013対応 この記事のサンプルでは VB2015以降でのみ使用できるものが多くなっていますが、これは、Do や While の機能が違うわけではなく、サンプル中で利用している補完文字列( $" から始まる文字列)がVB2015以上でないと使用できないという理由の場合が多いです。