Excel

【VBA】And/Or/NotのIF文とIF以外での使い方を少し詳しく解説

更新日:2023/12/01

VBAのIf文はAndとOrを使って複数の条件を連結できます。
またNotを使用することで、条件を否定できます。
しかしこれらの演算子は条件式以外でも使用できます。
ここではAnd/Or/Notについて、少し詳しく解説します。

 

And

複数の条件の全てを満たすかどうかを If文の条件式で表すときは、Andで各条件を連結します。

' a が b より大きい、かつ、c が 5 、かつ、b が 2 かどうか判定 
if a > b And c = 5 And b = 2 Then
  ' 条件を満たすときの処理
Else
  ' 条件を満たさないときの処理
End if

Andは条件式で使用されることが多いですが、実際には計算結果を変数に代入できます。

Dim a As Integer, b As Integer, c As Integer
Dim result As Variant

a = 5: b = 2: c = 5
result = a > b And c = 5 And b = 2
Debug.Print result
>> True

上記のコードは、計算結果がTrueになりました。
If文でも同じ計算が行われ、最終的な結果が True か False かで条件判定されます。

また、And は 左右の値が数値のとき、左右の値の論理積が求められます。

Debug.Print 7 And 9
>> 1
Debug.Print 7 And 9 And 4
>> 0
Debug.Print 7 And "9"
>> 1

数値が文字列のときは、数値に変換されてから計算されます。
※数値に変換できない文字列はエラーになります。

論理積の結果は数値ですが、条件式として使用されたときは、最終的な計算結果を次の基準で真偽値に変換します。

計算結果変換結果
0False2 And 5 ⇒ 0 ⇒ False
7 And 9 And 4 ⇒ 1 And 4 ⇒ 0 ⇒False
0以外True2 And 3 ⇒ 2 ⇒ True
7 And 9 And 3 ⇒ 1 And 3 ⇒ 1 ⇒ True

次の表は、Andの左右の型ごとの計算結果をまとめたものです。

左右の型結果
数値数値論理積2 And 4 ⇒ 02 And 3 ⇒ 2
数値True数値2 And True ⇒ 210 and 5 > 1 ⇒ 10
数値false02 And False ⇒ 010 and 5 < 1 ⇒ 0
0Null00 And Null ⇒ 0
数値
(0以外)
NullNull5 And Null ⇒ Null
TrueTrueTrueTrue And True ⇒ True5 > 1 And 10 > 1 ⇒ True
TrueFalseFalseTrue And False ⇒ False5 > 1 And 10 < 1 ⇒ False
FalseFalseFalseFalse And False ⇒ False5 < 1 And 10 < 1 ⇒ False

複数の条件をAndで連結すると、左から順番に計算されます。

a = 234: b = 123: c = 321

result = a And b And a > b And c = 321 And b = 123 And c + 100
Debug.Print result
>> 32 

次の流れで計算されます。

a And b And a > b And c = 321 And b = 123 And 321 + 100
⇒ 234 And 123 And True And True And True And 421 ' 算術演算子、比較演算子の順番で評価
⇒ 106 And True And True And True And 421 ' 最初のAndを計算( 234と123の論理積 )
⇒ 106 And True And True And 421          ' 106 And True ⇒ 106
⇒ 106 And True And 421                   ' 106 And True ⇒ 106
⇒ 106 And 421                            ' 106 And True ⇒ 106
⇒ 32

計算例の結果が数値でした。
結果が数値となる式を条件式で使用すると、真偽値に変換されます。

If a And b And a > b And c = 321 And b = 123 And c + 100 Then ' 計算結果32 ⇒ True
 Debug.Print "true"
End If
>> "true"

 

Or

Or は 基本的にはAndと同じです。

ただし、次の表に従って計算されます。

左右の型結果
数値数値論理和2 Or 4 ⇒ 62 Or 3 ⇒ 3
数値True-12 Or True ⇒ -110 Or 5 > 1 ⇒ -1
数値false数値2 Or False ⇒ 210 Or 5 < 1 ⇒ 10
0NullNull0 Or Null ⇒ Null
数値
(0以外)
Null数値5 Or Null ⇒ 5
TrueTrueTrueTrue Or True ⇒ True5 > 1 Or 10 > 1 ⇒ True
TrueFalseTrueTrue Or False ⇒ True5 > 1 Or 10 < 1 ⇒ True
FalseFalseFalseFalse Or False ⇒ False5 < 1 Or 10 < 1 ⇒ False

 

Not

AndOrは左右の値が計算対象でしたが、Notは右側の値が計算対象です。

次の表に従って計算します。

値の型結果
数値ビット反転Not 2 ⇒ -3Not -2 ⇒ 1
TrueFalseNot True ⇒ FalseNot( 5 > 1) ⇒ False
FalseTrueNot False ⇒ TrueNot(5 < 1) ⇒ True
NullNullNot Null ⇒ Null

基本的には条件をAndやOrなどで連結した式を ( )で囲んだものや、Functionプロシージャからの戻り値などで使用します。

Sub test2()
    Dim a As Integer, b As Integer, c As Integer
    Dim result As Variant
    a = 234: b = 123: c = 321

    If Not (a And b And a > b And c = 321) Or (b = 123 And c) Then
     ' 条件を満たすときの処理
    End If

    If Not func(200) Then
     ' 条件を満たすときの処理
    End If
End Sub

Function func(val As Integer) As Boolean
    If val > 100 Then
        func = True
    Else
        func = False
    End If
End Function

単一の比較演算は Notを使用するよりも、演算子を変更した方がわかりやすいです。

