Excel業務カイゼンブログ

見出しの装飾

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

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

見出しの装飾

Forguncyをもっとよく知る

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