【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
数値が文字列のときは、数値に変換されてから計算されます。
※数値に変換できない文字列はエラーになります。
論理積の結果は数値ですが、条件式として使用されたときは、最終的な計算結果を次の基準で真偽値に変換します。
計算結果 | 変換結果 | 例 |
---|---|---|
0 | False | 2 And 5 ⇒ 0 ⇒ False 7 And 9 And 4 ⇒ 1 And 4 ⇒ 0 ⇒False |
0以外 | True | 2 And 3 ⇒ 2 ⇒ True 7 And 9 And 3 ⇒ 1 And 3 ⇒ 1 ⇒ True |
次の表は、Andの左右の型ごとの計算結果をまとめたものです。
左右の型 | 結果 | 例 | ||
---|---|---|---|---|
数値 | 数値 | 論理積 | 2 And 4 ⇒ 0 | 2 And 3 ⇒ 2 |
数値 | True | 数値 | 2 And True ⇒ 2 | 10 and 5 > 1 ⇒ 10 |
数値 | false | 0 | 2 And False ⇒ 0 | 10 and 5 < 1 ⇒ 0 |
0 | Null | 0 | 0 And Null ⇒ 0 | |
数値 (0以外) | Null | Null | 5 And Null ⇒ Null | |
True | True | True | True And True ⇒ True | 5 > 1 And 10 > 1 ⇒ True |
True | False | False | True And False ⇒ False | 5 > 1 And 10 < 1 ⇒ False |
False | False | False | False And False ⇒ False | 5 < 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 ⇒ 6 | 2 Or 3 ⇒ 3 |
数値 | True | -1 | 2 Or True ⇒ -1 | 10 Or 5 > 1 ⇒ -1 |
数値 | false | 数値 | 2 Or False ⇒ 2 | 10 Or 5 < 1 ⇒ 10 |
0 | Null | Null | 0 Or Null ⇒ Null | |
数値 (0以外) | Null | 数値 | 5 Or Null ⇒ 5 | |
True | True | True | True Or True ⇒ True | 5 > 1 Or 10 > 1 ⇒ True |
True | False | True | True Or False ⇒ True | 5 > 1 Or 10 < 1 ⇒ True |
False | False | False | False Or False ⇒ False | 5 < 1 Or 10 < 1 ⇒ False |
Not
AndとOrは左右の値が計算対象でしたが、Notは右側の値が計算対象です。
次の表に従って計算します。
値の型 | 結果 | 例 | |
---|---|---|---|
数値 | ビット反転 | Not 2 ⇒ -3 | Not -2 ⇒ 1 |
True | False | Not True ⇒ False | Not( 5 > 1) ⇒ False |
False | True | Not False ⇒ True | Not(5 < 1) ⇒ True |
Null | Null | Not 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 とします。
ビット値 | 結果 | |
---|---|---|
1 | 1 | 1 |
0 | 1 | 0 |
0 | 0 | 0 |
次のような計算になります。
222 And 253 ⇒ 220
222 → 11011110
253 → 11111101
220 ← 11011100
論理和
論理和は、数値のビット同士を比較して両方とも0のものを0、それ以外を 1 とします。
ビット値 | 結果 | |
---|---|---|
1 | 1 | 1 |
0 | 1 | 1 |
0 | 0 | 0 |
次のような計算になります。
140 And 208 ⇒ 220
140 → 10001100
208 → 11010000
220 ← 11011100
更新日:2023/12/01
関連記事
スポンサーリンク
記事の内容について
こんにちはけーちゃんです。
説明するのって難しいですね。
「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。
裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。
掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。
ご意見、ご指摘はこちら。
https://note.affi-sapo-sv.com/info.php
このサイトは、リンクフリーです。大歓迎です。