Chapter 12 分岐構造 ( Select Case )

イントロダクション コース

テーマ

 第12回目となる本稿のテーマは、「条件分岐を表現する構文の一つである Select Case 文を理解する」です。

 前回の Chapter 11 では条件分岐構文 If について学習しました。本稿ではもう一つの条件分岐構文である Select Case について学習を進めていきます。

 If と比較すると登場の機会は少ないですが、If よりもスマートに記述できるケースもありますので本稿で記述の仕方と動作について学習しましょう。

Select Case

構文

 それでは早速 Select Case の構文を見ていきましょう。

Select Case 評価したい式
Case 値の表現
 「評価したい式」が上の「値の表現」に合致したときに実行する文
 複数の文を記述できます
Case 値の表現
 「評価したい式」が上の「値の表現」に合致したときに実行する文
 複数の文を記述できます
Case Else
 どの Case にも合致しなかったときに実行する文
 複数の文を記述できます
End Select

 少々難しい表現になってしまいましたが、正確性を考慮した結果です。Select Case 評価したい式 とは、この「評価したい式」の評価によってその後の流れを分岐させたいということです。「評価したい式」には当然ながら何らかの式を記述します。ここまで学習してきた皆さんには、コードを示した方が理解しやすいと思いますので早速コードを記述していきましょう。

Case に値を指定する場合

Boolean 型 Case 句

 次のマクロを Sheet1 シートモジュールに作成してください。

Public Sub Chapter12_Select_Case_1()

    Dim bool As Boolean
    Select Case bool
    Case True
        Debug.Print "初期値は True です"
    Case False
        Debug.Print "初期値は False です"
    End Select
    
End Sub

 それでは上記コードを解説します。まず最初の行で bool というBoolean 型変数を宣言しています。 

 そして次の行

Select Case bool

 Select Case の構文をもう一度確認してください。このコードでは「評価したい式」の部分に変数 bool を記述しています。これが意味するところは、「変数 bool が保持している値によってコードの流れを分岐してください」と言う意味になります。

 そして次の 2 行

Case True
    Debug.Print "bool は True です"

 この行は、「 変数 bool の値が True のケースでは、Debug.Print “初期値は True です” を実行してください」という意味になります。

 さらに次の 2 行

Case False
    Debug.Print "bool は False です"

 この行は、「変数 bool の値が False のケースでは、Debug.Print “初期値は False です” を実行してください」という意味になります。

 そして最後の

End Select

 この行は、Select Case の終了を意味しています。(分岐の終了です)

 何はともあれこのマクロを実行してみましょう。イミディエイトウインドウに以下のように表示されます。

初期値は False です

 この結果は予想通りでしたか?一応簡単に説明しておきましょう。

 最初の行で宣言した Boolean 型変数 bool には何も代入していません。そのため変数 bool が保持している値は Boolean 型の初期値である False です。このまま Select Case bool へと進んでいくので

「 変数 bool が保持している値によってコードの流れを分岐してください」という指示を受けます。

 次行へ進み Case True という記述にたどり着き「変数 bool の値が True のケースでは」という指示を受けます。しかし、変数 bool が保持しているのは False ですからこの指示は無視して次の Case へと進み Case False という記述にたどり着きます。ここでは「変数 bool の値が False のケースでは」という指示を受け、そして変数 bool が保持している値はまさに False ですからこの指示に従って、次行の Debug.Print “初期値は False です” を実行します。この時点でイミディエイトウインドウに「 初期値は False です」というテキストが表示されます。最後に End Select へジャンプして Select Case 構文は終了となります。

 流れは大体掴めたでしょうか?大事なポイントは以下の二つです。

Select Case 評価したい式

この記述によって Select Case は開始し、End Select で終了します。

Select Case 評価したい式

この記述のあとは、各 Case 句を上から順番に評価し一致する Case 句を探します。一致した Case 句を見つけたらその下にあるコードを実行します。Case 句にコードが複数行あればそれらをすべて実行します。これを終えたら End Select へとジャンプします。(一致した Case 以外の Case はすべて無視されます)

つまり、「評価したい式」が Case 句の評価と一致すればその Case 句のコードを実行し、一致しなければ次の Case 句へと移り、Case Else まで該当する Case があるか探します。