If Not a > b Then ' 単一の比較演算にNotを使用
End If

If a <= b Then ' 演算子を変更
End If

 

And/Or/Notの優先順位

And、Or、Notの優先順位は次のようになっています。

(1) ( )内の式
(2) + -などの算術演算子
(3) 比較演算子
(4) Not
(5) And
(6) Or

例えば次のような計算を行ったとします。

a = 234: b = 123: c = 321

result = a And b Or a > b And c = 321 Or Not (b = 123 Or c)
Debug.Print result
>> -1

次のような流れで、計算されます。

a And b Or a > b And c = 321 Or Not (b = 123 Or c)
⇒ a And b Or a > b And c = 321 Or Not (True Or c) ' ( )内の比較演算子を計算
⇒ a And b Or a > b And c = 321 Or Not -1 ' ( )内を計算 True Or c ⇒ -1
⇒ a And b Or True And True Or Not -1     ' 比較演算子を計算
⇒ a And b Or True And True Or 0          ' Not -1を計算 ⇒ 0
⇒ 106 Or True Or 0       ' Andを計算 a And b ⇒106 , True And True ⇒True
⇒ -1 Or 0                ' 106 Or True ⇒ -1
⇒ -1

条件式内に ( ) を使用すると、その中の式が先に計算されます。

条件式内にAnd、Or、Notが混在するときは、Notに( )が必要なケースが多いです。
And と Orは気にしなくても問題ないケースが多いですが、まれに想定外の結果になります。

想定した順番で確実に条件判定されるように、( )で優先順位を明確にしたほうが無難です。

 

Excelでの使用例

Excelでセルの内容をAndやORを使って条件判定する例を紹介します。

例1:セル内容が範囲内にあるか判定

次のコードはセルA1に入力されいる値が、100以上200以下の範囲かどうかを判定しています。

Sub test()

    Dim cell1 As Range
    Set cell1 = Cells(1, 1)
    
    If cell1.value >= 100 _
        And cell1.value <= 200 Then
        MsgBox "範囲内です"
    Else
        MsgBox "範囲内ではありません"
    End If
    
End Sub

例2:セル内容が範囲外かを判定

次のコードはセルA1に入力されいる値が、100以上200以下の範囲ではないかどうかを判定しています。

Sub test()

    Dim cell1 As Range
    Set cell1 = Cells(1, 1)
    
    If Not (cell1.value >= 100 _
        And cell1.value <= 200) Then
        MsgBox "範囲内ではありません"
    Else
        MsgBox "範囲内です"
    End If
    
End Sub

上記の条件式は、Orで記述することもできます。

    If cell1.value < 100 _
        Or cell1.value > 200 Then

上記のような単純な式なら、Notの分だけ Orの方が効率的です。

個人的には範囲外よりも範囲内の方がイメージしやすいので、AndやOrが多数使用されて非常に複雑な条件式は、範囲内かどうかの判定後にNotで打ち消すことが多いです。

例3:複数セルの内容が同じかどうか判定

次のコードは、セルA1、A2、A3の値が全て同一かどうかを判定しています。

Sub test()
    Dim cell1 As Range
    Set cell1 = Cells(1, 1)
    
    If cell1.Value = Cells(2, 1).Value _
        And cell1.Value = Cells(3, 1).Value Then
        MsgBox "同じです"
    Else
        MsgBox "同じではありません"
    End If
    
End Sub

例4:複数セルの中のどれかに特定の値があるか判定

次のコードは、セルA1、A2、A3のどれかに特定の値があるかどうかを判定しています。

Sub test()

    Dim value As Integer
    value = 100
    
    If Cells(1, 1).value = value _
        Or Cells(2, 1).value = value _
        Or Cells(3, 1).value = value Then
        
        MsgBox "同じ値があります"
    Else
        MsgBox "同じ値がありません"
    End If
    
End Sub

例5:複数セルの値が同一でない、かつ、セルのどれかに特定の値があるか判定

次のコードはセルA1、A2、A3の値が同一でなく、特定の値が含まれていないかどうかを判定しています。

Sub test()
    Dim cell1 As Range, cell2 As Range, cell3 As Range
    Set cell1 = Cells(1, 1)
    Set cell2 = Cells(2, 1)
    Set cell3 = Cells(3, 1)
    
    Dim value As Integer
    value = 100

    If cell1.value <> cell2.value _
        And cell1.value <> cell3.value _
        And cell2.value <> cell3.value _
        And Not ( _
                cell1.value = value _
                Or cell2.value = value _
                Or cell3.value = value _
            ) Then

        MsgBox "条件に一致します"
    Else
        MsgBox "条件に一致しません"
    End If
    
End Sub

 

論理積

論理積は、数値のビット同士を比較して両方とも1のものを1、それ以外を 0 とします。

ビット値結果
111
010
000

次のような計算になります。

222 And 253 ⇒ 220

222 → 11011110

253 → 11111101

220 ← 11011100

 

論理和

論理和は、数値のビット同士を比較して両方とも0のものを0、それ以外を 1 とします。

ビット値結果
111
011
000

次のような計算になります。

140 And 208 ⇒ 220

140 → 10001100

208 → 11010000

220 ← 11011100

更新日:2023/12/01

書いた人(管理人):けーちゃん

スポンサーリンク

記事の内容について

null

こんにちはけーちゃんです。
説明するのって難しいですね。

「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。

裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。

掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。

ご意見、ご指摘はこちら。
https://note.affi-sapo-sv.com/info.php

 

このサイトは、リンクフリーです。大歓迎です。