VB.NETでは繰り返し文が複数用意されています。
- While 条件式 ~ End While
- Do While 条件式 Loop
- Do ~ Loop While 条件式
- Do Until 条件式 ~ Loop
- Do ~ Loop Until 条件式(←本記事)
繰り返し処理の種類が色々あって「使い方がわからん!」と思う方が多いかもしれませんが、落ち着いて考えれば「なるほど」と思えます。今回は「Do Until 条件式 ~ Loop」の使い方を解説します。
Do ~ Loop Until 条件式
MSDNを見てみると、「Do 条件式 Loop Until なんてページ無いじゃん!」と思います。仕方ありません。手抜き、失礼、総合的・汎用的に見れるページをMSDNさんが用意してくれています。ただし、そのページで理解するのは、ちと難儀です。
ページの先頭に、「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 を確認するためだけにこの世に生まれてきたフォームです。
開始値と終了値を入力し、実行ボタンを押すと、終了値までに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の減算」です。実行してみましょう。
開始値に5、終了値に1を入力し、実行ボタンを押下します。どうなるでしょうか?
はい、順番に5から2の数字がメッセージボックスに表示されました。最後に結果テキストボックスに入っていればOKです。
結果のテキストボックスに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 ですが、たまに見かけたときに日和らないようにしましょう。「満たさない時に繰り返しを継続」という、ちょっと変な日本語ですが、落ち着いてソースを読めばわかるはずです。
関連記事
参考サイト
.