複数条件判定を行う時のコツ
複数の条件を判定して処理を決めなければならない場合は多くあります。
複数条件の判定を行う場合のIfステートメントの使い方やテクニックはいくつも存在します。
条件分岐の基本は以下で学習済として進めます。
ここでは覚えておきたい基本的なIfステートメントの組み立て方法を紹介します。
これらを行う時のVBAコードの書き方で説明します。
例えば、a=1やa=bといった単純な条件と仮定して読んでもらえれば理解しやすいと思います。
全ての条件を満たしている時
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を抜けるので処理効率が良くなります。
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)のみを格納するデータ型になります。
条件1から順に判定していき、条件を満たしていない時に、Falseを入れます。
全ての条件判定が終わった時に、
Trueになっていれば、全ての条件を満たしているという事になります。
一つでも条件を満たしていない場合は、結果はFalseになるということです。
このNotは論理演算子で、式の論理否定を求めるものです。
つまり、TrueならFalseに、FalseならTrueにするものです。
Not a = 1これは、a <> 1と同じ意味になります。
If flg And Not 条件2 Then
このように書くことで対処できます。
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 条件1 Or _
条件2 Or _
条件3 Or _
条件4 Or _
条件5 Then
'どれか一つでも条件を満たしているときの処理
End If
全ての条件を満たしている時のAndを使う書き方同様に、
条件が単純なものであれば、これが最も簡単な書き方ですし、良く書かれているものだと思います。
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 条件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
これだけの変更で、いろいろなパターンに対応できています。
このような書き方を覚えておくと、プログラミングの幅が格段に広がります。
条件判定に関連する記事
第7回.セルの値で計算を変える(Ifステートメント)
実は奥が深いIfステートメント
同じテーマ「マクロVBA技術解説」の記事
If条件式のいろいろな書き方:TrueとFalseの判定とは
VBAでの括弧()の使い方、括弧が必要な場合
VBAにおけるピリオドとカンマとスペースの使い方
変数とプロシージャーの命名について
文字列置換の基本と応用(Replace)
データクレンジングと名寄せ
ForとIfのネストこそがVBAの要点
For Next の使い方いろいろ
複数条件判定を行う時のコツ
ブール型(Boolean)のis変数・フラグについて
新着記事NEW ・・・新着記事一覧を見る
TRIMRANGE関数(セル範囲をトリム:端の空白セルを除外)|エクセル入門(2024-08-30)
正規表現関数(REGEXTEST,REGEXREPLACE,REGEXEXTRACT)|エクセル入門(2024-07-02)
エクセルが起動しない、Excelが立ち上がらない|エクセル雑感(2024-04-11)
ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.繰り返し処理(For Next)|VBA入門
4.変数宣言のDimとデータ型|VBA入門
5.RangeとCellsの使い方|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.メッセージボックス(MsgBox関数)|VBA入門
8.セルのクリア(Clear,ClearContents)|VBA入門
9.ブック・シートの選択(Select,Activate)|VBA入門
10.条件分岐(Select Case)|VBA入門
- ホーム
- マクロVBA応用編
- マクロVBA技術解説
- 複数条件判定を行う時のコツ
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。