【ExcelVBA・マクロ】論理演算子(And・Or・Not・Xor)の使い方|複数条件を組み合わせる条件分岐の書き方【コピペOK】

ExcelVBA

If文で「AかつBの場合」「AまたはBの場合」といった複数条件を判定したいとき、VBAではAndOrNotXorといった論理演算子を使います。使い方自体はシンプルですが、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

カッコを省略してもAndOrより優先順位が高いため同じ結果になりますが、コードを読む人が意図を誤解しないよう、明示的にカッコをつけることをおすすめします。

注意点:VBAにはショートサーキット評価がない

多くのプログラミング言語では、Andの左側がFalseだった時点で右側の条件を評価しない「ショートサーキット評価」が行われますが、VBAのAndOrは両辺を必ず評価します。これは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つ目の条件が評価されないようにできます。ゼロ除算のチェックなど、右側の条件が左側の条件に依存するケースでは、必ずこのパターンを使いましょう。

まとめ

AndOrNotXorを使うことで、複数条件を組み合わせた柔軟な条件分岐が書けます。基本の使い方はシンプルですが、VBAには他言語にあるショートサーキット評価がないため、片方の条件がもう片方の条件の前提になっているようなケースでは、Andで1行にまとめずIf文をネストして安全に処理することが重要です。

スポンサーリンク
スポンサーリンク
ExcelVBA
シェアする
いがぴをフォローする

コメント

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