【VBAスタンダード対策】If ... Then ... Else の入れ子(ネスト)と条件評価順序を攻略!
VBAの条件分岐の基本である If ... Then ... Else ... End If。複数の条件を評価する ElseIf や分岐の入れ子(ネスト)構造において、プログラムがどのような順番で条件を評価し、どの処理を通過するかを正しく読み解きましょう。
1. 問題:If ... Then ... ElseIf の評価順序と実行結果
【 問題 】 下記のコードを実行して EvaluateScore プロシージャを呼び出した際、メッセージボックス(MsgBox)に表示される文字列として正しいものはどれでしょうか?
Sub EvaluateScore()
Dim score As Integer
score = 85
If score >= 70 Then
MsgBox "合格"
ElseIf score >= 80 Then
MsgBox "優秀"
Else
MsgBox "不合格"
End If
End Sub
Dim score As Integer
score = 85
If score >= 70 Then
MsgBox "合格"
ElseIf score >= 80 Then
MsgBox "優秀"
Else
MsgBox "不合格"
End If
End Sub
① 合格
② 優秀
③ 合格 と 優秀 の両方が表示される
④ 構文エラー(コンパイルエラー)が発生する
2. 正解:If文の分岐評価に関する正解
正解: ① 合格
3. 解説:条件が「上から順番に評価される」構造の罠
If ... ElseIf 構造では、条件式が上から順番に判定され、最初に条件を満たした(Trueになった)ブロックの処理だけが実行されるという厳格なルールがあります。
[ If 分岐の実行フロー構造 ]
変数:score = 85
1. 1つ目の条件判定(If score >= 70):
85 >= 70 は 成立(True!)
⇒
2. 2つ目以降の判定(ElseIf score >= 80):
すでに最初の条件で True になったため、2つ目以降の条件式は判定すらされずにスキップされ、
★
変数:score = 85
1. 1つ目の条件判定(If score >= 70):
85 >= 70 は 成立(True!)
⇒
MsgBox "合格" が実行される!2. 2つ目以降の判定(ElseIf score >= 80):
すでに最初の条件で True になったため、2つ目以降の条件式は判定すらされずにスキップされ、
End If の直後へ抜けます。★
score = 85 は「80以上(優秀)」の条件も満たしていますが、先に「70以上(合格)」にヒットしてしまうため、「優秀」が表示されることはありません。ここが試験に出る!: スタンダード試験では、このように「条件の記述順序ミス(評価の逆転)」を突く問題が非常によく出題されます。「優秀(80以上)」を正しく判定させたい場合は、If score >= 80 Then を一番上に書かなければならないという判定ロジックの構造を押さえておきましょう。
4. まとめ
「If文は最初につかまった条件で終了し、以降のElseIfは無視される」。この評価順序の仕組みを理解しておけば、実務で多段階の成績判定や金額の割引率計算を実装する際にも、条件の並べ順ミスによるロジックバグを完璧に防げるようになります。
PR