Visual Basic 初級講座 [改訂版]
VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

第12回 条件判断 Select Case

2020/5/16

この記事が対象とする製品・バージョン (バージョンの確認方法)

VB2019 Visual Basic 2019 対象です。
VB2017 Visual Basic 2017 対象です。
VB2015 Visual Basic 2015 対象です。
VB2013 Visual Basic 2013 対象です。
VB2012 Visual Basic 2012 対象です。
VB2010 Visual Basic 2010 対象です。
VB2008 Visual Basic 2008 対象です。
VB2005 Visual Basic 2005 対象です。
VB.NET 2003 Visual Basic.NET 2003 対象外ですがほとんどの説明があてはまるので参考になります。
VB.NET 2002 Visual Basic.NET (2002) 対象外ですがほとんどの説明があてはまるので参考になります。
VB6対応 Visual Basic 6.0 × 対象外です。

 

目次

 

1.Select Caseの概要

Select Case (読み方:Select=セレクト、Case=ケース)を使うと条件に応じて処理を分岐できます。

機能は If の方が豊富であり、すべてのSelect Caseを If に書き換えることもできます。

その代わり分岐が多い場合はSelect Caseの方が簡単に書けて見やすくなる場合が多いようです。

 

次の例は TextBox1 に入力されている内容によって表示するメッセージを変える例です。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Select Case TextBox1.Text
    Case "夏目漱石"
        MsgBox("代表作は「吾輩は猫である」")
    Case "森鴎外"
        MsgBox("代表作は「舞姫」")
    Case "志賀直哉"
        MsgBox("代表作は「城の崎にて」")
    Case "太宰治"
        MsgBox("代表作は「走れメロス」")
    Case Else
        MsgBox("データベースに該当項目がありません。")
End Select

この例では5つの分岐を用意しており、「夏目漱石」を入力してあれば「代表先は「吾輩は猫である」」と表示するといった具合です。

最後のCase Elseは特別で、他のどの条件(Case)にも該当しなかった場合に実行されます。Case Elseを記述しないこともできます。

同じ内容を If で書くと次のようになります。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

If TextBox1.Text = "夏目漱石" Then
    MsgBox("代表作は「吾輩は猫である」")
ElseIf TextBox1.Text = "森鴎外" Then
    MsgBox("代表作は「舞姫」")
ElseIf TextBox1.Text = "志賀直哉" Then
    MsgBox("代表作は「城の崎にて」")
ElseIf TextBox1.Text = "太宰治" Then
    MsgBox("代表作は「走れメロス」")
Else
    MsgBox("データベースに該当項目がありません。")
End If

どちらが見やすいかは感性の問題ですが、Ifの方は条件ごとに毎回 TextBox1.Text = と書いているのに対し、Select Caseの方は先頭に1回 TextBox1.Text と書いているだけなのでこのケースではSelect Caseの方が好まれる場合が多いと思います。

こういったCase句での条件の指定方法は次の詳しく説明します。変数や定数を使うことももちろんできます。

VB2015 VB2017 VB2019

Dim birthDay As Date = #6/27/2008#
Dim japan As New Globalization.JapaneseCalendar

Const Meiji As Integer = 1
Const Taisho As Integer = 2
Const Showa As Integer = 3
Const Heisei As Integer = 4
Const Reiwa As Integer = 5

Dim eraName As String = ""

Select Case japan.GetEra(birthDay)
    Case Meiji
        eraName = "明治"
    Case Taisho
        eraName = "大正"
    Case Showa
        eraName = "昭和"
    Case Heisei
        eraName = "平成"
    Case Reiwa
        eraName = "令和"
End Select

MsgBox($"{eraName}に生まれたんですね。")

この例は最後の行で $ からはじまる文字列補間機能を使っているのでVB2015以上のアイコン表示にしましたが、それ以外はVB.NET(2002)以降で使用できます。

 

2.Select Case の書き方

2-1.構文

Select Caseの構文は以上で全部です。

まとめると次のようになります。

「Case式」という言葉は公式のものではなく、私が便宜上この記事でそう読んでいるだけの名称です。

赤い部分は必ず記述する必要があります。その他の部分、たとえば、Case や Case Elseは必要があるときだけ記述します。

VB6 VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Select Case 条件

     Case Case式1

        条件がCase式1に合致する場合に実行する処理 

    Case Case式2

        条件がCase式2に合致する場合に実行する処理 

    Case Else

        どのCase式にも条件が合致しなかった場合に実行する処理 

End Select

Case句はいくつでも記述することができます。

上に記述したCase句から順番に評価され、最初に条件に合致したCase句だけが実行されます。

条件に合致するCase句が複数ある場合でもその中で一番上にあるものだけが実行されます。

一番最後には必ずEnd Selectを記述します。

 

Select CaseのCase句の中でさらにSelect Caseを使うこともできますが、見にくくなるのでお勧めはしません。

発展 発展学習  -  他の言語のプログラマー向け。switchとの違い

発展学習では意欲的な方のために現段階では特に理解する必要はない項目を解説します。

VBのSelect CaseはC#などC系の言語のswitchに相当しますが、break を省略してフォールスルーしてしまうようなことは絶対に発生しません。デフォルトの動作がbreakであり、デフォルトの動作は変更できないからです。Exit Selectを使うと明示的にブレークできますが、Exit Selectを使わなくても、次のCase句に実行が到達すると自動的にbreakされます。

 

 

2-2.Case式

複数の条件

Case句で指定する式は、最初の例のようにずばり値を指定する書き方が多いようです。

