制御構文「Select Case~ステートメント」について
「Select Case~ステートメント」の基本
今回は制御構文「Select Case~ステートメント」について解説します。
前回は「If~Else」について解説しましたが、IF文の場合、「ElseIf」で複数の条件式を記述しました。
しかし「Select Case」を使うことで、もっと簡単に複数の条件式を分岐させる事が可能です。
以下にサンプルコードを用意します。
Sub test10()
Dim Num As Integer
Num = 12
Select Case Num
Case 1
MsgBox "Numは1です。"
Case 5
MsgBox "Numは5です。"
Case 10, 12
MsgBox "Numは10か12です。"
Case Else
MsgBox "Numは1・5・10・12以外です。"
End Select
「Select Case」の基本構文は以下の通りです。
Select Case <変数>
Case <値>
<実行したい処理>
Case <値>
<実行したい処理>
Case Else
<実行したい処理>
End Select
それを踏まえてサンプルコードの解説をいたします。
まず変数Numに「10」が代入されています。
そして「Select Case Num」となっており、この構文では変数Numが以下の「Case」にある値と一致するか確認します。
まず最初の「Case 1」は値が「1」のため、Numとは一致しません。
次の「Case 5」も同様に値が「5」のため一致しません。
その次の「Case 10, 12」ですが、これの意味は「10」か「12」という意味です。
Numが「10」のため、この「Case 10, 12」に一致しています。
よってその下の<実行したい処理>「MsgBox “Numは10か12です。”」が実行され、次は「End Select」となり、「Select Case」分は終了です。
これは前回の「ElseIf」と同じですね。
処理は以下の「画像1」の通りになります。
これらはIF文で表現することも可能ですが、Select文を使うことで、可読性(見やすく)記述する事も可能です。
「Select Case~ステートメント」を使った分類判定
極端な話をすれば、SELECT CASE文が無くても、IF文だけで大抵表現する事は可能です。
ただ、可読性や書きやすさという点では優れていると思います。
以下に年齢を「年少人口(0~14歳)」「生産人口(15~64歳)」「高齢人口(65歳以上)」に分類するサンプルコードがあります。
Sub test10a()
Dim Nenrei As Integer
'70歳の人の判定
Nenrei = 70
Select Case Nenrei
Case 0 To 14
MsgBox Nenrei & "歳は年少人口(0~14歳)です。"
Case 15 To 64
MsgBox Nenrei & "歳は生産人口(15~64歳)です。"
Case Is >= 65
MsgBox Nenrei & "歳は高齢人口(65歳以上)です。"
Case Else
MsgBox "判定不能"
End Select
End Sub
変数Nenreiに「70」を代入しているので、70歳の人の年齢判定になります。
今回のコードのCase文を見て下さい。
「Case 0 To 14」「Case 15 To 64」のように「Case <値> To <値>」となってます。
これはそれぞれ、「0~14の間」、「15~64の間」となってます。
この間の数値であれば、年少人口(0~14歳)・生産人口(15~64歳)と判定されます。
次の「Case Is >= 65」はどうでしょうか。
これは「Is <比較演算子> <値>」で65歳以上となっています。
今回はNenreiが「70」なので高齢人口(65歳以上)と判定されます。
「比較演算子」を組み合わせる事で、幅広く判定する事が可能です。
ちなみに、高齢人口(65歳以上)の判定なら「Case 65 To 200」と書いたとしても、200歳以上生きている人間などいないので、間違ってはいません。
しかし、これだとプログラムでは「65歳以上200歳以下」という意味です。
決して間違ってはいないのですが、そもそも「65歳以上200歳以下」なんて表現は使われていませんよね。
同じように、プログラムでも65歳以上を判定するのであれば「Case Is >= 65」と書いた方が望ましいです。
些細な事かもしれませんが、プログラムのバグ(エラー)というは、思わぬ所から発生します。
また算数の基本ですが「Case Is > 65」と書いた場合、65歳より上という条件になるため、今回のサンプルコードでは、65歳の判定ができなくなります。
小さなミスも、大きなシステムでは致命的なバグになる事があるので、今のうちに基本をよく理解してコードを書くよう心掛けましょう。
<補足情報>「Select Case True」という書き方
「Select Case」文では、基本は「Select Case <変数>」と解説しました。
変数ということは、様々な<値>が入ります。
つまり「True」も値なので、「Select Case True」と書くこともできます。
関数「test10a()」を、以下のように「Select Case True」を使って関数「test10b()」に置き換えました。
この2つの関数は同じ判定をします。
SELECT分はIF文で、大抵のものは置き換え可能と説明しましたが、SELECT分だけでも、書き方を変えて同じ実行結果をえる事が可能です。
Sub test10b()
Dim Nenrei As Integer
Nenrei = 64
Select Case True
Case Nenrei <= 14
MsgBox Nenrei & "歳は年少人口(0~14歳)です。"
Case Nenrei >= 15 And Nenrei <= 64
MsgBox Nenrei & "歳は生産人口(15~64歳)です。"
Case Is >= 65
MsgBox Nenrei & "歳は高齢人口(65歳以上)です。"
Case Else
MsgBox "判定不能"
End Select
End Sub