
VBAのSelect Caseとは?条件分岐のためのSelect Caseステートメントの使い方
VBAの条件分岐の方法のひとつ、Select Caseステートメントについて解説します。
IFステートメントと使い分けることでよりスッキリわかりやすいコードにでき、特に分岐の数が多いときのSelect Caseはその威力を発揮してくれます。覚えておいて損はないのでぜひ自分のものにしましょう!
目次
1.条件分岐とは
ある条件を設定して、条件を満たすかによって処理を振り分けることを条件分岐といいます。
条件分岐なくしてプログラミングは成り立ちません。
VBAにおける条件分岐には本記事で紹介するSelect Caseステートメントの他にIFステートメントがあります。
IFステートメントについてはこちらの記事で紹介していますのでよろしければ合わせて読んでみてください。
関連記事2.Select Caseステートメント
2-1.Select Caseの構文
まずは構文を確認しておきましょう。
Select Case 比較対象の値
Case 条件1
条件1の時の処理
Case 条件2
条件2の時の処理
Case Else
いずれの条件にも該当しないときの処理
End Select
Select Caseの後に比較したい値や文字列(変数でも可)を指定して、続くCaseの後には条件とする値とマッチした時の処理を指定します。
これを条件の数だけ書くことで分岐を好きなだけ増やすことができます。Caseの後に条件を書くのは必須ですが条件にマッチした時の処理は省略可能です。(その場合はなにも処理されません)
また、いずれの条件にも該当しない場合の処理はCase Elseに続いて指定することが可能です。※Case Elseは条件、処理とともにそれ自体が省略可能です。
2-2.基本的な使い方
構文がわかったところで基本的な使い方を見ていきましょう。先ほどの構文を参考に以下のソースコードを確認してください。
Dim num As Long num = 2 Select Case num Case 1 Debug.Print "numは1" Case 2 Debug.Print "numは2" Case 3 Debug.Print "numは3" Case Else Debug.Print "numはその他" End Select
Select Caseに続く比較対象の値として2が入った変数numを指定しています。numはCase 2の条件に該当するため結果はそれに続く処理である「numは2」が出力されています。以上が基本的な使い方です。
3.条件指定の方法
条件の書き方は単に値が同じかだけではなく、様々な方法で指定することができます。
3-1.OR条件
Caseに続く条件を複数指定していずれかに該当した場合(OR条件)は条件をカンマ区切りで指定するだけで実現することができます。
Dim num As Long num = 2 Select Case num Case 1, 2, 3 Debug.Print "numは1か2か3" End Select
上記は「numの値が1、2、3のいずれかの場合に処理を行う。」という条件になっています。numの値は2で条件を満たしているので実行結果は以下となります。
3-2.Isで比較
比較対象の値と条件に指定した値を比較するような条件にしたいときはIsキーワードを使います。
Dim num As Long num = 2 Select Case num Case Is > 1 Debug.Print "numは1より大きい" End Select
Caseに続くIsは比較対象の値そのものを指します。よって、上の例では「numが1より大きい場合」という条件になります。num = 2なので、Case Is > 1に該当するときの処理が行われます。(出力結果は省略します)※比較演算子はExcelの関数などと同じように使えますので戸惑うこともないかと思います。
また、Isは条件式の左側にしか使えない点に注意しましょう。例えば上のサンプルコードの場合Case 1 < Isとするとエラーになります。
3-3.Toによる範囲指定
範囲を条件としたい場合はToを使用します。指定したい範囲の最小値と最大値でToを挟みます。
Dim num As Long num = 5 Select Case num Case 1 To 3 Debug.Print "numは1~3" Case 4 To 6 Debug.Print "numは4~6" End Select
サンプルコードでは1~3に当てはまる場合と4~6に当てはまる場合の2つの条件を記載しています。Toによる範囲指定で気を付けることは、必ず「Toの左側に最小値、右側に最大値」となるように記載することです。もし逆にしてしまった場合はエラーにはなりませんが正しく判定されません。このサンプルコードでは、2番目の条件に当てはまるので以下のように出力されます。
3-4.比較対象の値にTrueを使う
ここからは少し応用編です。単純な値同士の比較でない場合(例えば比較したい値が文字列の中の一部の場合)はどうすればいいでしょうか。
Dim str As String str = "ありがとう" Select Case str Case str Like "あ*" Debug.Print "あ、から始まる単語" End Select
しかし、このサンプルコードではなにも処理されません。なぜでしょうか?
上のCaseステートメントで使われているLike演算子は2つの文字列を比較してTrueかfalseを返します。ここでは正規表現で”0文字以上の文字”を表すワイルドカードである「*」を使って、変数strが「あ」から始まる任意の文字列かどうかを判定しています。「ありがとう」は条件にマッチするためTrueとなります。つまり、変数strの中身と条件str Like “あ*”の判定結果はそれぞれ以下のようになります。
変数strの中身:ありがとう(String型の文字列)
str Like “あ*”の判定結果: True(Boolean型)
上記のようにSelect Caseステートメントの「String型のありがとう」に対して、Caseステートメントの条件の値が「Boolean型のTrue」であるので、当然これら2つを比較しても合致しないと判断されます。そのため何も処理が行われないのです。
では2つの値が合致すると判断されるようにするにはどうすればいいでしょうか?このような場合はSelect CaseステートメントにTrueを指定しましょう。
Dim str As String str = "ありがとう" Select Case True Case str Like "あ*" Debug.Print "あ、から始まる単語" End Select
意図したとおりに比較された結果が表示されました。比較対象の値をTrueとすることで「条件式の結果がTrueなら」という意味の内容のCaseステートメントにすることができました。このようにTrueを指定することで単純な値の比較以外にもSelect Caseステートメントを応用することができます。
4.複数の条件を書く際の注意点
Caseステートメントの条件を複数書く際の注意点は、一番初めに合致した条件の処理しか行われないということです。
Dim num As Long num = 20 Select Case num Case 1 To 50 Debug.Print "1番目の条件に合致" Case 10 To 40 Debug.Print "2番目の条件に合致" Case 20 To 30 Debug.Print "3番目の条件に合致" End Select
上記のサンプルコードでは最初の条件が以降の条件を内包しているため、num = 20の場合は1番目~3番目のすべての条件に合致します。
しかし、以下の結果を見てもらえればわかるとおり1番目の条件に合致したことしか表示されません。最初に合致した条件の処理しか行われていないことがわかりますね。そのため、このサンプルコードでは条件に合致する場合は常に同じ結果となります。
5.さいごに
Select Caseステートメントは単純な値の比較や条件が多い場合、IFステートメントよりもコードの見通しが良くできることがあります。
同じ処理結果であってもリーダブルコードの観点にも気を回せるようになれば、人より一歩先行くエンジニアとなれますので、ぜひ身につけてみてください!
コメント