Select Case 条件分岐 ステートメントの使い方です。
簡単なコード、可読性の向上が特徴です。是非、使い慣れておきましょう。
こんにちは、じゅんぱ店長(@junpa33)です。
今回のテーマは、じゃ無い方の条件分岐ステートメント「Select Case」についてです。
同様機能のステートメントでは、よくご存じの「If・・Then・・Else」があります。
Select Case 条件分岐 ステートメントは、どういった時に使うかというとですが、
厳格に使い分けの区別はありません。
「この場合は、こちらの方が便利か・可読性がいいか」という様な考え方での使い分けになります。
コンテンツ
Select Case 条件分岐 とIfの具体的な使い分け基準
一番メジャーな条件文で「If条件文」がありますが、どう違うのでしょうか。
ズバリ結論的には、
特に
Select Caseは「単独(一つ)の条件対象」を繰り返し判断するときに強みを発揮する!
ということです。
<解説例題>
- 英語の点数が、100点の人、90点以上の人、80点以上の人、70点以上の人、50点以上から69点以下の人、40点以上から49点以下の人、40点未満の人
というような、「単独条件」の場合での多仕訳の条件分岐の時に有効です。
でもこれが、
- 英語の点数が100点で国語の点数が90点以上、英語の点数が90点以上で国語の点数が80点以上、英語の点数が80点で国語の点数が70点以上、・・・
とかになった場合では、同じ多仕訳の条件分岐でも、
「単独(一つ)の条件」の判断ではないので不向きということが言えます。
Select Case 条件分岐 とIfの記述方法の基本的違い
「If条件文」とはどのような記述方法の違いがあるのでしょうか。
Select Case 条件分岐の基本の構文
「Select Case・・・End Select」 の「・・・」の部分に処理コードを記述するブロック形式のステートメントになります。
If条件文のような1行形式(インライン形式)の構文は存在しません。
Select Case 条件判断される変数や値
Case 条件1
条件1を満たした時の処理コード
Case 条件2
条件2を満たした時の処理コード
Case Else
いずれの条件も満たさなかった時の処理コード
End Selec
Select Case 条件分岐 とIfの記述方法の違い
同じ実行結果を導くコードを「If」と「Select Case」で作成してみました。
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
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 条件分岐 ステートメントを使った例題
具体的にどういったコード記述になるのか、例を挙げて説明していきます。
基本(等号式)
基本の記述方法はこのようになります。
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」と変換されます。
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(または)の意味になります。
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」キーワードを使えばどこからどこまでという範囲の指定で条件分岐させることが出来ます。
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コード化するとこのようになります。
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演算子を使って条件分岐を行うことが出来ます。
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ステートメントの入れ子(ネスト)
先の「不等号の条件を使う」の項目の中で、
一文での記述方法では「〇〇より大きく✖✖より小さい」というような閉ざされた範囲での条件指定は不可能 とお話ししました。
今度はネスト構造で、この条件指定の記述を行ってみます。
得点別に段階評価するという例題を考えます。
- 得点90点以上はS判定
- 得点80点以上90点未満はA判定
- 得点70点以上80点未満はB判定
- 得点60点以上70点未満はC判定
- 得点40点以上60点未満はD判定
- 得点40点未満はE判定
の評価を行うものとします。
ちなみに単層構造でこの例題をコード記述するとこのようになります。
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の条件分岐範囲となります。
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 条件分岐 ステートメントの使い方のまとめ
基本、Select Caseステートメントを使う場面は、条件分岐を多項目必要とする「単独の条件対象」であるということです。
コードを簡潔に記述できるので、可読性が高いということです。
条件分岐で「範囲指定」の記述については、簡潔がゆえの条件指定ミスを犯さないように注意しましょう。
「かつ(AND)」を直接記述できないことに注意です。
エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。
エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です今回の記事はここまでです。 最後までご覧いただき有難うございました。
<記事内容についての告知>
VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。
アンケートでポイ活しよう!!
アンケートに答えれば答えるほど ”使える” ポイントがたまります。