Select Case 条件分岐の使い方。ステートメントの基本

vbaselectcaseeyecatch

Select Case 条件分岐 ステートメントの使い方です。
簡単なコード、可読性の向上が特徴です。是非、使い慣れておきましょう。

こんにちは、じゅんぱ店長(@junpa33)です。

今回のテーマは、じゃ無い方の条件分岐ステートメント「Select Case」についてです。

同様機能のステートメントでは、よくご存じの「If・・Then・・Else」があります。

Select Case 条件分岐 ステートメントは、どういった時に使うかというとですが、

厳格に使い分けの区別はありません。

「この場合は、こちらの方が便利か・可読性がいいか」という様な考え方での使い分けになります。

Select Case 条件分岐 とIfの具体的な使い分け基準

vbaselectcasep001

一番メジャーな条件文で「If条件文」がありますが、どう違うのでしょうか。

ズバリ結論的には、

特に

Select Caseは「単独(一つ)の条件対象」を繰り返し判断するときに強みを発揮する!

ということです。

<解説例題>

  • 英語の点数が、100点の人、90点以上の人、80点以上の人、70点以上の人、50点以上から69点以下の人、40点以上から49点以下の人、40点未満の人

というような、「単独条件」の場合での多仕訳の条件分岐の時に有効です。

でもこれが、

  • 英語の点数が100点で国語の点数が90点以上、英語の点数が90点以上で国語の点数が80点以上、英語の点数が80点で国語の点数が70点以上、・・・

とかになった場合では、同じ多仕訳の条件分岐でも、

「単独(一つ)の条件」の判断ではないので不向きということが言えます。

Select Case 条件分岐 とIfの記述方法の基本的違い

vbaselectcasep002

「If条件文」とはどのような記述方法の違いがあるのでしょうか。

Select Case 条件分岐の基本の構文

「Select Case・・・End Select」 の「・・・」の部分に処理コードを記述するブロック形式のステートメントになります。

If条件文のような1行形式(インライン形式)の構文は存在しません。

Select Caseの構文

Select Case 条件判断される変数や値
  Case 条件1
    条件1を満たした時の処理コード
  Case 条件2
    条件2を満たした時の処理コード
  Case Else
    いずれの条件も満たさなかった時の処理コード
End Selec

Select Case 条件分岐 とIfの記述方法の違い

同じ実行結果を導くコードを「If」と「Select Case」で作成してみました。

VBA
Option Explicit

Sub 構文比較1a()
        If Range("A1").Value < 5 Then
            Range("B1").Value = "5未満だよ"
        ElseIf Range("A1").Value = 5 Then
            Range("B1").Value = "ジャスト5です"
        ElseIf Range("A1").Value > 5 Then
            Range("B1").Value = "5よりデカいです"
        Else
        End If
End Sub

VBA
Sub 構文比較1b()
        Select Case Range("A1").Value
            Case Is < 5
                Range("B1").Value = "5未満だよ"
            Case 5
                Range("B1").Value = "ジャスト5です"
            Case Is > 5
                Range("B1").Value = "5よりデカいです"
            Case Else
        End Select
End Sub

このように「Select Case」の構文は、条件分岐の記述方法がかなり簡潔になっています。

Select Case 条件分岐 ステートメントを使った例題

vbaselectcasep003

具体的にどういったコード記述になるのか、例を挙げて説明していきます。

基本(等号式)

基本の記述方法はこのようになります。

VBA
Sub 構文比較1d()
        Select Case Range("A1").Value
            Case 5
                Range("B1").Value = "ジャスト5です"
            Case 7
                Range("B1").Value = "ジャスト7です"
            Case Else
        End Select
End Sub

Caseのところで「=5」や「=7」と打ち込むと自動的に「Is = 5」,「Is = 7」と変換されます。

VBA
Sub 構文比較1e()
        Select Case Range("A1").Value
            Case Is = 5
                Range("B1").Value = "ジャスト5です"
            Case Is = 7
                Range("B1").Value = "ジャスト7です"
            Case Else
        End Select
End Sub

Or(または)の条件を使う

複数の条件を「,」(カンマ)で区切ると、Or(または)の意味になります。

VBA
Sub 構文比較2()
        Select Case Range("A1").Value
            Case "月", "水", "金"
                Range("B1").Value = "午前学習日です"
            Case "火", "木", "土"
                Range("B1").Value = "午後学習日です"
            Case Else
                Range("B1").Value = "安息日です"
        End Select
End Sub

To(範囲指定)の条件を使う

「To」キーワードを使えばどこからどこまでという範囲の指定で条件分岐させることが出来ます。

VBA
Sub 構文比較3()
        Select Case Range("A1").Value
            Case 0 To 5
                Range("B1").Value = "5才まで"
            Case 6 To 8
                Range("B1").Value = "6才から8才"
            Case 9 To 10
                Range("B1").Value = "9才から10才"
            Case Else
        End Select
End Sub

不等号の条件を使う

「不等号」使っての範囲指定で条件分岐させることが出来ます。

ちなみに<解説例題>で示したお題をSelect CaseでVBAコード化するとこのようになります。

