Excel業務カイゼンブログ

VBAでAndやOrの論理式を使う
こちらの記事では、VBAでIFでの分岐の方法を紹介しました。
今回は、IFと同時に使用する、なおかつ、または、の論理式である、And、Orに併せ、否定のNotについても解説します。
記事内のVBAを実際に動作させるには、次の手順で行います。
シート見出しを右クリックして、コードの表示をクリックします。

VBAを操作するVBE(Visual Basic Editor)が立ち上がりますので、プロジェクトの画面で、Book1などの現在操作しているブック名を右クリックし、挿入の中の標準モジュールをクリックします。

VBAプロジェクトの中に、VBAを記載することができる、標準モジュールが挿入され、右のウィンドウに挿入した標準モジュールのModule1の編集画面が表示されます。

この画面に記事内の文書を入力、またはコピーアンドペーストします。
記事内のVBAの左に記載されているのは行番号です。「:」まで含めてVBAには必要ありませんので、入力はしません。

記入したVBAのどこかをクリックしてから、VBEの実行ボタンをクリックすると実行されます。


論理式
ExcelにもAND関数、OR関数があるように、「なおかつ」や「または」の条件を付けることができます。
組み合わせることで様々な条件や、3つ以上の値の比較ができます。
Excelの論理関数はAND(A=1,B1=1)のように、はじめにAndを記載しました。
VBAでは、比較する式と比較する式の間にAndを記載し、If Range(A1).Value = 1 And Range(A1).Value = 1 Thenのように記載します。
例では、Ifの1行目のみを記載します。

And:なおかつ条件
すべての比較する式が成立していれば、の場合です。
例1)すべてが一致しているか
セルA1の値がセルB1と一致しており、なおかつ、セルB1の値がセルC1と一致している場合です。
つまり、A1=B1=C1の条件です。
1:Sub なおかつ1()
2: Range("A1").Value = Range("B1").Value And Range("A1").Value = Range("C1").Value Then
3: Range("D1").Value = "一致"
4:End If
5:End Sub
例2)2つのセルがある値かどうか調べる
セルA1の値が2019でセルB1の値が5でセルC1の値が1の場合です。
このように2つ以上の式を論理式で結合することもできます。
1:Sub なおかつ2()
2:If Range("A1").Value = 2019 And Range("B1").Value = 5 And Range("C1").Value = 1 Then
3: Range("D1").Value = "一致"
4:End If
5:End Sub
例3)数値の範囲
セルA1の値が100以上でセルA1の値が200以下の場合です。
つまり、A1が100から200の間という意味です。
1:Sub なおかつ3()
2:If Range("A1").Value >= 100 And Range("A1").Value <= 200 Then
3: Range("D1").Value = "一致"
4:End If
5:End Sub
Andの間違った使い方
次のAnd条件は、絶対に成立しません。
1:If Range("A1").Value <= 100 And Range("A1").Value >= 200 Then
日本語にするとセルA1が100以下でかつ200以上ということになります。
このような数値はあり得ませんのでこの式は成立しません。
1:If Range("A1").Value ="山" And Range("A1").Value ="川" Then
日本語では、セルA1が「山」でかつ「川」ということになります。
セルに入る値は一つだけなので、この条件は成立しません。
1:If Range("A1").Value <= 100 And Range("A1").Value >= 100 Then
日本語にするとセルA1が100以下でかつ100以上ということになります。
これはつまり、100以外は成立しないので、次の条件にしましょう。
1:If Range("A1").Value <= 100 Then

