【入門編】VB.NETにおけるDo…LoopとWhile…End Whileの使い分け:無限ループを回避し可読性を高めるループ制御の鉄則 – Visual Basic (VB / VB.NET)解析バイブル

スポンサーリンク

こんにちは!日々の開発や業務自動化、お疲れ様です。
VBAでのマクロ記録から一歩踏み出し、「本格的なVB.NETのコードを書きたい!」あるいは「もっと安全で読みやすいループ処理をマスターしたい!」という方に向けて、今日はすごく大切なテーマをお届けしますね。

プログラミングをしていると、同じ処理を何度も繰り返す「ループ(反復処理)」は避けて通れません。
その中でも、代表的な `Do…Loop``While…End While` について、「結局、どっちを使えばいいの?」「無限ループが怖くて夜しか眠れない……」という疑問をスッキリ解消していきましょう。

ここをクリアすれば、あなたの書くVB.NETコードの安全性と可読性は劇的に跳ね上がります。一緒にバッチリ押さえていきましょう!

1. なぜループの選択で悩むのか?(ループの基本哲学)

VB.NETには、条件を満たしている間だけ処理を繰り返す構文がいくつか用意されています。
代表選手はこの2つです。

1. `Do…Loop` 系 (柔軟性の鬼。前置・後置の両方が選べる)
2. `While…End While` (直感的で分かりやすい前置専用)

一見すると「どっちを使っても同じじゃない?」と思いがちですが、ここに「条件をいつ判定するか(前置か、後置か)」というプログラミングの本質が隠されています。

これを誤ると、

  • 「ファイルが空っぽなのに、無理やり1回読み込もうとしてエラーになる」
  • 「うっかり無限ループに入ってしまい、タスクマネージャーから強制終了するハメになる」

といった現場の「あるあるトラブル」を踏むことになります。そうならないための判断基準を、優しく紐解いていましょう。

2. 条件判定のタイミングがすべてを決める(前置と後置)

ループを理解する上で最も重要なキーワードが 「前置(ぜんち)」「後置(こうち)」 です。図解のイメージで頭に焼き付けてください。

① 前置判定(ループに入る「前」に調べる)

  • イメージ: テーマパークのアトラクションに並ぶ前、「身長制限クリアしてる?」とスタッフに測られる。クリアしていれば乗れるが、ダメなら1回も乗れずに終わり。
  • メリット: 条件を満たさなければ、中の処理は絶対に1回も実行されないため安全。
  • 主な構文: `While…End While` や `Do While…Loop`(上部判定)

② 後置判定(ループを「出るとき」に調べる)

  • イメージ: まずアトラクションに乗って楽しんだあと、出口で「もう一回乗る?」と聞かれて「はい」なら戻る。
  • メリット: 中の処理を最低1回は必ず実行したい場合に最適。
  • 主な構文: `Do…Loop While`(下部判定)

3. 実践!シーン別・最適なループ構文の選び方

それでは、実際の業務でよくあるシチュエーションを例に、どちらを使うべきか見ていきましょう。

シーンA:ファイルのストリーム読み込み(前置の鉄則)

テキストファイルから1行ずつデータを読み込んで処理するバッチ処理を想像してください。もしファイルが空(0バイト)だったら、読み込み処理は1回も走ってほしくありませんよね。

ここで安全な「前置判定」の `While…End While` を使ってみましょう。

.net
Imports System.IO

Module FileReadSample
Sub Main()
Dim filePath As String = “C:\Data\sample.txt”

‘ ファイルが存在するか確認してからリーダーを開く
If File.Exists(filePath) Then
‘ Usingブロックでメモリリークを防ぐ(プロの技!)
Using reader As New StreamReader(filePath)

‘ 【前置判定】読むデータがあるか?をループの「前」でチェック
Dim line As String = reader.ReadLine()

While line IsNot Nothing
‘ 実際の業務処理(画面表示やDB登録など)
Console.WriteLine(“読み込みデータ: ” & line)

‘ 次の行を読み込む
line = reader.ReadLine()
End While

