【Excel VBA入門】Select Case文の使い方。複数条件をスッキリ書く!
こんにちは、業務自動化ツール開発担当の吉池(@valmore_myoshi)です。
VBAで条件分岐の数が多いときどうしてますか?もちろんIf文で書くこともできますが、Select Case文を使えばもっと簡単に書けるようになります。
本記事では、Select Case文の書き方をはじめ、If文との使い分けも解説するので、この機会にSelect Case文をマスターしちゃいましょう!
目次
Select Case文とは
Select Case文は複数の条件にあわせて処理を分けられる条件分岐の一つです。基本的な書き方は下記の通り。Select Caseに比較したい値を指定し、続くCaseに条件を書きます。
Select Case 比較する値
Case 条件1
条件1を満たしたときの処理
Case 条件2
条件2を満たしたときの処理
Case Else
いずれの条件も満たさなかったときの処理
End Select
条件の書き方は複数ありますが、まずはシンプルに値を指定する方法を見ていきましょう。下記の例では、変数morningに文字列「朝」を代入し、条件と比較しています。条件には朝、昼、夜の文字列が指定されており、いずれかの値と一致すればあいさつ文が出力されます。
Dim morning As String
morning = "朝"
Select Case morning
Case "朝"
Debug.Print "おはようございます!"
Case "昼"
Debug.Print "こんにちは!"
Case "夜"
Debug.Print "こんばんは!"
Case Else
Debug.Print "Zzz..."
End Select

複数の値と比較するときの書き方
条件には複数の値を指定することもできます。カンマで値を区切れば、いずれかの値と一致した場合に直下の処理が実行されます。
例えば、1から9までの数字を偶数と奇数に分ける場合を考えてみましょう。偶数と奇数のグループに数字を分けて条件に設定すると下記のように書けます。
Dim num As Integer
num = 5
Select Case num
Case 1, 3, 5, 7, 9
Debug.Print num & "は奇数です"
Case 2, 4, 6, 8
Debug.Print num & "は偶数です"
Case Else
Debug.Print "1から9までの値を指定してください"
End Select

指定した範囲内に含まれるかはToを使う
特定の範囲内に含まれているかを指定するにはToを使います。下限値と上限値を設定して、比較する値がその範囲内に含まれていれば直下の処理が実行されます。
例として、年齢の範囲をいくつか指定し、年齢区分を出力するプログラムを書いてみます。
Dim age As Integer
age = 28
Select Case age
Case 0 To 18
Debug.Print age & "歳はこどもです"
Case 19 To 65
Debug.Print age & "歳は大人です"
Case 66 To 100
Debug.Print age & "歳はシニアです"
Case Else
Debug.Print age & "歳以上の人はセンテナリアンと呼びます"
End Select

値の大小を比較するときはIsを使う
値の大小を比較したいときはIs演算子を使います。Is演算子を比較する値と置き換えて、比較演算子で条件を指定します。
例えば、温度を比較し、水の状態変化を出力するプログラムは下記のように書きます。
Dim temperature As Integer
temperature = 105
Select Case temperature
Case Is <= 0
Debug.Print temperature & "度で水は固体です"
Case Is >= 100
Debug.Print temperature & "度で水は気体です"
Case Else
Debug.Print temperature & "度で水は液体です"
End Select

最初に一致した条件のみ適用されることに注意!
Select Case文を使っているとたまに混乱するのがCaseに設定した複数の条件に合致してしまう場合です。
下記の例では数値にあわせて処理を分けていますが、Caseに設定したすべての条件を満たしています。複数の条件を満たしている場合は、最初に合致した条件のみ適用されることに注意してください。
今回の場合、最初の条件(Is > 30)に合致しているので「30以上です」が出力されます。
Dim num As Integer
num = 55
Select Case num
Case Is > 30
Debug.Print num & "は30以上です"
Case Is > 40
Debug.Print num & "は40以上です"
Case Is > 50
Debug.Print num & "は50以上です"
Case Else
Debug.Print num & "は30未満です"
End Select

If文とSelect Case文の使い分け
条件分岐の書き方にはSelect Case文のほかにもIf文があります。じゃあどちらを使えばいいの?と疑問に思うかもしれませんが、要は使い分けです。
If文は条件分岐をシンプルに書けますが、分岐が増えてくるとコードが見づらくなってきます。一方、Select Case文は複数の条件分岐を見やすく記述できるのが特徴。そのため、分岐が少ないときはIf文、多いときはSelect Case文を使うのがオススメです!
下記は同じ処理をIf文とSelect Case文で書いた例です。どちらのコードが見やすいでしょうか?
Dim age As Integer
age = 28
' If文で書いた場合は冗長...
If age >= 0 And age <= 18 Then
Debug.Print age & "歳はこどもです"
ElseIf age >= 19 And age <= 65 Then
Debug.Print age & "歳は大人です"
ElseIf age >= 66 And age <= 100 Then
Debug.Print age & "歳はシニアです"
Else
Debug.Print age & "歳以上の人はセンテナリアンと呼びます"
End If
' Select Case文で書いたほうがスッキリ!
Select Case age
Case 0 To 18
Debug.Print age & "歳はこどもです"
Case 19 To 65
Debug.Print age & "歳は大人です"
Case 66 To 100
Debug.Print age & "歳はシニアです"
Case Else
Debug.Print age & "歳以上の人はセンテナリアンと呼びます"
End Select
If文について詳しく知りたい方はこちら!
【Excel VBA入門】If文の使い方を解説!条件の書き方をコード例で学ぶ
まとめ
複数の条件分岐をスッキリ書けるSelect Case文の基本を解説しました。条件分岐の使用頻度でいえばIf文が圧倒的に上ですが、分岐が増えてきたときにSelect Case文を使えれば可読性の高いコードを書けます。
なんか条件分岐書きづらいな…と思ったときにSelect Case文のことを思い出してあげてください。いろいろな書き方ができれば、それだけ表現の幅が広がります!