Or:またはの条件
いずれかの比較する式が成立していれば、の場合です。
例1)セル同士の値が一致したら
セルA1の値がセルB1と一致している、または、セルA2の値がセルB2と一致している場合です。
つまり、1行目か2列目のどちらかが、A列とB列が同じ値であれば、の条件です。
1:Sub または1()
2:If Range("A1").Value = Range("B1") .Value Or Range("A2").Value = Range("B2") .Value Then
3: Range("D1").Value = "一致"
4:End If
5:End Sub
例2)特定の文字と一致したら
セルA1の値が「外税」と一致している、または、セルA1の値が「非課税」と一致している場合です。
つまり、セルA1が「外税」か「非課税」ならばの条件です。
1:Sub または2()
2:If Range("A1").Value = "外税" Or Range("A1").Value = "非課税" Then
3: Range("D1").Value = "一致"
4:End If
5:End Sub
Orの間違った使い方
次のOr条件は、絶対に成立します。
1:If Range("A1").Value <= 200 Or Range("A1").Value >= 100 Then
日本語にするとセルA1が200以下または100以上ということになります。
どんな数字でも100以上で200以下ですので、これは条件式として意味がありません。

Not:ではない条件
そうではない、の条件です。
Notは比較する式の前に記述します。
And、Or、またはほかの演算と組み合わせることがほとんどですが、まず、Not関数単体で説明します。
例1)一致していなければ
セルA1の値が1と等しい条件と一致していなかったら、の例です。
1:Sub ではない1a()
2:If Not Range("A1").Value = 1 then
3: Range("D1").Value = "一致ではない"
4:End If
5:End Sub
つまり、セルA1が1ではなかったらと同じなので、次の記述と同じに動作になります。
1:Sub ではない1b()
2:If Range("A1").Value <> 1 then
3: Range("D1").Value = "一致ではない"
4:End If
5:End Sub
例2)以上ではなかった場合
セルA1の値が100以上の条件と一致していなかったら、の例です。
1:Sub ではない2a()
2:If Not Range("A1").Value >= 100 then
3: Range("D1").Value = "100以上ではない"
4:End If
5:End Sub
つまり、セルA1が100より小さかったらと同じなので、次の記述と同じに動作になります。
1:Sub ではない2a()
2:If Range("A1").Value < 100 then
3: Range("D1").Value = "100未満である"
4:End If
5:End Sub

