VB.NETでは繰り返し文が複数用意されています。
- While 条件式 ~ End While
- Do While 条件式 Loop
- Do ~ Loop While 条件式(←本記事)
- Do Until 条件式 ~ Loop
- Do ~ Loop Until 条件式
繰り返し処理の種類が色々あって「使い方がわからん!」と思う方が多いかもしれませんが、落ち着いて考えれば「なるほど」と思えます。今回は「Do ~ Loop While 条件式」の使い方を解説します。
Do Loop While 条件式
MSDNを見てみると、「Do Loop While 条件式なんてページ無いじゃん!」と思いますが、すぐには見つけられないと思います。見つけてもサッパリという初心者の方が多いかと。熟読すれば理解出来ますが、納期は待ってくれません。
ページの先頭に、「Boolean 条件が True の場合、または条件が True になるまで、ステートメントのブロックを繰り返します。」と書いてありますが、なるほどわからんというセンテンスで書かれています。しかし、そんなに難しくありません。構文は以下になります。
Do 繰り返す処理 Loop While 条件式
Do ~ Loop While の特徴としては、「処理を実行した後に条件式を判定し、条件を満たしている間、繰り返しを実行する」ということです。端的には「必ず1回は実行する。後で条件を見てループを続けるか決める」と言えます。とにかく、1回は実行します。
尚、無限ループを作りたい場合は以下の様にすれば作れますが、やらないでください。
Do 繰り返す処理 Loop While 1 = 1
万が一、間違ってデバッグで上記を実行した場合は強制終了、exeで無限ループが発生した場合はタスクマネージャーから強制終了するなどして止めて下さい(無限ループはだめよ)。
使い方例
Do ~ Loop While の実行確認をするために、サンプルのフォームを作ってみました。
開始値と終了値を入力し、実行ボタンを押すと、終了値までに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の加算」です。実行してみましょう。
開始値に1、終了値に5を入れて、実行ボタンを押下してみます。
はい、1から5の数字が連続して出てきていますね。最後に、結果テキストボックスに入っていればOKです。
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回は実行したい時に使ってみて下さい。
関連記事
参考サイト
.