社畜ゲートウェイ

京成・京急を中心に取り上げる阪急ファンのブログです。日本一遅い速報を届けます。

MENU

【スポンサーリンク】

【VB.NET】Until文による繰り返し(Do ~ Loop Until)

【スポンサーリンク】

f:id:neko_britannia:20200615213413j:plain

VB.NETでは繰り返し文が複数用意されています。

繰り返し処理の種類が色々あって「使い方がわからん!」と思う方が多いかもしれませんが、落ち着いて考えれば「なるほど」と思えます。今回は「Do Until 条件式 ~ Loop」の使い方を解説します。

Do ~ Loop Until 条件式

MSDNを見てみると、「Do 条件式 Loop Until なんてページ無いじゃん!」と思います。仕方ありません。手抜き、失礼、総合的・汎用的に見れるページをMSDNさんが用意してくれています。ただし、そのページで理解するのは、ちと難儀です。

docs.microsoft.com

ページの先頭に、「Boolean 条件が True の場合、または条件が True になるまで、ステートメントのブロックを繰り返します。」と書いてあります。はあ、そうですか。そうですよね。わかりませんよ。MSDNのページはそっと閉じて、まずは下記の構文を見て下さい。

Do 
  繰り返す処理
Loop Until 条件式

Do ~ Loop Until は、「処理を実行した後に条件式を判定し、条件を満たしていない間、繰り返しを実行する」ということです。Do ~ Loop While は条件を満たしている間に実行するので、逆です。で、Untilの位置が最後にあるので、「必ず1回は実行する。後で条件を見てループを続けるか決める」というのが特徴です。何があっても1回は実行します。

 

尚、無限ループを作りたい場合は以下の様にすれば作れますが、やらないでください。

Do
  繰り返す処理
Loop Until 1 < 0

もし間違って手が滑って、デバッグで上記を実行した場合は強制終了、exeを実行して無限ループが発生した場合はタスクマネージャーから強制終了するなどしてプログラム実行を止めて下さい。無限ループは意図していない以外で使用しないでください。

 

使い方例

Do ~ Loop Until の実行確認をするために、簡単なフォームを作ってみました。Do ~ Loop Until を確認するためだけにこの世に生まれてきたフォームです。

f:id:neko_britannia:20200703213233j:plain

開始値と終了値を入力し、実行ボタンを押すと、終了値までに1つずつ値を減らし、減った分だけ文字列を結合するという検証用のフォームです。例えば、

  • 開始値:5
  • 終了値:1

という場合、実行ボタンを押すと、結果が5432になります。サンプルソースは以下です。

Private Sub cmdDoUntilLoop_Click(sender As Object, e As EventArgs) Handles cmdDoUntilLoop.Click
    Try

        'テキストボックスに入力された値をInteger型の変数に代入
        Dim intStartValue As Integer = Integer.Parse(txtStartValue.Text)
        Dim intEndValue As Integer = Integer.Parse(txtEndValue.Text)
        Dim strResult As String = Nothing

        '開始値が終了値より小さくなるまで繰り返し
        Do
            strResult = strResult & intStartValue.ToString
            intStartValue = intStartValue - 1
        Loop Until intStartValue <= intEndValue

        MessageBox.Show(strResult, "結果", MessageBoxButtons.OK, MessageBoxIcon.Information)

        txtResult.Text = strResult

    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try
End Sub

Do ~ Loop Until の部分です。開始値が終了値と同じになるまでループを繰り返します。

        '開始値が終了値より小さくなるまで繰り返し
        Do
            strResult = strResult & intStartValue.ToString
            intStartValue = intStartValue - 1
        Loop Until intStartValue <= intEndValue

ループ内の処理は「文字列の結合」と「intStartValueの減算」です。実行してみましょう。

f:id:neko_britannia:20200708212352j:plain

開始値に5、終了値に1を入力し、実行ボタンを押下します。どうなるでしょうか?

f:id:neko_britannia:20200710213634j:plain

はい、順番に5から2の数字がメッセージボックスに表示されました。最後に結果テキストボックスに入っていればOKです。

f:id:neko_britannia:20200710213749j:plain

結果のテキストボックスに5432が入っていますね。OKです。

 

Do ~ Loop Until の動きを見てみます。

【開始前】

 開始値:5

 終了値:1

 結果出力用文字列:Nothing

【1週目】←ココは必ず通る

 strResult に 5 を入れる(代入後のstrResult の中身:5)

 intStartValue を1減らす

 intStartValue:4

 intEndValue:1

 intStartValue <= intEndValue を満たさないので次のDoの中に入る

【2週目】

 strResult に 4 を入れる(代入後のstrResult の中身:54)

 intStartValue を1減らす

 intStartValue:3

 intEndValue:1

 intStartValue <= intEndValue を満たさないので次のDoの中に入る

【3週目】

 strResult に 3 を入れる(代入後のstrResult の中身:543)

 intStartValue を1減らす

 intStartValue:2

 intEndValue:1

 intStartValue <= intEndValue を満たさないので次のDoの中に入る

【4週目】

 strResult に 2 を入れる(代入後のstrResult の中身:5432)

 intStartValue を1減らす

 intStartValue:1

 intEndValue:1

 intStartValue <= intEndValue を満たすので次のDoの中に入らない

実際にデバッグしてもらえると分かるのですが、ロジックを文章で書いてみました。Do ~ Loop Until の特徴である「必ず1回は実行する」が分かると思います。

 

オマケ:事前チェックを入れてみる

ここはオマケです。上記のサンプルで作成したフォームにはチェック処理を入れてません。数値以外の状態、未入力や文字列を入れたら落ちます。なので、チェック処理を入れると以下のソースとなります。

Private Sub cmdDoUntilLoop_Click(sender As Object, e As EventArgs) Handles cmdDoUntilLoop.Click
    Try

        '事前チェック
        If String.IsNullOrEmpty(txtStartValue.Text) = True Then
            MessageBox.Show("開始値を入力してください!", "入力チェック", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            Exit Try
        ElseIf String.IsNullOrEmpty(txtEndValue.Text) = True Then
            MessageBox.Show("終了値を入力してください!", "入力チェック", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            Exit Try
        End If

        If IsNumeric(txtStartValue.Text) = False Then
            MessageBox.Show("開始値には数字を入力してください!", "入力チェック", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            Exit Try
        ElseIf IsNumeric(txtEndValue.Text) = False Then
            MessageBox.Show("終了値には数字を入力してください!", "入力チェック", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            Exit Try
        End If

        'テキストボックスに入力された値をInteger型の変数に代入
        Dim intStartValue As Integer = Integer.Parse(txtStartValue.Text)
        Dim intEndValue As Integer = Integer.Parse(txtEndValue.Text)
        Dim strResult As String = Nothing

        '開始値が終了値より小さくなるまで繰り返し
        Do
            strResult = strResult & intStartValue.ToString
            intStartValue = intStartValue - 1
        Loop Until intStartValue <= intEndValue

        MessageBox.Show(strResult, "結果", MessageBoxButtons.OK, MessageBoxIcon.Information)

        txtResult.Text = strResult

    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try
End Sub

事前チェックに2種類のチェックを入れています。未入力チェックと入力値の数値チェックです。

 

編集後記

あまり見かけない Do ~ Loop Until ですが、たまに見かけたときに日和らないようにしましょう。「満たさない時に繰り返しを継続」という、ちょっと変な日本語ですが、落ち着いてソースを読めばわかるはずです。

関連記事

www.stellacreate.com

www.stellacreate.com

www.stellacreate.com

www.stellacreate.com

参考サイト

Do...Loop ステートメント

docs.microsoft.com