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
これだけの変更で、いろいろなパターンに対応できています。

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



条件判定に関連する記事





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

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

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

エクセルVBAでのシート指定方法|VBA技術解説(9月8日)
VBAのクラスとは(Class,Property,Get,Let,Set)|VBA技術解説(8月28日)
VBAこれだけは覚えておきたい必須基本例文10|VBA技術解説(8月22日)
VBAの省略可能な記述について|ExcelマクロVBA技術解説(8月11日)
複数条件判定を行う時のコツ|ExcelマクロVBA技術解説(7月11日)
For Next の使い方いろいろ|VBA技術解説(6月14日)
VBAを定型文で覚えよう|ExcelマクロVBA技術解説(3月26日)
VBAスタンダード試験対策まとめ|MOS VBAエキスパート対策(3月16日)
ユーザーフォームとメニューの操作|MOS VBAエキスパート対策(3月14日)
ファイルの操作|MOS VBAエキスパート対策(3月14日)

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

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



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

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


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





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

    本文下部へ

    ↑ PAGE TOP