解説例題
VBA
Sub 解説例題()
        Select Case Range("A1").Value
            Case Is <= 39
                Range("B1").Value = "39点以下"
            Case Is <= 49
                Range("B1").Value = "40点から49点以下"
            Case Is <= 69
                Range("B1").Value = "50点から69点以下"
            Case Is <= 79
                Range("B1").Value = "70点から79点以下"
            Case Is <= 89
                Range("B1").Value = "80点から89点以下"
            Case Is <= 99
                Range("B1").Value = "90点から99点以下"
            Case 100
                Range("B1").Value = "100点満点です"
        End Select
End Sub

注意しましょう!

「5より大きく10より小さい」という意味で、下のように記述しようとしても、

コードの実行内容は、「『5よりも大きい』か または『10よりも小さい』」という意味になります。

Case Is > 5, Is < 10

比較演算子で、「Case・・・」文の中では、一文で「〇〇より大きく✖✖より小さい」という表現は出来ないと、覚えておきましょう。

ワイルドカードの条件を使う

Like演算子を使って条件分岐を行うことが出来ます。

VBA
Sub 構文比較5()
        Select Case True
            Case Range("A1").Value Like "大*"
                Range("B1").Value = "大阪府ですね"
            Case Range("A1").Value Like "京*"
                Range("B1").Value = "京都府ですね"
            Case Range("A1").Value Like "兵*"
                Range("B1").Value = "兵庫県ですね"
            Case Range("A1").Value Like "奈*"
                Range("B1").Value = "奈良県ですね"
            Case Range("A1").Value Like "滋*"
                Range("B1").Value = "滋賀県ですね"
            Case Range("A1").Value Like "和*"
                Range("B1").Value = "和歌山県ですね"
            Case Else
                Range("B1").Value = "近畿圏外ですね"
        End Select
End Sub

Select Caseステートメントの入れ子(ネスト)

vbaselectcasep004

先の「不等号の条件を使う」の項目の中で、

一文での記述方法では「〇〇より大きく✖✖より小さい」というような閉ざされた範囲での条件指定は不可能 とお話ししました。

今度はネスト構造で、この条件指定の記述を行ってみます。

得点別に段階評価するという例題を考えます。

  • 得点90点以上はS判定
  • 得点80点以上90点未満はA判定
  • 得点70点以上80点未満はB判定
  • 得点60点以上70点未満はC判定
  • 得点40点以上60点未満はD判定
  • 得点40点未満はE判定

の評価を行うものとします。

ちなみに単層構造でこの例題をコード記述するとこのようになります。

VBA
Sub 構文比較6()
        Select Case Range("A1").Value
            Case Is < 40
                Range("B1").Value = "E判定"
            Case Is < 60
                Range("B1").Value = "D判定"
            Case Is < 70
                Range("B1").Value = "C判定"
            Case Is < 80
                Range("B1").Value = "B判定"
            Case Is < 90
                Range("B1").Value = "A判定"
            Case Is <= 100
                Range("B1").Value = "S判定"
        End Select
End Sub
閉鎖された範囲指定の方法

「If条件文」で記述すると、

If Range(“A!”).Value >= 40 And Range(“A!”).Value < 60 Then

となるIfの一文を

Select Caseでは、

Case Is < 40
  Range(“B1”).Value = “E判定”
Case Is < 60
  Range(“B1”).Value = “D判定”

という風に表現するということになります。

Select Case の入れ子(ネスト)

この例題を文字通りに、Select Caseステートメントの入れ子(ネスト)構造で(ムリムリ)記述します。

それぞれのカラーマーカーの行範囲が、それぞれのSelect Caseの条件分岐範囲となります。

VBA
Sub 構文比較4()
    Select Case Range("A1").Value
        Case Is < 40
            Range("B1").Value = "E判定"
        Case Is >= 40
            Select Case Range("A1").Value
                Case Is < 60
                    Range("B1").Value = "D判定"
                Case Is >= 60
                    Select Case Range("A1").Value
                        Case Is < 70
                            Range("B1").Value = "C判定"
                        Case Is >= 70
                            Select Case Range("A1").Value
                                Case Is < 80
                                    Range("B1").Value = "B判定"
                                Case Is >= 80
                                    Select Case Range("A1").Value
                                        Case Is < 90
                                            Range("B1").Value = "A判定"
                                        Case Else
                                            Range("B1").Value = "S判定"
                                    End Select
                            End Select
                     End Select
            End Select
    End Select
End Sub

5層構造のネストになりました。

Select Caseステートメントは単独条件しか記述できませんので、

ネストにする場合、行数の多い構造になってしまいます。

If文やWith文ほどネストには向いていないことが分かります。

Select Case 条件分岐 ステートメントの使い方のまとめ

vbaselectcasep005

基本、Select Caseステートメントを使う場面は、条件分岐を多項目必要とする「単独の条件対象」であるということです。

コードを簡潔に記述できるので、可読性が高いということです。

条件分岐で「範囲指定」の記述については、簡潔がゆえの条件指定ミスを犯さないように注意しましょう。

「かつ(AND)」を直接記述できないことに注意です。

エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。

vbastudyeyecatch2 エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です

今回の記事はここまでです。   最後までご覧いただき有難うございました。

エクセルVBA最速理解で必要な知識を集めよう!

エクセルVBA業務ツールで日常の業務改善を行いましょう。

<記事内容についての告知>VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。