VBA技術解説
複数条件判定を行う時のコツ

ExcelマクロVBAの問題点と解決策、VBAの技術的解説
公開日:2018-07-11 最終更新日:2024-01-03

複数条件判定を行う時のコツ


複数の条件を判定して処理を決めなければならない場合は多くあります。
複数条件の判定を行う場合のIfステートメントの使い方やテクニックはいくつも存在します。
条件分岐の基本は以下で学習済として進めます。

第20回.条件分岐(If)|VBA入門
・Ifステートメントの構文 ・IFステートメントの条件式 ・Ifステートメントの使用例文 ・Ifステートメントのネスト(入れ子) ・サイト内のIfステートメント参考ページ ・最後に
第21回.条件分岐(ElseIf)|VBA入門
前回のIFステートメントでは、真か偽の二択でした。今回は、もっと多くの分岐が必要な、Ifステートメントで多肢条件分岐の場合の書き方です。ステートメントとしては、Ifステートメントです。IfステートメントのElseIfの構文 If条件式1Then 条件式1が真の処理 [ElseIf条件式2Then 条件式2が真の処理…
第22回.条件分岐(Select Case)|VBA入門
・Select Caseステートメントの構文 ・Select Case の例文 ・Select Case の応用

ここでは覚えておきたい基本的なIfステートメントの組み立て方法を紹介します。


以下では、条件1から条件5までの5つの条件がある時の3種類の処理、

これらを行う時のVBAコードの書き方で説明します。


条件1から条件5は、
例えば、a=1やa=bといった単純な条件と仮定して読んでもらえれば理解しやすいと思います。

全ての条件を満たしている時

普通にIfステートメントで、論理演算子のAndを使って書く場合です。

If 条件1 And _
  条件2 And _
  条件3 And _
  条件4 And _
  条件5 Then
  '全ての条件を満たしているときの処理
End If

条件が単純なものであれば、これが最も簡単な書き方ですし良く書かれているものだと思います。
Ifステートメントをネストする書き方でも同じになります。

If 条件1 Then
  If 条件2 Then
    If 条件3 Then
      If 条件4 Then
        If 条件5 Then
          '全ての条件を満たしているときの処理
        End If
      End If
    End If
  End If
End If

全ての条件を満たしていない時の処理を書く必要がある場合は、このようにネストしてしまうと困ってしまいますが、
それが必要ないのであれば、ネストすることによるメリットもあります。
Andでつなげた場合は、全ての条件が常に判定されますが、
IFのネストなら、条件を満たさなくなった時点で、Ifを抜けるので処理効率が良くなります。

Andとネストを組み合わせて使う書き方もあります。

If 条件1 And _
  条件2 Then
  If 条件3 And _
    条件4 And _
    条件5 Then
    '全ての条件を満たしているときの処理
  End If
End If

これにより、ネストのレベル(入れ子の階層)を少なくすることが出来ます。
そして、全てAndでつなげる場合に比べて、条件をグループ化できています。
つまり、
条件1と2が同じような内容の判定で、条件3と4と5が同じような内容の判定の場合です。
同様の条件だけをAndでつなげることで、可読性を上げることが出来ています。

以下は、ここまでとは全く違った手法になります。

Dim flg As Boolean
flg = True
If Not 条件1 Then
  flg = False
End If
If Not 条件2 Then
  flg = False
End If
If Not 条件3 Then
  flg = False
End If
If Not 条件4 Then
  flg = False
End If
If Not 条件5 Then
  flg = False
End If
If flg Then
  '全ての条件を満たしているときの処理
End If

Dim flg As Boolean
これは、ブール型変数の宣言です。
ブール型は、
真 (True) (-1) または偽 (False) (0)のみを格納するデータ型になります。

最初にTrueを入れておき、
条件1から順に判定していき、条件を満たしていない時に、Falseを入れます。
全ての条件判定が終わった時に、
Trueになっていれば、全ての条件を満たしているという事になります。
一つでも条件を満たしていない場合は、結果はFalseになるということです。

Not 条件1~Not 条件5
このNotは論理演算子で、式の論理否定を求めるものです。
つまり、TrueならFalseに、FalseならTrueにするものです。
Not a = 1これは、a <> 1と同じ意味になります。

条件1が満たされていない時に、条件2以下を判定したくない場合は、
If flg And Not 条件2 Then
このように書くことで対処できます。

flgはブール型なので、TrueかFalseしか入りませんので、
If flg Thenは、If flg = True Thenと同じ意味になります。

ブール型変数ではなく、カウンターとして数値変数を使う書き方もあります。

Dim cnt As Long
cnt = 0
If 条件1 Then
  cnt = cnt + 1
End If
If N条件2 Then
  cnt = cnt + 1
End If
If N条件3 Then
  cnt = cnt + 1
End If
If N条件4 Then
  cnt = cnt + 1
End If
If N条件5 Then
  cnt = cnt + 1
End If
If cnt = 5 Then
  '全ての条件を満たしているときの処理
End If

この理屈は理解しやすいと思います。
条件を判定して、条件を満たしていれば1カウントアップしています。
カウントが条件の件数数と同じなら全ての条件を満たしているという事になります。

ブール型変数を使う手法と同じような考え方になっていますが、
この書き方をすると、
ブール型変数を使った場合は、Notで否定形にする必要がありましたが、
このカウント方式では、否定形にしなくて良いという利点もあります。
さらに、
例えば5条件の内3条件を満たしていればというような特殊な判定も可能になりますので、
以下の、どれか一つでも条件を満たしている時でもそのまま使えるという事です。

どれか一つでも条件を満たしている時

全ての条件を満たしている時の書き方とは反対(否定形)になるのが基本です。

普通にIfステートメントで、論理演算子のOrを使って書く場合です。

If 条件1 Or _
  条件2 Or _
  条件3 Or _
  条件4 Or _
  条件5 Then
  'どれか一つでも条件を満たしているときの処理
End If

全ての条件を満たしている時のAndを使う書き方同様に、
条件が単純なものであれば、これが最も簡単な書き方ですし、良く書かれているものだと思います。

ElseIfステートメントを使って角こともできます。

If 条件1 Then
  'どれか一つでも条件を満たしているときの処理
ElseIf 条件2 Then
  'どれか一つでも条件を満たしているときの処理
ElseIf 条件3 Then
  'どれか一つでも条件を満たしているときの処理
ElseIf 条件4 Then
  'どれか一つでも条件を満たしているときの処理
ElseIf 条件5 Then
  'どれか一つでも条件を満たしているときの処理
End If

どれか一つでも条件を満たしているときの処理が複数個所に書かれているのが気になります。
プログラミングにおいては、同じ記述を複数個所に書くことは、
可読性及び保守性が悪いものとなり、推奨されない書き方となります。

そこで、ブール型変数を使います。

Dim flg As Boolean
flg = False
If 条件1 Then
  flg = True
ElseIf 条件2 Then
  flg = True
ElseIf 条件3 Then
  flg = True
ElseIf 条件4 Then
  flg = True
ElseIf 条件5 Then
  flg = True
End If
If flg Then
  'どれか一つでも条件を満たしているとき
End If

これは、ElseIfを使う場合の基本テクニックになります。
全ての条件を満たしているとき同様の、ブール型変数を使った書き方もできます。

Dim flg As Boolean
flg = False
If 条件1 Then
  flg = True
End If
If 条件2 Then
  flg = True
End If
If 条件3 Then
  flg = True
End If
If 条件4 Then
  flg = True
End If
If 条件5 Then
  flg = True
End If
If flg Then
  'どれか一つでも条件を満たしているときの処理
End If

全ての条件を満たしている時との違いは、
最初にFalseにして置き、条件を満たしたらTrueにする点になります。
条件判定は、Notが必要なくなります。
True、False、これらの条件が反対(否定形)になるだけで、基本構造はどちらも同じです。
この書き換えは、しっかり覚えておいた方が良いでしょう。

カウンターとして数値変数を使う書き方です。

Dim cnt As Long
cnt = 0
If 条件1 Then
  cnt = cnt + 1
End If
If 条件2 Then
  cnt = cnt + 1
End If
If 条件3 Then
  cnt = cnt + 1
End If
If 条件4 Then
  cnt = cnt + 1
End If
If 条件5 Then
  cnt = cnt + 1
End If
If cnt >= 1 Then
  'どれか一つでも条件を満たしているときの処理
End If

全ての条件を満たしているときと全く同じ書き方になります。
最後の判定が、= 5なのか>= 1なのかの違いです。

このように汎用性の高い書き方になりますので、是非覚えておいてください。

全ての条件を満たしていない時

これは、全ての条件を満たしている時の条件を全て否定形にすることと同じ意味になります。

普通にIfステートメントで、全ての条件にNotを付けて、論理演算子のAndでつなげます。

If Not 条件1 And _
  Not 条件2 And _
  Not 条件3 And _
  Not 条件4 And _
  Not 条件5 Then
  '全ての条件を満たしていない時
End If

Ifステートメントをネストする場合も、
同様に、全ての条件にNotを付けるだけになります。

If Not 条件1 Then
  If Not 条件2 Then
    If Not 条件3 Then
      If Not 条件4 Then
        If Not 条件5 Then
          '全ての条件を満たしていない時
        End If
      End If
    End If
  End If
End If

少々変則になりますが、ElseIfを使う書き方の場合です。

If 条件1 Then
ElseIf 条件2 Then
ElseIf 条件3 Then
ElseIf 条件4 Then
ElseIf 条件5 Then
Else
  '全ての条件を満たしていない時
End If

Thenに何も書かずに、ElseIf、ElseIfと進んで、
最後のElseが全ての条件を満たしていない場合という事です。

ブール型変数を使う場合は、
全ての条件を満たしている時のNotを消せば良いことになります。

Dim flg As Boolean
flg = True
If Not 条件1 Then
  flg = False
End If
If Not 条件2 Then
  flg = False
End If
If Not 条件3 Then
  flg = False
End If
If Not 条件4 Then
  flg = False
End If
If Not 条件5 Then
  flg = False
End If
If flg Then
  '全ての条件を満たしているときの処理
End If

カウンターとして数値変数を使う書き方は、ほぼそのまま使えます。

Dim cnt As Long
cnt = 0
If 条件1 Then
  cnt = cnt + 1
End If
If N条件2 Then
  cnt = cnt + 1
End If
If N条件3 Then
  cnt = cnt + 1
End If
If N条件4 Then
  cnt = cnt + 1
End If
If N条件5 Then
  cnt = cnt + 1
End If
If cnt = 0 Then
  '全ての条件を満たしているときの処理
End If

最後に、cnt = 0と判定すれば良いことになります。
このように汎用性があるのが、この書き方の良いところになります。
・全ての条件を満たしている時
 cnt = 5 '5は条件の数
・どれか一つでも条件を満たしている時
 cnt >= 1
・全ての条件を満たしていない時
 cnt = 0
これだけの変更で、いろいろなパターンに対応できています。

もちろん、常にこの書き方が良いという事ではありませんが、
このような書き方を覚えておくと、プログラミングの幅が格段に広がります。

条件判定に関連する記事

第20回.条件分岐(If)
・Ifステートメントの構文 ・IFステートメントの条件式 ・Ifステートメントの使用例文 ・Ifステートメントのネスト(入れ子) ・サイト内のIfステートメント参考ページ ・最後に
第21回.条件分岐(ElseIf)
前回のIFステートメントでは、真か偽の二択でした。今回は、もっと多くの分岐が必要な、Ifステートメントで多肢条件分岐の場合の書き方です。ステートメントとしては、Ifステートメントです。IfステートメントのElseIfの構文 If条件式1Then 条件式1が真の処理 [ElseIf条件式2Then 条件式2が真の処理…

第7回.セルの値で計算を変える(Ifステートメント)
・Ifの説明用のサンプル ・マクロVBAでのIfの使い方 ・Ifステートメントの書き方 ・Ifのネスト(入れ子) ・AndとOr ・ElseIfとSelect Caseについて ・マクロVBAは、プログラミングです ・Ifステートメントの練習問題 ・改行方法について ・ExcelマクロVBA入門等の対応ページ

実は奥が深いIfステートメント
プログラムと言うものは、条件により処理を分ける。これにつきます。つまり、この条件が一番問題となります。そして、その記述をするものが、Ifステートメントになります。IFステートメントの基本 まずはIFステートメントの基本を確認しましょう。
論理積(And)論理和(Or)と真(True)偽(False)の判定
・Trueとは何か、Falseとは何か ・論理積(And) ・論理和(Or) ・Ifステートメントにおける真偽の判定 ・例.指定のフルパスがフォルダかの判定
条件式のいろいろな書き方:TrueとFalseの判定とは
If条件式の書き方で、VBAプログラムは大きく様相が変わってきます、VBAを習い始めは、比較演算子で比較した結果が 正しければTrue、間違っていればFalse という事で理解するはずです。しかし、いろいろなサンプルコードを見ていると、「あれっ」比較演算子が無い… というようなIfステートメントやSelectCas…



同じテーマ「マクロVBA技術解説」の記事

論理積(And)論理和(Or)と真(True)偽(False)の判定
If条件式のいろいろな書き方:TrueとFalseの判定とは
VBAでの括弧()の使い方、括弧が必要な場合
VBAにおけるピリオドとカンマとスペースの使い方
変数とプロシージャーの命名について
文字列置換の基本と応用(Replace)
データクレンジングと名寄せ
ForとIfのネストこそがVBAの要点
For Next の使い方いろいろ
複数条件判定を行う時のコツ


新着記事NEW ・・・新着記事一覧を見る

VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
累計を求める数式あれこれ|エクセル関数応用(2024-01-22)
複数の文字列を検索して置換するSUBSTITUTE|エクセル入門(2024-01-03)
いくつかの数式の計算中にリソース不足になりました。|エクセル雑感(2023-12-28)
VBAでクリップボードへ文字列を送信・取得する3つの方法|VBA技術解説(2023-12-07)
難しい数式とは何か?|エクセル雑感(2023-12-07)
スピらない スピル数式 スピらせる|エクセル雑感(2023-12-06)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.変数宣言のDimとデータ型|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.並べ替え(Sort)|VBA入門
8.条件分岐(IF)|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.マクロとは?VBAとは?VBAでできること|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