社畜ゲートウェイ

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

MENU

【スポンサーリンク】

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

【スポンサーリンク】

f:id:neko_britannia:20200615213413j:plain

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

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

Do Loop While 条件式

MSDNを見てみると、「Do Loop While 条件式なんてページ無いじゃん!」と思いますが、すぐには見つけられないと思います。見つけてもサッパリという初心者の方が多いかと。熟読すれば理解出来ますが、納期は待ってくれません。

docs.microsoft.com

ページの先頭に、「Boolean 条件が True の場合、または条件が True になるまで、ステートメントのブロックを繰り返します。」と書いてありますが、なるほどわからんというセンテンスで書かれています。しかし、そんなに難しくありません。構文は以下になります。

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

Do ~ Loop While の特徴としては、「処理を実行した後に条件式を判定し、条件を満たしている間、繰り返しを実行する」ということです。端的には「必ず1回は実行する。後で条件を見てループを続けるか決める」と言えます。とにかく、1回は実行します。

 

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

Do
  繰り返す処理
Loop While 1 = 1

万が一、間違ってデバッグで上記を実行した場合は強制終了、exeで無限ループが発生した場合はタスクマネージャーから強制終了するなどして止めて下さい(無限ループはだめよ)。

 

使い方例

Do ~ Loop While の実行確認をするために、サンプルのフォームを作ってみました。

f:id:neko_britannia:20200703213233j:plain

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

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

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

Private Sub cmdDoWhileLoop_Click(sender As Object, e As EventArgs) Handles cmdDoWhileLoop.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 While 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 While の部分です。開始値が終了値と同じになるまでループを繰り返します。

        '開始値が終了値と同じ値になるまで繰り返し
        Do
            strResult = strResult & intStartValue.ToString
            intStartValue = intStartValue + 1
        Loop While intStartValue <= intEndValue

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

f:id:neko_britannia:20200703214147j:plain

開始値に1、終了値に5を入れて、実行ボタンを押下してみます。

f:id:neko_britannia:20200704201601j:plain

はい、1から5の数字が連続して出てきていますね。最後に、結果テキストボックスに入っていればOKです。

f:id:neko_britannia:20200704201701j:plain

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

【開始前】

 開始値:1

 終了値:5

 結果出力用文字列:Nothing

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

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

 intStartValue を1増やす

 intStartValue:2

 intEndValue:5

 intStartValue <= intEndValue なので次のDoの中に入る

【2週目】

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

 intStartValue を1増やす

 intStartValue:3

 intEndValue:5

 intStartValue <= intEndValue なので次のDoの中に入る

【3週目】

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

 intStartValue を1増やす

 intStartValue:4

 intEndValue:5

 intStartValue <= intEndValue なので次のDoの中に入る

【4週目】

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

 intStartValue を1増やす

 intStartValue:5

 intEndValue:5

 intStartValue <= intEndValue なので次のDoの中に入る

【5週目】

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

 intStartValue を1増やす

 intStartValue:6

 intEndValue:5

 intStartValue > intEndValue なので次のDoの中に入らない

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

 

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

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

Private Sub cmdDoWhileLoop_Click(sender As Object, e As EventArgs) Handles cmdDoWhileLoop.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 While 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 While ~ Loop」は処理に入る前にチェックしていますが、「Do ~ Loop While」は必ず1回は実行してから、次の処理を行うかの判定をしています。なので、繰り返したいけど、必ず1回は実行したい時に使ってみて下さい。

関連記事

同じくループ記事で、While ~ End Whileの記事

www.stellacreate.com

Do While ~ Loopの記事

www.stellacreate.com

未入力チェックで使用した「IsNullOrEmptyメソッド」を取り上げた記事です。

www.stellacreate.com

参考サイト

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

docs.microsoft.com