Select Caseブロックは、
If-ElseIf の階段を最適化したものと見なすことができます。大体同じようなやり方で働いています。
標準のSelect Caseは、<式> に標準のデータ型のいずれかを使用できます。そして、特化されている Select Case As Const 形式は、整数値のために最適化されています。
このコードの断片は、一般的な select case の構文を示しています。
式は、通常、標準のデータ型のどれかか、または、型 か 配列 の個々の要素であることができる変数です。
Select Case <式>
Case <リスト>
<命令文>
<命令文>
...
Case Else
<命令文>
<命令文>
...
End Select
Case 命令文の <リスト> 節は、下のいずれかの形式が使えます。
- Case <値>:
値は、サポートしているデータ型の一つか、列挙です。
- Case <値> To <値>:
値の範囲を指定します。
- Case Is <演算子> <値>:
演算子は、論理演算子のいずれかです。
- Case <値>, <値>, ...:
コンマで切り離された値のリスト。
- Case <変数>:
値を含む変数。
下の断片は、これらの異なった形式が、プログラムでどう使われるかを示しています。
Case 47
Case 47 To 59
Case Is > 60
Case 47, 48, 53
Case keycode
Select Case As Const は、0 〜 4097 の範囲の整数式で働くように設計された、Select 命令文の、より速いバージョンです。
Select Case As Const <整数_式>
Case <リスト>
<命令文>
<命令文>
...
Case Else
<命令文>
<命令文>
...
End Select
Select Case As Const のための <リスト> 命令文形式は、値か、値の列挙に制限されます。
すなわち、演算子の式は、Case As Const の中に許容されていません。
Case ブロックが実行されるとき、Case キーワードに続く命令文で次のCaseキーワード(または、End Select)までが、実行されます。
どの場合でも、Case の中の、1つのブロックの命令文だけが、実行されます。
Case Else があると、Else ブロックの中の命令文は、Select命令文の <式> 部分に合致する Case がない場合に、この、Else ブロックの中の命令文が、実行されます。
下のプログラムは、Select Case 命令文ブロックの使例です。
'キー入力の Ascii コード
Dim As Integer keycode
'esc キーが押されるまで、繰返します
Do
keycode = Asc
(Inkey)
Select Case As Const keycode
Case 48 To 57
Print "あなたは数字キーを押しました"
Case 65 To 90
Print "あなたは大文字アルファベットを押しました"
Case 97 To 122
Print "あなたは小文字キーを押しました"
End Select
Sleep 1
Loop Until keycode = 27 '27 は、Escape の ASCII コードです
End
プログラムでは、あなたがキーを押すと、値は、Asc 関数を使って、数に翻訳されます。
これは、いつも 4097 未満の整数値になるので(ASCII 文字コードの範囲は、0 〜 255)、Select Case as Const 形式が使えます。
コンパイラは、実行するブロックを確認するために、Case 範囲に対して、keycode の値をチェックします。
keycode が、特定の範囲に落ちると、Print 命令文が実行されます。そして、プログラムの流れは、End Selectに続く、次の行を続行します。
keycode が、どの Case 範囲にも合致しないと、プログラムは、End Select に続く、次の行を続行します。
Select Case は、通常、If-Elseif の階段から翻訳できます。
これを示すために、上のプログラムは、If-ElseIf の階段を使って、下のように書き変えることができます。
'押したキーの Ascii コード'
Dim As Integer keycode
'esc キーが押されるまで、繰り返します
Do
keycode = Asc
(Inkey)
If (keycode >= 48) And (keycode <= 57) Then
Print "数値キーが押されました"
ElseIf (keycode >= 65) And (keycode <= 90) Then
Print "大文字キーが押されました"
ElseIf (keycode >= 97) And (keycode <= 122) Then
Print "小文字キーが押されました"
End If
Sleep 1
Loop Until keycode = 27 '27 は、Escapeの ASCII コードです
End
2つのプログラムを比較すると、論理は全く同じですが、Select Case は、If-ElseIf の階段より、はるかに読み易く、理解しやすいことが、分かるでしょう。