カンマで区切ることで複数の値を指定することもできます。

次の例は現在の月によって表示するメッセージを変更する例です。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Select Case Now.Month
    Case 3, 4, 5
        MsgBox("春ですね。")
    Case 6, 7, 8
        MsgBox("夏なんです。")
    Case 9, 10, 11
        MsgBox("もう秋です。")
    Case 12, 1, 2
        MsgBox("冬が来ました。")
End Select

 

範囲

To を使って範囲を指定することもできます。

次の例は3%の確率で大吉、47%が吉、47%が凶、3%が大凶と表示されます。

RandomクラスのNextメソッドを使って1から100までの範囲でランダムな数値を生成させて、結果によって分岐することでこの動作を実現しています。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Dim r As New Random

Select Case r.Next(1, 101)
    Case 1 To 3
        MsgBox("大吉", vbCritical)
    Case 4 To 50
        MsgBox("吉", vbInformation)
    Case 50 To 97
        MsgBox("凶", vbExclamation)
    Case 98 To 100
        MsgBox("大凶", vbCritical)
End Select

 

以上、以下、より大きい、より小さい

Is を使って、○○以上、△△以下、□□より大きい、××より小さい というCase式を書けます。

Is は以前参照を比較する比較演算子として説明していますが、このIsはそれとは別物です。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Select Case x
    Case Is < 30
        'x が 30 より小さければ落第です。
        MsgBox("落第")
    Case Is >= 31
        'x が 31 以上ならば及第です。
        MsgBox("及第")
End Select

 

 

3.Visual Studio の支援機能

3-1.自動入力

Select Case文を入力するときにはVisual Studioの支援機能が使えます。

既に気づかれていると思いますが、「Select Case xxxx」と入力してEnterを押すだけで、CaseとEnd Selectが自動的に入力されます。

※Visual Studioのバージョンによって違うかもしれません。これはVisual Studio 2019で確認しています。

 

3-2.コードスニペット

「Select」と入力して TABキーを2回押すとSelect Case文のシンプルな構文が自動的に入力されます。

これはIf文のときにも説明したコードスニペットの機能です。

Visual Studio 2019の場合は、次のような構文が生成されました。Select Caseの要素はそろっているので、ここから変更したり不要な部分を削除したりすればSelect Caseのことを暗記していなくても使うことができます。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Select Case variableName
    Case 1

    Case 2

    Case Else

End Select

 

3-3.Case句の自動生成

Select Case xxxx の xxxx が型が列挙体の場合、定義されている値に対応したCase句を自動的に生成してくれる機能もあります。

CheckBoxを例に説明しましょう。

例によってVisual Studioのバージョンによって動作や表示には違いがあります。ここではVisual Studio 2019を例に説明します。

 

WindowsフォームのCheckBoxコントロールはデフォルトではチェックをつけるかつけないかの2択ですが、ThreeStateプロパティ(読み方:ThreeSTate = スリーステイト)を True にすると、中間段階 が増えて3択になります。

CheckBoxがどのような状態にあるかはCheckStateプロパティ (読み方:CheckState = チェックステイト)でわかります。このプロパティは型は列挙体です。

そこでCheckBoxがどのような状態にあるかSelect Caseで判断するプログラムを書いてみましょう。

はじめはこのように入力すると思います。

 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Select Case CheckBox1.CheckState

ここで、Enterをクリックすると、自動入力機能により Case と End Selectが出現し、次のようになります。

 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Select Case CheckBox1.CheckState
    Case
End Select

Case句の式が未入力なので、この段階では不完全な(=エラー状態の)Select Caseになっています。

Case句自動生成機能は不完全な状態では使えないので、とりあえずCaseを削除して次のようにしましょう。

 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Select Case CheckBox1.CheckState
   
End Select

この状態だと意味のないプログラムですが構文的には間違いがない正しい状態になっています。

ここでCheckStateをクリックすると、コードエディターの左側に電球アイコンが出現します。この電球マークはVisual Studioから何か提案がある場合に表示されます。

電球アイコンをクリックすると、Visual Studioの提案の内容が表示されます。

この例では4つの提案があります。

一番上の提案「欠落しているケースの追加」はCheckStateの列挙体の値に応じてCase句を追加するという提案です。この提案に採用してみましょう。クリックすると実際にプログラムがこの通りになります。

なお、その下にある「既定のケースの追加」という提案はCase Elseを追加する提案です。その下にある「両方を追加する」は列挙型の値に対応したCase句とCase Elseの両方を追加するという提案です。

 

操作方法 キーボードの操作

クリックする代わりに、電球アイコンが表示されているときに Alt + Enter を押すか、 Ctrl + . を押すと、電球の提案内容が表示されます。( . はテンキーではない方です。)

電球アイコンの上にマウスをホバーさせるとキーボードのショットカットを確認できます。

 

メモ メモ  -  Exit Select

上記の提案されているコードには「Exit Select」という命令が含まれています。これは実行がここまで到達するとSelect Case文を抜けて、End Selectの次の行にジャンプルするという命令なのですが、これを書かなくてもCase句に到達すれば自動的にジャンプするので、この命令を使うことは非常に稀です。

たとえば、次のような使い方は少しは意味があります。(でも、このようなことをしたいと思ったことは私は一度もありません。)

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Select Case xxx
    Case 1
        If yyy Then
            Exit Select
        End If
        DoSomething1
    Case 2
        DoSomething2
    Case Else
        DoSomething3
End Select