よく利用される条件分岐のselect case文(以下select文)について解説します。
select文の使い方
select文は指定した条件に一致した場合に処理を行う条件分岐です。
書式は下記の通り。
Sub test()
Dim x As Long
x = 1
Select Case x //変数名を指定する
Case Is = 1 //変数xが1だったら処理を実行
処理
Case 1 to 3 //変数の値が1~3の間
処理
Case Else //一致する条件がなかったら実行
処理
End Select
End Sub
白・・・コード
紫・・・コメント
青・・・プロシージャの宣言
その他・・・コードを見やすくするために使うかも
select文は複数の条件に一致する場合でも最初の一つに一致した場合は処理を抜ける。
上記のコードでは Case Is = 1 と Case 1 to 3 でどちらも条件には一致しているが、最初に判定される前者の処理のみ実行して処理を終了する。
Select Case文で複数の条件に一致する場合には、最初に一致した条件のみ適応されて処理が行われます。その為、後続の条件にも一致したとしても処理は行われませんので注意しましょう。
複数条件を指定する(Or)
Select文ではCaseで指定する条件式を(,)カンマで区切ることで複数指定することができます。
複数条件を指定したサンプル
Sub test()
Dim x As Long
x = 7
Select Case x
Case Is 1, 2
MsgBox "変数xの値は1もしくは2です"
Case Is 5,6,7
MsgBox "変数xの値は5~7の間です"
End Select
End Sub
上記の実行結果は変数の値が7の為、条件に一致する “変数xの値は5~7の間です”がメッセージボックス似て出力されます。
Isで値の大小を比較する
ISを利用することで比較する条件を指定することができます。また、複数の条件を指定したい場合には前述したカンマを使用した複数条件の指定を行うこともできます。
Isを利用したサンプル
Sub test()
Dim x As Long
x = 7
Select Case x
Case Is >= 5, Is <= 10
MsgBox "変数xの値は5以上、10以下です"
Case Is >= 10
MsgBox "変数xの値は10以上です"
End Select
End Sub
また、Is =を省略して記載することも可能
Case Is = 1
Case 1
上記はどちらも同じ意味になる。
範囲を指定して比較する(To)
Toを利用することで範囲を指定を行うことができます。
構文
Case 最小値 To 最大値
Toを利用したサンプル
Sub test()
Dim x As Long
x = 7
Select Case x
Case 5 To 10
MsgBox "変数xの値は5以上、10以下です"
Case 11 To 20
MsgBox "変数xの値は11以上、20以下です"
End Select
End Sub
xの値が7の為、一つ目の条件式に一致します。ですのでメッセージボックスには”変数xの値は5以上、10以下です”と出力されます。
Like演算子を使用したあいまい検索(ワイルドカード)
文字列を検索する際にはワイルドカードを使用したあいまい検索を行いたい場合があります。その際の記述方法は以下となります。
構文
Select Case True
Case 変数 Like "*文字列"
処理
End Select
あいまい検索を行うにはワイルドカードを利用します。
ワイルドカードの種類は以下の2つです。
- (_)アンダーバー ⇒ 任意の1文字を表すワイルドカード
- (*)アスタリスク ⇒ 文字数の制限のないワイルドカード
文字数を制限するかしないかで使い分けを行うことができ、ワイルドカードを付ける位置によって文字列の後か前のどちらにあいまい検索を行うかを指定できます。
あいまい検索のサンプル
Sub test()
Dim dog As String
dog = "秋田犬"
Select Case True
Case dog Like "_犬"
MsgBox "_は任意の1文字を表すワイルドカードです"
Case dog Like "*犬"
MsgBox "*は文字数の制限はありません"
End Select
End Sub
これまでの構文と異なり注意点が2つあります。
- Select Caseの後が変数名ではなくTrueとなる
- Case式に変数名が必要
ワイルドカードの詳細な使用方法については以下の記事を参照してください
If文で代用することができる
Select Case文は同じ条件分岐を行うIf文と同じ処理を実装することができます。下記のサンプルコードは同じ条件を適応できるそれぞれの構文です。
select文
Sub selectTest()
Dim x As Long
x = 1
Select Case x
Case 1
Debug.Print x
End Select
End Sub
If文
Sub ifTest()
Dim x As Long
x = 1
If x = 1 Then
Debug.Print x
End If
End Sub
どちらも変数xの値が1だったら変数の値を出力する処理を行っています。
Select Case文とIf文の使い分け
どちらも同じような条件式を実装できますが、そうすると『どちらを使用すればよいのか?』という疑問が出ると思います。
ですが、こちらを使うという明確な答えはありません。要するに好みの問題です。
Select文を使うケース
- プロジェクトのツールではIf文よりSelect文を利用している
- 個人的にSelect文の方がコードを読みやすいetc
If文を使うケース
- プロジェクトのツールではSelect文よりIf文を利用している
- 個人的にIf文の方がコードを読みやすいetc
どちらも同じ理由です。ただし、複雑な条件式を記述する場合には例外もあります。
下記のサンプルコードを確認してください。こちらはとあるテストの点数を判定するコードだと考えてください。
判定するテストの点数は70点と仮定します。その点数に対して指定した点数の範囲に応じたコメントをしていきます。
If文のサンプル
Sub test()
x = 70
If x >= 0 And x <= 30 Then
MsgBox x & "赤点です"
ElseIf x >= 31 And x <= 60 Then
MsgBox x & "平均を目指しましょう"
ElseIf x >= 61 And x <= 80 Then
MsgBox x & "平均点です"
Else
MsgBox x & "とても優秀です"
End If
End Sub
Select文
Sub test()
Dim x As Long
x = 70
Select Case x
Case 0 To 30
MsgBox x & "赤点です"
Case 31 To 60
MsgBox x & "平均を目指しましょう"
Case 61 To 80
MsgBox x & "平均点です"
Case Else
MsgBox x & "とても優秀です"
End Select
End Sub
どちらも条件としてま全く同じ処理を行いますが、条件式が複雑になるほど一般的にはSelect文の方がスッキリとしている印象です。
そのため、上記のようなケースで複数条件の条件分岐を記述する際にはIf文よりもSelect文の方が好まれる場合があります。
このようにプロジェクトのルールや記述した際の可読性を考慮して双方の条件式を使い分けすることが重要です。
ほかの人が読んだときに読みやすいと思われるような記述を心がけましょう。