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

ExcelマクロVBAの問題点と解決策、エクセルVBAの技術的解説
最終更新日:2018-07-11

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

多くの条件を判定して処理を決めなければならない場合は多くありますが、


複数条件判定を行う時のIfステートメントの使い方はいろいろあります。

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



以下では、条件1から条件5まであり、
・全ての条件を満たしている時
・どれか一つでも条件を満たしている時
・全ての条件を満たしていない時
これらを行う時の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は論理演算子で、式の論理否定を求めるものです。
つまり、TrueならFalseに、FalseならTrueにするものです。
Not a = 1なら、a <> 1と6同じ意味になります。

条件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ステートメントです。VBAマクロで自動化する場合の多くは、条件により処理を変えつつ一定回数繰り返すという事です。Excelマクロの基礎と応用
第21回.条件分岐(ElseIf)
前回のIFステートメントでは、真か偽の二択でした、今回は、もっと多くの分岐が必要な、Ifステートメントで多肢条件分岐の場合の書き方です。ステートメントとしては、Ifステートメントです。Excelマクロの基礎と応用、エクセルVBAの入門・初級・初心者向け解説

第7回.セルの値で計算を変える(Ifステートメント)
エクセルでは、他の列の値によって計算式を変えたりすることが多々あります、つまり、条件により処理を分けるということです、シートではIF関数を使いますが、マクロVBAでもIfなのですが書き方が違います。以下の表を使いましょう。マクロが覚えられないという初心者向けに理屈抜きのやさしい解説

実は奥が深いIfステートメント
プログラムと言うものは、条件により処理する これにつきます。つまり、この条件が一番問題となります。ExcelマクロVBAの問題点と解決策、エクセルVBAの技術的解説
論理積(And)論理和(Or)と真(True)偽(False)の判定
And演算子、Or演算子は、2つの数式内のビット単位の比較を行います、そして、IfステートメントのThenは、Trueの時と言うより、False以外の時に実行されます。何を言っているのか分かりずらいと思いますので、順に解説します。ExcelマクロVBAの問題点と解決策、エクセルVBAの技術的解説
条件式のいろいろな書き方:TrueとFalseの判定とは
If条件式の書き方で、VBAプログラムは大きく様相が変わってきます、VBAを習い始めは、比較演算子で比較した結果が 正しければTrue、間違っていればFalse という事で理解するはずです。しかし、いろいろなサンプルコードを見ていると、「あれっ」比較演算子が無い・・・と,VBAの問題点と解決策





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

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

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

クラスとCallByNameとポリモーフィズム(多態性)|VBA技術解説(4月6日)
VBAでのタイマー処理(SetTimer,OnTime)|VBA技術解説(4月3日)
クラスとイベントとマルチプロセス並列処理|VBA技術解説(4月2日)
エクセルの日付と時刻のまとめ|エクセル関数超技(3月6日)
Excelシートの複雑な計算式を解析するVBA|VBAサンプル集(2月18日)
VBAクラスの作り方:独自Rangeっぽいものを作ってみた|VBA技術解説(2月16日)
VBAクラスの作り方:列名のプロパティを自動作成する|VBA技術解説(2月14日)
VBAクラスの作り方:列名の入力支援と列移動対応|VBA技術解説(2月11日)
クラスを使って他ブックのイベントを補足する|VBA技術解説(2月6日)
Excelアドインの作成と登録について|VBA技術解説(2月3日)

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

1.ひらがな⇔カタカナの変換|エクセル基本操作
2.最終行の取得(End,Rows.Count)|VBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
5.RangeとCellsの使い方|ExcelマクロVBA入門
6.変数とデータ型(Dim)|ExcelマクロVBA入門
7.マクロって何?VBAって何?|ExcelマクロVBA入門
8.繰り返し処理(For Next)|ExcelマクロVBA入門
9.とにかく書いて見よう(Sub,End Sub)|VBA入門
10.セルに文字を入れるとは(Range,Value)|VBA入門



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

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


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






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

    本文下部へ