End Using
Else
Console.WriteLine(“ファイルが見つかりません。”)
End If

Console.WriteLine(“処理が正常に完了しました。”)
End Sub
End Module

ここがポイント!
`While…End While` は、「何を繰り返しているのか」がコードの先頭と末尾ですぐに分かるため、初学者にとっても非常に可読性が高いのが特徴です。

シーンB:ユーザーからの正しい入力を促す(後置の出番)

「正しいパスワードが入力されるまで、何回でもポップアップで聞き返す」という処理を考えてみましょう。この場合、「まずは最低1回は入力を促す(中の処理をする)」必要がありますよね。

こういう時は、後置判定の `Do…Loop Until` がピタリとハマります。

.net
Module PasswordInputSample
Sub Main()
Dim inputPassword As String = String.Empty
Dim correctPassword As String = “Secret123”

Do
‘ 【最低1回は実行される】パスワードの入力を求める
Console.Write(“パスワードを入力してください: “)
inputPassword = Console.ReadLine()

If inputPassword <> correctPassword Then
Console.WriteLine(“パスワードが違います。もう一度入力してください。”)
End If

Loop Until inputPassword = correctPassword ‘ 【後置判定】正しいパスワードだったらループを抜ける

Console.WriteLine(“ログイン成功!ようこそシステムへ。”)
End Sub
End Module

4. 無線ループの恐怖を断つ!「Exit Do」の安全装置

「条件式を間違えて、プログラムがフリーズした……」
これは誰もが通る道です。特に `Do Until True` や、複雑なフラグ制御を行うバッチ処理では、無限ループのリスクがつきまといます。

そんなときに心強い味方になってくれるのが、`Exit Do` です。
これは、条件式に関わらず、「ここで強制的にループから脱出する!」という強力な安全装置です。

業務バッチで使える「無限ループ+安全な脱出」のイディオム

.net
Module BatchProcessSample
Sub Main()
Dim retryCount As Integer = 0
Const MaxRetry As Integer = 3

‘ あえて条件を書かずに「無限ループ」の形を作る
Do
Console.WriteLine(“外部APIへの接続を試行中…”)

‘ 擬似的な接続成功判定(今回は成功したと仮定)
Dim isConnected As Boolean = True

If isConnected Then
Console.WriteLine(“接続に成功しました!”)
Exit Do ‘ 目的を達成したので、安全にループを脱出!
End If

retryCount += 1
If retryCount >= MaxRetry Then
Console.WriteLine(“リトライ回数が上限を超えました。異常終了します。”)
Exit Do ‘ 限界を超えた場合も、無限ループを防ぐために脱出!
End If

Loop

Console.WriteLine(“バッチ処理を終了します。”)
End Sub
End Module

知的な先輩エンジニアからのアドバイス:
無限ループ(`Do…Loop` のみ)を使うときは、「必ずどこかで `Exit Do` が通る経路になっているか」をコードレビューの目で確認する癖をつけましょう。これだけでバグの発生率がグッと下がります。

5. まとめ:今日から使えるループ選択の判断基準

お疲れ様でした!最後に、今回学んだ内容をギュッとまとめます。

| 構文 | 判定のタイミング | 最適なシチュエーション |
| :— | :— | :— |
| `While…End While` | 前置(入る前) | ファイル読み込み、データ件数が0かもしれない安全重視の処理(迷ったらまずこれ!) |
| `Do…Loop While / Until` | 後置(出るとき) | ユーザーからの入力受付など、「最低1回は必ず実行したい」処理 |
| `Do…Loop` + `Exit Do` | 任意の位置 | 複雑な条件脱出や、リトライ制御を行う堅牢なバッチ処理 |

「ここをクリアすれば、Visual Basic (VB / VB.NET)の基本はバッチリですよ」と言えるほど、ループ制御はプログラムの土台となる部分です。

ぜひ明日の開発やマクロからの脱却に向けたコード作成で、意識して使い分けてみてくださいね。あなたのコードが、より美しく、安全で、読みやすいものになることを応援しています!

タイトルとURLをコピーしました