If文で「AかつBの場合」「AまたはBの場合」といった複数条件を判定したいとき、VBAではAnd・Or・Not・Xorといった論理演算子を使います。使い方自体はシンプルですが、VBAには他言語のような「ショートサーキット評価」がないため、知らずに使うとエラーの原因になることもあります。
この記事では、各論理演算子の基本的な使い方と、実務でよく使う組み合わせパターン、そして注意すべき落とし穴について解説します。
4つの論理演算子の基本
| 演算子 | 意味 | 結果がTrueになる条件 |
|---|---|---|
| And | かつ(両方) | 両方の条件がTrueのとき |
| Or | または(いずれか) | どちらか一方でもTrueのとき |
| Not | 否定 | 条件がFalseのとき |
| Xor | 排他的論理和 | 片方だけがTrueのとき(両方True・両方Falseは共にFalse) |
And:複数条件をすべて満たす場合
Andは、すべての条件がTrueのときだけ全体がTrueになります。
Sub CheckAndCondition()
Dim score As Integer
Dim attendance As Integer
score = 80
attendance = 90
If score >= 60 And attendance >= 80 Then
MsgBox "合格です。"
Else
MsgBox "不合格です。"
End If
End Sub
「点数が60点以上」かつ「出席率が80%以上」の両方を満たす場合のみ「合格」と判定されます。
Or:いずれかの条件を満たす場合
Orは、どちらか一方でもTrueであれば全体がTrueになります。
Sub CheckOrCondition()
Dim department As String
department = "営業部"
If department = "営業部" Or department = "販売部" Then
MsgBox "対象部署です。"
Else
MsgBox "対象外の部署です。"
End If
End Sub
「営業部」または「販売部」のどちらかに一致すれば「対象部署です」と表示されます。
Not:条件を反転させる
Notは、条件の真偽を反転させます。
Sub CheckNotCondition()
Dim targetCell As Range
Set targetCell = Range("A1")
If Not IsEmpty(targetCell) Then
MsgBox "A1セルには値が入力されています。"
Else
MsgBox "A1セルは空です。"
End If
End Sub
IsEmpty関数は「空ならTrue」を返すため、「空でない(=値が入力されている)」を判定したいときはNotを組み合わせます。
Xor:どちらか一方だけがTrueの場合
Xorはあまり使う機会は多くありませんが、「どちらか一方だけを満たす」判定に便利です。
Sub CheckXorCondition()
Dim hasDiscount As Boolean
Dim hasCoupon As Boolean
hasDiscount = True
hasCoupon = False
If hasDiscount Xor hasCoupon Then
MsgBox "割引が適用されます。"
Else
MsgBox "割引は適用されないか、重複適用のため確認が必要です。"
End If
End Sub
割引とクーポンが同時に適用される場合(両方True)や、どちらも使われない場合(両方False)を除外し、「どちらか一方だけ」のケースを判定したいときに使えます。
And・Orを組み合わせる場合はカッコで優先順位を明示する
複数の演算子を組み合わせる場合、評価順序を誤解しないようにカッコ()で優先順位を明示するのが安全です。
Sub CheckCombinedCondition()
Dim age As Integer
Dim hasLicense As Boolean
Dim isMember As Boolean
age = 25
hasLicense = True
isMember = False
' 「年齢20歳以上かつ免許あり」または「会員である」場合にOK
If (age >= 20 And hasLicense) Or isMember Then
MsgBox "利用可能です。"
Else
MsgBox "利用できません。"
End If
End Sub
カッコを省略してもAndはOrより優先順位が高いため同じ結果になりますが、コードを読む人が意図を誤解しないよう、明示的にカッコをつけることをおすすめします。
注意点:VBAにはショートサーキット評価がない
多くのプログラミング言語では、Andの左側がFalseだった時点で右側の条件を評価しない「ショートサーキット評価」が行われますが、VBAのAnd・Orは両辺を必ず評価します。これはVBAで特に注意すべき落とし穴です。
次のコードは、配列の範囲外アクセスでエラーになる典型例です。
Sub DangerousPattern()
Dim arr() As Variant
Dim idx As Integer
arr = Array(1, 2, 3)
idx = 5
' NG例:UBoundを超えたidxでarr(idx)にアクセスしようとし、
' Andの右側も必ず評価されるためエラーになる
If idx <= UBound(arr) And arr(idx) > 0 Then
MsgBox "条件を満たしました。"
End If
End Sub
このコードはidx <= UBound(arr)がFalseであっても、arr(idx)が評価されてしまい「インデックスが有効範囲にありません」の実行時エラーが発生します。このようなケースでは、If文をネストして安全に処理する必要があります。
Sub SafePattern()
Dim arr() As Variant
Dim idx As Integer
arr = Array(1, 2, 3)
idx = 5
If idx <= UBound(arr) Then
If arr(idx) > 0 Then
MsgBox "条件を満たしました。"
End If
Else
MsgBox "インデックスが範囲外です。"
End If
End Sub
条件をIfのネストに分けることで、1つ目の条件がFalseの場合に2つ目の条件が評価されないようにできます。ゼロ除算のチェックなど、右側の条件が左側の条件に依存するケースでは、必ずこのパターンを使いましょう。
まとめ
And・Or・Not・Xorを使うことで、複数条件を組み合わせた柔軟な条件分岐が書けます。基本の使い方はシンプルですが、VBAには他言語にあるショートサーキット評価がないため、片方の条件がもう片方の条件の前提になっているようなケースでは、Andで1行にまとめずIf文をネストして安全に処理することが重要です。


コメント