And、Or、Notの組み合わせの条件
And、Or、Notは組み合わせて使うことが多いです。
例1)2つのセルが範囲内かどうかを調べる場合
セルA1が200から500の間で、なおかつ、セルB1が3000から6000の間の場合の例です。
1:Sub 組み合わせ1a()
2:If Range("A1").Value >= 200 And Range("A1").Value <= 500 And Range("B1").Value >= 3000 And Range("B1").Value <= 6000 Then
3: Range("D1").Value = "一致"
4:End If
5:End Sub
4つの式をAndで結合しています。
しかし、後から見直す時に、これでは解読に時間がかかるので、次のように、〇から〇までの条件を( )でくくるとよいでしょう。
1:Sub 組み合わせ1b()
2:If (Range("A1").Value >= 200 And Range("A1").Value <= 500) And (Range("B1").Value >= 3000 And Range("B1").Value <= 6000) Then
3: Range("D1").Value = "一致"
4:End If
5:End Sub
例2)2つのセルのどちらかが範囲に入っているか調べる場合
セルA1が0から100の間か、または、セルA1が300から400の間の場合の例です。
セルA1が0から400の間での動作を設定したいが100から300までの間は該当させたくないという場合です。
この場合は、0から100はAnd、300から400もAnd、しかしこの2つの式を繋ぐのはOrというもので、Andで結合される条件を必ず( )でくくらないと、人間が見るときのみならず、VBAがどこからどこまでがAnd条件でどこからどこまでがOr条件か、わからなくなるので( )でくくります。
1:Sub 組み合わせ2()
2:If (Range("A1").Value >= 0 And Range("A1").Value <= 100) Or (Range("A1").Value >= 300 And Range("A1").Value <= 400) Then
3: Range("D1").Value = "一致"
4:End If
5:End Sub
例3)AndとOrの組み合わせの全体を否定する
セルA1が0から100の間か、または、セルA1が300から400の間の場合以外なら
例2のNot条件になります。
全体を( )でくくり、Notを付けます。
1:Sub 組み合わせ3()
2:If Not((Range("A1").Value >= 0 And Range("A1").Value <= 100) Or (Range("A1").Value >= 300 And Range("A1").Value <= 400)) Then
3: Range("D1").Value = "一致"
4:End If
5:End Sub
例4)多条件のうち、例外がある場合
セルA1が0から100の間か、または、セルA1が300から400の間の場合以外、しかし、セルB1が「はい」ならば
例3の条件でも、セルB1が「はい」ならば成立する式です。
例3の条件にOrでセルB1が「はい」の条件を付けます。
1:Sub 組み合わせ4()
2:If Not((Range("A1").Value >= 0 And Range("A1").Value <= 100) Or (Range("A1").Value >= 300 And Range("A1").Value <= 400)) Or Range("B1").Value >= "はい" Then
3: Range("D1").Value = "一致"
4:End If
5:End Sub
例5)複雑な条件
セルB1が「はい」ならば、セルA1が0から100の間か、または、セルA1が300から400の間の場合、セルB1が「はい」ではなければ、セルA1が0から100の間か、または、セルA1が300から400の間の場合以外
とても複雑ですが、例3の条件をセルB1が「はい」かそうではないかで動作を切り替える条件です。
1:Sub 組み合わせ4()
2:If (Range("B1").Value = "はい" And (Range("A1").Value >= 0 And Range("A1").Value <= 100) Or (Range("A1").Value >= 300 And Range("A1").Value <= 400)) Or (Range("B1").Value <> "はい" And Not((Range("A1").Value >= 0 And Range("A1").Value <= 100) Or (Range("A1").Value >= 300 And Range("A1").Value <= 400))) Then
3: Range("D1").Value = "一致"
4:End If
5:End Sub
実際にこのような条件はあります。やむを得ずこのような複雑な条件にする場合は、見やすくするように次の「_」(アンダースコア)の活用のテクニックを使います。

「_」(アンダースコア)の活用
条件式が複雑になれば、1行では見きれなかったり、読みにくくなったりします。
VBAでは、本来、1行で記載する内容であっても、間に半角スペースと半角の「_」(アンダースコア、アンダーバー)を入れることで複数行に記述することができます。。
例えば上記の式では次のように記述できます。
1:If ( _
2: Range("B1").Value = "はい" _
3: And _
4: (Range("A1").Value >= 0 And Range("A1").Value <= 100) _
5: Or _
6: (Range("A1").Value >= 300 And Range("A1").Value <= 400)) _
7: Or (_
8: Range("B1").Value <> "はい" _
9: And _
10: Not( _
11: (Range("A1").Value >= 0 And Range("A1").Value <= 100) _
12: Or _
13: (Range("A1").Value >= 300 And Range("A1").Value <= 400)) _
14:) Then
15: Range("D1").Value = "一致"
16:End If
17:End Sub
どんな論理式があって、And、Orでどう繋がっているか見やすくなります。
実は4行目から6行目、11行目から13行目の式も全く同じものということにも気づけます。

Ifと同義の論理式
論理式のAndで作成する次のような式があります。
If Range("A1").Value >= 100 And Range("A1").Value <= 200 Then
実際の処理
End If
これは次のIfのネストと同じ動作になります。
If Range("A1").Value >= 100 Then
If Range("A1").Value <= 200 Then
実際の処理
End If
End If
IfをネストするのはAndで繋ぐのと同じなのです。

まとめ
今回は、VBAでIfを使うときのAnd、Or、Notの論理式の使用の方法について、紹介しました。
それぞれの日本語訳は次の通りです。
And:なおかつ
Or:または
Not:ではない
IfとAnd、Or、Notを使う時は、明確に条件が判断されるよう、適宜、( )でくくる必要があります。

Forguncyをもっとよく知る
各業種や用途別にForguncyを活用して、成功した事例や使い方のご紹介します。