【11】VBAの制御構文「Select Case~ステートメント」について

記事で紹介しているエクセル
・エクセル2019 [64ビット版]

目次

制御構文「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」の通りになります。

画像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
よかったらシェアしてね!
目次
閉じる