Visual Basic 初級講座 [改訂版] |
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Visual Basic 中学校 > 初級講座[改訂版] >
2020/5/16
この記事が対象とする製品・バージョン
![]() |
Visual Basic 2019 | ◎ | 対象です。 |
![]() |
Visual Basic 2017 | ◎ | 対象です。 |
![]() |
Visual Basic 2015 | ◎ | 対象です。 |
![]() |
Visual Basic 2013 | ◎ | 対象です。 |
![]() |
Visual Basic 2012 | ◎ | 対象です。 |
![]() |
Visual Basic 2010 | ◎ | 対象です。 |
![]() |
Visual Basic 2008 | ◎ | 対象です。 |
![]() |
Visual Basic 2005 | ◎ | 対象です。 |
![]() |
Visual Basic.NET 2003 | △ | 対象外ですがほとんどの説明があてはまるので参考になります。 |
![]() |
Visual Basic.NET (2002) | △ | 対象外ですがほとんどの説明があてはまるので参考になります。 |
![]() |
Visual Basic 6.0 | × | 対象外です。 |
目次
Select Case (読み方:Select=セレクト、Case=ケース)を使うと条件に応じて処理を分岐できます。
機能は If の方が豊富であり、すべてのSelect Caseを If に書き換えることもできます。
その代わり分岐が多い場合はSelect Caseの方が簡単に書けて見やすくなる場合が多いようです。
次の例は TextBox1 に入力されている内容によって表示するメッセージを変える例です。
Select Case TextBox1.Text Case "夏目漱石" MsgBox("代表作は「吾輩は猫である」") Case "森鴎外" MsgBox("代表作は「舞姫」") Case "志賀直哉" MsgBox("代表作は「城の崎にて」") Case "太宰治" MsgBox("代表作は「走れメロス」") Case Else MsgBox("データベースに該当項目がありません。") End Select |
この例では5つの分岐を用意しており、「夏目漱石」を入力してあれば「代表先は「吾輩は猫である」」と表示するといった具合です。
最後のCase Elseは特別で、他のどの条件(Case)にも該当しなかった場合に実行されます。Case Elseを記述しないこともできます。
同じ内容を If で書くと次のようになります。
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句での条件の指定方法は次の詳しく説明します。変数や定数を使うことももちろんできます。
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)以降で使用できます。
Select Caseの構文は以上で全部です。
まとめると次のようになります。
「Case式」という言葉は公式のものではなく、私が便宜上この記事でそう読んでいるだけの名称です。
赤い部分は必ず記述する必要があります。その他の部分、たとえば、Case や Case Elseは必要があるときだけ記述します。
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を使うこともできますが、見にくくなるのでお勧めはしません。
発展学習では意欲的な方のために現段階では特に理解する必要はない項目を解説します。 VBのSelect CaseはC#などC系の言語のswitchに相当しますが、break を省略してフォールスルーしてしまうようなことは絶対に発生しません。デフォルトの動作がbreakであり、デフォルトの動作は変更できないからです。Exit Selectを使うと明示的にブレークできますが、Exit Selectを使わなくても、次のCase句に実行が到達すると自動的にbreakされます。 |
Case句で指定する式は、最初の例のようにずばり値を指定する書き方が多いようです。
カンマで区切ることで複数の値を指定することもできます。
次の例は現在の月によって表示するメッセージを変更する例です。
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までの範囲でランダムな数値を生成させて、結果によって分岐することでこの動作を実現しています。
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はそれとは別物です。
Select Case x Case Is < 30 'x が 30 より小さければ落第です。 MsgBox("落第") Case Is >= 31 'x が 31 以上ならば及第です。 MsgBox("及第") End Select |
Select Case文を入力するときにはVisual Studioの支援機能が使えます。
既に気づかれていると思いますが、「Select Case xxxx」と入力してEnterを押すだけで、CaseとEnd Selectが自動的に入力されます。
※Visual Studioのバージョンによって違うかもしれません。これはVisual Studio 2019で確認しています。
「Select」と入力して TABキーを2回押すとSelect Case文のシンプルな構文が自動的に入力されます。
これはIf文のときにも説明したコードスニペットの機能です。
Visual Studio 2019の場合は、次のような構文が生成されました。Select Caseの要素はそろっているので、ここから変更したり不要な部分を削除したりすればSelect Caseのことを暗記していなくても使うことができます。
Select Case variableName Case 1 Case 2 Case Else End Select |
Select Case xxxx の xxxx が型が列挙体の場合、定義されている値に対応したCase句を自動的に生成してくれる機能もあります。
CheckBoxを例に説明しましょう。
例によってVisual Studioのバージョンによって動作や表示には違いがあります。ここではVisual Studio 2019を例に説明します。
WindowsフォームのCheckBoxコントロールはデフォルトではチェックをつけるかつけないかの2択ですが、ThreeStateプロパティ(読み方:ThreeSTate = スリーステイト)を True にすると、中間段階 が増えて3択になります。
CheckBoxがどのような状態にあるかはCheckStateプロパティ (読み方:CheckState = チェックステイト)でわかります。このプロパティは型は列挙体です。
そこでCheckBoxがどのような状態にあるかSelect Caseで判断するプログラムを書いてみましょう。
はじめはこのように入力すると思います。
Select Case CheckBox1.CheckState |
ここで、Enterをクリックすると、自動入力機能により Case と End Selectが出現し、次のようになります。
Select Case CheckBox1.CheckState Case End Select |
Case句の式が未入力なので、この段階では不完全な(=エラー状態の)Select Caseになっています。
Case句自動生成機能は不完全な状態では使えないので、とりあえずCaseを削除して次のようにしましょう。
Select Case CheckBox1.CheckState End Select |
この状態だと意味のないプログラムですが構文的には間違いがない正しい状態になっています。
ここでCheckStateをクリックすると、コードエディターの左側に電球アイコンが出現します。この電球マークはVisual Studioから何か提案がある場合に表示されます。
電球アイコンをクリックすると、Visual Studioの提案の内容が表示されます。
この例では4つの提案があります。
一番上の提案「欠落しているケースの追加」はCheckStateの列挙体の値に応じてCase句を追加するという提案です。この提案に採用してみましょう。クリックすると実際にプログラムがこの通りになります。
なお、その下にある「既定のケースの追加」という提案はCase Elseを追加する提案です。その下にある「両方を追加する」は列挙型の値に対応したCase句とCase Elseの両方を追加するという提案です。
クリックする代わりに、電球アイコンが表示されているときに Alt + Enter を押すか、 Ctrl + . を押すと、電球の提案内容が表示されます。( . はテンキーではない方です。) 電球アイコンの上にマウスをホバーさせるとキーボードのショットカットを確認できます。 |
上記の提案されているコードには「Exit Select」という命令が含まれています。これは実行がここまで到達するとSelect Case文を抜けて、End Selectの次の行にジャンプルするという命令なのですが、これを書かなくてもCase句に到達すれば自動的にジャンプするので、この命令を使うことは非常に稀です。 たとえば、次のような使い方は少しは意味があります。(でも、このようなことをしたいと思ったことは私は一度もありません。)
|