VBAでAndやOrの論理式を使う

2018.09.25マクロ、VBA

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

コードの表示

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

VBEの起動

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を使う時は、明確に条件が判断されるよう、適宜、( )でくくる必要があります。

Back to top