【VBAスタンダード対策】If 文における And / Or 演算子の論理優先順位を攻略!
If 文で複数の条件を組み合わせる際に使用する And(かつ)と Or(または)。1つの If 条件式の中に両方が混在している場合、どちらが優先して評価されるかという「論理演算子の優先順位構造」を正しく把握しておく必要があります。
1. 問題:And と Or が混在する条件式の評価
【 問題 】 下記のコードを実行して CheckLogic プロシージャを呼び出した際、メッセージボックス(MsgBox)に表示される文字列として正しいものはどれでしょうか?
Sub CheckLogic()
Dim age As Integer
Dim member As Boolean
Dim coupon As Boolean
age = 25
member = False
coupon = True
If age >= 60 Or member = True And coupon = True Then
MsgBox "割引適用"
Else
MsgBox "通常料金"
End If
End Sub
Dim age As Integer
Dim member As Boolean
Dim coupon As Boolean
age = 25
member = False
coupon = True
If age >= 60 Or member = True And coupon = True Then
MsgBox "割引適用"
Else
MsgBox "通常料金"
End If
End Sub
① 割引適用
② 通常料金
③ 条件式の構文エラー(コンパイルエラー)が発生する
④ 実行時エラーが発生する
2. 正解:And と Or の評価順序に関する正解
正解: ② 通常料金
3. 解説:「And 優先」で評価される論理演算の構造
VBAの仕様上、かっこ ( ) を使っていない場合、「And は Or よりも優先して先に計算される」という明確な優先順位ルールが存在します。
[ 条件式の評価構造ステップ ]
元の条件式:age >= 60 Or member = True And coupon = True
1. 優先度の高い
・member は False
・coupon は True
⇒ False And True の結果は False となります。
2. 残った
・age >= 60 (25 >= 60) は False
⇒ False Or False の結果は最終的に False となります。
★ したがって、
元の条件式:age >= 60 Or member = True And coupon = True
1. 優先度の高い
And を先に結合・評価:(member = True And coupon = True) の部分が先に判定されます。・member は False
・coupon は True
⇒ False And True の結果は False となります。
2. 残った
Or を評価:age >= 60 Or [ステップ1の結果(False)] を判定します。・age >= 60 (25 >= 60) は False
⇒ False Or False の結果は最終的に False となります。
★ したがって、
If ブロックは実行されず、Else 側の "通常料金" が出力されます。ここが試験に出る!: スタンダード試験では、「左から順番に Or から計算してしまう」という勘違いを誘う問題が頻出します。もし「(60歳以上または会員)であり、かつクーポンを持っている」という条件にしたい場合は、(age >= 60 Or member = True) And coupon = True のようにカッコで囲んで意図的に優先順位を変える必要があります。
4. まとめ
「And は掛け算(優先度高)、Or は足し算(優先度低)と同じ感覚で評価される」。この演算子の優先順位構造を頭に入れておけば、実務で複雑な顧客条件分岐やエラー判定ロジックを組む際にも、予期せぬ判定ミスを回避できます。
PR