【VBAスタンダード対策】Do ... Loop Until(後判定)の罠とループ構造を攻略!
Do Until を記述する場所には、実は2つのパターンがあります。頭につける「前判定」と、お尻につける「後判定」です。条件式が全く同じでも、記述する場所によってループの実行回数が変わるという、VBAの構造的な仕組みを解き明かします。
1. 問題:後判定(Loop Until)における実行結果
【 問題 】 下記のコードを実行して PostTest プロシージャを呼び出した際、メッセージボックスに表示される数値はいくつでしょうか?
Sub PostTest()
Dim n As Integer
n = 10
Do
n = n + 5
Loop Until n >= 10
MsgBox n
End Sub
Dim n As Integer
n = 10
Do
n = n + 5
Loop Until n >= 10
MsgBox n
End Sub
① 10(条件が最初から満たされているため、1回も実行されない)
② 15(条件を満たしているが、必ず1回は実行される)
③ 20
④ 判定が無限に繰り返されてフリーズ(無限ループ)する
2. 正解:後判定ループの処理フローに関する正解
正解: ② 15
3. 解説:「まず動く」後判定と「まず確認する」前判定
Until(~になるまで)の位置が Do の後ろか、Loop の後ろかによって、プログラムの初期動作が変わる構造になっています。
[ 前判定と後判定の構造的な違い ]
■ 前判定(Do Until ── Loop)
ループに入る「前」に条件をチェックします。もし最初から
■ 後判定(Do ── Loop Until) ※今回の問題
条件チェックが最後(Loopの後ろ)にあります。そのため、たとえ最初から条件(n >= 10)を満たしていても、上から流れてきた処理は必ず最初に1回実行されてしまいます。
・スタート時:n = 10
・ループ突入:条件を見ずに、まず
・お尻で判定:
★ 結果として、必ず1回は処理が通るため、最終値は 15 になります。
■ 前判定(Do Until ── Loop)
ループに入る「前」に条件をチェックします。もし最初から
n = 10 で、条件が n >= 10 だった場合、「あ、もうゴールしてるから入らない」となり、実行回数は 0回 になります。■ 後判定(Do ── Loop Until) ※今回の問題
条件チェックが最後(Loopの後ろ)にあります。そのため、たとえ最初から条件(n >= 10)を満たしていても、上から流れてきた処理は必ず最初に1回実行されてしまいます。
・スタート時:n = 10
・ループ突入:条件を見ずに、まず
n = 10 + 5 = 15 を実行!・お尻で判定:
15 >= 10 は成立(True!) ⇒ 終了して脱出!★ 結果として、必ず1回は処理が通るため、最終値は 15 になります。
ここが試験に出る!: スタンダード試験では、この「後判定(Do ... Loop Until)」を使ったコードを見せて、条件が最初から満たされているデータの場合に『1回実行されるか、0回か』を迷わせる問題が頻出します。「後判定は最低1回は絶対に通る構造」だと覚えておきましょう。
4. まとめ
「前判定は石橋を叩いて渡る(0回の可能性あり)、後判定は行動してから考える(最低1回は実行)」。この構造の使い分けができるようになると、実務でも『まず1行目のデータを処理してから、次の行があるか判定する』といった柔軟なスクリプトが組めるようになります。
PR