テキスト型 Case 句

 さて、先ほどの例では「評価したい式」に Boolean 型を指定しましたが、他の型を指定することも可能です。テキスト型変数を使った例も示しておきましょう。

Public Sub Chapter12_Select_Case_2()

    Dim sheetName As String
    sheetName = Me.Name
    
    Select Case sheetName
    Case "Sheet1"
        Debug.Print "このシートは Sheet1 です"
    Case "Sheet2"
        Debug.Print "このシートは Sheet2 です"
    Case Else
        Debug.Print "このシートは Sheet1 でも Sheet2 でもありません"
    End Select
    
End Sub

 このマクロを実行してみましょう。実行結果は以下の通りです。

このシートは Sheet1 です

 Me.Name

このコードは初めて紹介しますね。Me はすでに何度か使用しているので意味はお分かりかと思います。自分自身という意味でしたね。このマクロを記述しているのは Sheet1 シートモジュールですから、Me は Sheet1 シートを意味しています。Name というのはシートの名前のことです。Sheet1 の名前を変更していなければこのシートの名前は Sheet1 ですので、変数 sheetName には “Sheet1” というテキストが代入されます。(ここで言う「シートの名前」とは、Excel 画面の下方にある各シートタブに表示されているテキストです)

続く Select Case sheetName は sheetName の評価によって分岐するのでしたね。

最初の Case “Sheet1” に合致しますので、Debug.Print “このシートは Sheet1 です” このコードが実行され、End Select へとジャンプして終了します。

Case に比較演算子を用いる場合

 次に Case の後ろに比較演算子を用いる場合について説明します。もう一度、構文を確認してください。

 次のマクロを Sheet1 シートモジュールに作成してください。

Public Sub Chapter12_Select_Case_3()

    Dim result As Long
    result = Conversion.Fix(Application.InputBox("テストの点数を入力してください。( 0 点から 100 点)", "テスト結果", Type:=1))
    
    Select Case result
    Case Is >= 80
        Debug.Print "評価:優"
    Case Is >= 70
        Debug.Print "評価:良"
    Case Is >= 60
        Debug.Print "評価:可"
    Case Else
        Debug.Print "評価:不可"
    End Select
    
End Sub

 このマクロは Chapter 11 で If を学習したときに作成したものを Select Case 用に改変したものです。マクロを実行し、テストの点数を入力して成績がどのように評価されるか見てみましょう。

 このように、Case には Is と比較演算子を組み合わせて用いることも出来ます。先に示した例では「評価したい式」が値と一致するという表現を用いた Select Case を紹介しましたが、今回の例では、〇以上、〇未満などの表現を使いました。これが Select Case における二つ目の Case の記述方法となります。

Case に範囲を指定する場合

 最後に、Case の後ろに範囲を記述する方法を紹介します。以下のマクロを Sheet1 シートモジュールに記述してください。

Public Sub Chapter12_Select_Case_4()

    Dim result As Long
    result = Conversion.Fix(Application.InputBox("テストの点数を入力してください。( 0 点から 100 点)", "テスト結果", Type:=1))
    
    Select Case result
    Case 80 To 100
        Debug.Print "評価:優"
    Case 70 To 79
        Debug.Print "評価:良"
    Case 60 To 69
        Debug.Print "評価:可"
    Case Else
        Debug.Print "評価:不可"
    End Select
    
End Sub

 このマクロも点数を評価して成績を示すマクロです。記述の仕方を若干変更してあります。

各 Case の後ろに 数値 To 数値 という形で値の範囲を表現しています。このような方法でも処理を分岐させることができるため、ときに If よりも分かりやすい表現となることがあります。

まとめ

 今回は、分岐構文の一つ Select Case について学習しました。前 Chapter で学習した If と合わせて繰り返し練習してみてください。以下に Select Case のポイントをまとめておきます。

構文は以下の通り

Select Case 評価したい式
Case 値の表現1
 値の表現1 に合致したときに実行する文
Case 値の表現2
 値の表現2 に合致したときに実行する文
Case Else
 いずれの Case にも合致しなかったときに実行する文
End Select

評価したい式は、一度だけ評価されます。

各 Case は上から順番に、評価したい式の結果と合致するか評価されます。

複数の Case が選ばれることはありません。いずれかの Case に合致すれば他の Case は無視されます。

それでは本稿はここで終了です、お疲れさまでした。次回またお会いしましょう。

タイトルとURLをコピーしました