条件分岐の見通しをスッキリ。VBAのSelect Caseステートメントの基本

条件分岐の見通しをスッキリ。VBAのSelect Caseステートメントの基本

のかな

のかな

開発エンジニア/Java4年/ボールド歴4年

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の条件に該当するため結果はそれに続く処理である「num2」が出力されています。以上が基本的な使い方です。


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の値が123のいずれかの場合に処理を行う。」という条件になっています。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は比較対象の値そのものを指します。よって、上の例では「num1より大きい場合」という条件になります。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

サンプルコードでは13に当てはまる場合と46に当てはまる場合の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つの文字列を比較してTruefalseを返します。ここでは正規表現で”0文字以上の文字を表すワイルドカードである「*」を使って、変数strが「あ」から始まる任意の文字列かどうかを判定しています。「ありがとう」は条件にマッチするためTrueとなります。つまり、変数strの中身と条件str Like “*”の判定結果はそれぞれ以下のようになります。

変数strの中身:ありがとう(String型の文字列)

str Like “あ*”の判定結果: TrueBoolean型)

上記のように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ステートメントよりもコードの見通しが良くできることがあります。

同じ処理結果であってもリーダブルコードの観点にも気を回せるようになれば、人より一歩先行くエンジニアとなれますので、ぜひ身につけてみてください!

私たちは、全てのエンジニアに市場価値を高め自身の望む理想のキャリアを歩んでいただきたいと考えています。もし、今あなたが転職を検討しているのであればこちらの記事をご一読ください。理想のキャリアを実現するためのヒントが見つかるはずです。

『技術力』と『人間力』を高め市場価値の高いエンジニアを目指しませんか?

私たちは「技術力」だけでなく「人間力」の向上をもって遙かに高い水準の成果を出し、関わる全ての人々に感動を与え続ける集団でありたいと考えています。

高い水準で仕事を進めていただくためにも、弊社では次のような環境を用意しています。

  • 定年までIT業界で働くためのスキル(技術力、人間力)が身につく支援
  • 「給与が上がらない」を解消する6ヶ月に1度の明確な人事評価制度
  • 平均残業時間17時間!毎週の稼動確認を徹底しているから実現できる働きやすい環境

現在、株式会社ボールドでは「キャリア採用」のエントリーを受付中です。

まずは以下のボタンより弊社の紹介をご覧いただき、あなたの望むキャリアビジョンをエントリーフォームより詳しくお聞かせください。

コメント

公式アカウントLINE限定!ボールドの内定確率が分かる無料診断実施中
公式アカウントLINE限定!
ボールドの内定確率が分かる無料診断実施中