- VBAでのIf文の書き方を知りたい
- Select Caseって何?
- 条件分岐って?
プログラミングにおいて、処理の根幹をなす要素の1つに条件分岐があります。
条件分岐とは、条件が満たすか否かで処理を分けることを言い、VBAでは「If」と「Select Case」が該当します。
この記事では、以下について解説しています。
- 条件分岐とは
- IfとSelect Caseについて
条件分岐ができるようになると、様々なシステムを作れるようになるので必ず覚えてください。
条件分岐とは
条件分岐とは、条件文によって処理を分岐することです。
条件文とは、真(True)か偽(False)かを決定する構文のことを言います。
この条件文に、演算子が密接に関わってくるため、演算子が気になる方はまず以下の記事を参照すると、この後の内容をスムーズに理解できると思います。
VBAでの、条件分岐には「If」と「Select Case」の2種類が存在します。
Ifに関しては、大抵のプログラミング言語に存在する超重要な要素なのでしっかり身に付けましょう。
それぞれ解説していきます。
IFステートメント
VBAに限らず、さまざまな言語で使用されている条件分岐です。
Aであるときは①の処理、Bであるときは②の処理、それ以外は③の処理みたいな条件分岐ができるようになります。
IF文では、演算子がとても重要で複数の式を組み合わせたりすることで、複雑な処理を行うことも可能です。
基本形
If文の基本形は、「If~Then」または「If~Then~Else」です。
実際のコードを見てみましょう。
Sub test() Const A As Long = 10 Const B As Long = 15 '//If~Then If A > B Then Debug.Print A End If '//If~Then~Else If A > B Then Debug.Print A Else Debug.Print B End If End Sub
If~Thenは条件式がTrueの時のみに、If文内の処理が走ります。
また、End Ifは必ず必要なので忘れないようにしましょう。
If~End Ifが1つのIf文になります。
上記例の場合、If文内の処理(Debug.Print A
)は通らずに次の処理に進みます。
Elseが付くと、TrueとFalseで処理を分けることが可能です。
上記処理の場合、Bの方が大きいためFalseになり、Debug.Print B
が実行されます。
ElseIf
If文の形にはもう1つあり、それが「If~Then~ElseIf」です。
実際のコードを見てみましょう。
Sub test() Const A As Long = 10 Const B As Long = 15 '//If~Then~ElseIf If A > B Then Debug.Print A ElseIf A > 5 And B < 20 Then Debug.Print "Hello" Else Debug.Print B End If End Sub
ElseIfでは、Ifの条件に一致しなかった場合に、さらに別の条件で比較することが可能になります。
上記例の場合、ElseIfの処理に入るのでDebug.Print ”Hello”
が実行されます。
ElseIf
Else
というイメージになるので、すべての条件に当てはまらなかった時の処理を記述してあげましょう。
もちろん、Elseは記述しなくてもOKです。
当てはまらなかった時の処理が欲しい場合のみに記述しましょう。
入れ子(ネスト)
条件分岐やループ(繰り返し処理)を勉強すると、「入れ子」や「ネスト」という単語を耳にすることがあると思います。
これは、分岐の中に分岐があったり、ループの中にループがある構造のことを指しています。
If文で見てみましょう。
Sub test() Const A As Long = 10 Const B As Long = 15 '//入れ子 If A < B Then If A > 10 Then Debug.Print A Else Debug.Print B End If End If End Sub
このように、If文内にIfを入れることで、And(A<B And A>10
)とは少し違う条件で処理することができるようになります。
上記例では、Debug.Print B
が実行されます。
入れ子は多用厳禁ですが、すっきり見せるためにとても有効な書き方なのでIf文やループと合わせて覚えておきましょう。
Select Caseステートメント
Select Caseは、ある1つの条件に対して値が複数ある場合に使われます。
コードを見てみましょう。
Sub test() Const A As Long = 10 Const B As Long = 15 '//Select Case Select Case B - A Case 0,1 Debug.Print 1 Case 2 Debug.Print 2 Case 3 Debug.Print 3 Case 4 Debug.Print 4 Case 5 Debug.Print 5 Case Is > 10 Debug.Print "Big" Case Else Debug.Print "Nothing" End Select End Sub
B-A
の結果が何になるかで実行される処理が決定されます。
上記例の場合、Debug.Print 5
が実行されます。
書き方として、「Case」の後には値を記述します。
そして、If同様、End SelectまでがSelect Case文になります。
Select Caseでは、条件に一致した処理のみを実行します。
上記例の場合、Debug.Print 5
のみが実行され、その下の処理は実行されずにEnd Selectに進みます。
他言語では、breakという文が必要な場合もありますが、VBAでは不要です。
Ifでも書ける
Select Caseは、If文でも書くことができます。
先ほどのSelect Case文をIf文に直すと以下のようになります。
Sub test() Const A As Long = 10 Const B As Long = 15 '//Select CaseをIf文に If B - A = 0 Or B - A = 1 Then Debug.Print 1 ElseIf B - A = 2 Then Debug.Print 2 ElseIf B - A = 3 Then Debug.Print 3 ElseIf B - A = 4 Then Debug.Print 4 ElseIf B - A = 5 Then Debug.Print 5 ElseIf B - A > 10 Then Debug.Print "Big" Else Debug.Print "Nothing" End If End Sub
ElseIf B-A
が続くので見づらい+面倒です。
同じ条件を繰り返すなら見やすい方がいいので、条件に対する結果が3つ以上の場合はSelect Caseを使うようにしましょう。
2つの場合はIf文の方が簡潔になるので、If文でいいと思います。
基本的に、条件分岐はIf文を使えばいいですが、1つの条件に対して3つ以上結果・値がある場合はSelect Caseを使いましょう。
初心者ならではの注意点
さて、この条件分岐ですが、練習・大規模システムに限らず必ず使われ、規模が大きくなるにつれて複雑になっていきます。
そんな中、初心者にありがちな注意点もまとめました。
クソコードにならないようにするためにも意識していただけたらと思います。
多用しがち
あそこでIf文が終わったかと思ったら、また似たようなIf文がやってくるみたいな状態です。
確かに、If文で判定してあげれば正常に動作しますが、無駄に使いすぎているのは美しいコードではありません。
そんな時は、以下のポイントを意識しましょう。
- 別の関数を作る
- フラグを用意する
①はIf文とその結果を返す関数を作ってあげて、必要に応じて呼び出してあげるということです。
これを行うことで、メインの処理の部分はすっきりとしたコードにすることができます。
②はIfの結果を別の変数(フラグ)に入れておき、同じような判定が必要な場合はフラグで判定するということです。
これで、何回も同じ条件判断をする必要がなくなり、フラグ1つで完結させることができます。
深くなりがち
入れ子(ネスト)が重なり、階層が深くなることです。
シンプルに汚いコードで、見づらく、メンテナンスがしにくいのでエンジニアからはとても嫌われています。
対策としては、「多用しがち」と同様、フラグを用意してあげたり、別の関数を作ることが効果的です。
どうしても多用・深くなってしまうという場合は、そもそもの設計がおかしいことが多いので安易に組まず、一度設計に戻ってみたほうがスピーディーに開発できます。
入れ子は多くても3つ(「If>If>If」くらい)が限度だと思っておきましょう。
まとめ|条件分岐ができれば立派なプログラム
今回は、プログラムの要でもあるVBAの条件分岐について解説しました。
条件分岐とループができるようになれば、立派なシステムは作れるようになります。
きれいなコードを書くには経験と時間が必要ですが、システムを作って動かすにはそこまで時間・経験は必要ありません。
まずは、自分なりにコードを書いてみて動く原理を理解し、達成感を味わってみてください。
そして、機会があるのであれば有識者のコードを見て勉強してみましょう。