こんにちは!開発現場で日々、コードの美しさとパフォーマンスを追求している先輩エンジニアです。
Excelのマクロ(VBA)の記録や、決まりきった`If…ElseIf`の長い連鎖を書く段階から一歩抜け出して、「もっとスマートに、もっと読みやすく条件分岐を書きたい!」と思っていませんか?
今回は、VB.NETの`Select Case`文が持つポテンシャルを極限まで引き出し、「範囲指定」や「複数条件のスマートな合わせ技」をマスターするための極意を伝授します。
ここをクリアすれば、あなたの書くVB.NETコードは見違えるほど洗練され、保守性(メンテナンスのしやすさ)が劇的に跳ね上がりますよ。
—
なぜ `If…ElseIf` の嵐はメンテナンス地獄を生むのか?
業務システムの開発現場でよく見かけるのが、以下のようなコードです。
.net
‘ 【アンチパターン】IfのネストやElseIfの嵐
If score >= 80 And score <= 100 Then
grade = "A"
ElseIf score >= 60 And score <= 79 Then
grade = "B"
ElseIf score >= 40 And score <= 59 Then
grade = "C"
Else
grade = "D"
End If
これでも動きますが、条件が増えたり、判定基準が変わったりした途端にバグの温床になります。「比較対象の変数を何度も書かなければならない」「`And`や`Or`の論理演算子がごちゃ混ぜになり、条件漏れ(境界値のミス)が起きやすい」といった欠点があるからです。
ここで登場するのが、VB.NETが誇る洗練された`Select Case`文です。
—
1. `To` 演算子によるスマートな「数値・文字範囲」の指定
`Select Case`の真骨頂の一つが、`To`演算子を用いた範囲指定です。先ほどの成績判定を`Select Case`で書き直してみましょう。
.net
Dim score As Integer = 75
Dim grade As String
Select Case score
Case 80 To 100
grade = “A”
Case 60 To 79
grade = “B”
Case 40 To 59
grade = “C”
Case Else
grade = “D”
End Select
Console.WriteLine($”評価: {grade}”)
ここがプロの知見:
- `80 To 100` のように書くだけで、「80以上かつ100以下(境界値を含む)」の範囲を直感的に表現できます。
- 比較対象の変数(この場合は `score`)を最初の1回しか書く必要がないため、タイポ(打ち間違い)や変数の書き換え漏れが物理的に発生しなくなります。
さらに、この `To` は数値だけでなく文字(String型)に対しても有効です。
.net
Dim rank As Char = “B”c
Select Case rank
Case “A”c To “C”c
Console.WriteLine(“合格圏内です”)
Case “D”c, “E”c
Console.WriteLine(“要再試験です”)
Case Else
Console.WriteLine(“無効なランクです”)
end Select
文字コード順(ASCII順)に基づいた範囲指定ができるのも、VB.NETの強力な特徴です。
—
2. `Is` キーワードで「以上・以下・未満」を自由自在に操る
「範囲と言っても、〇〇未満や、〇〇より大きくだよね?」という現場の要件には、`Is`キーワードを組み合わせます。
.net
Dim temperature As Double = 36.8
Select Case temperature
Case Is < 35.0
Console.WriteLine("低体温の恐れがあります")
Case 35.0 To 37.4
Console.WriteLine("平熱です")
Case Is > 37.5
Console.WriteLine(“発熱しています”)
End Select
ここがプロの知見:
`Case Is < 35.0` のように、`Is` の後に比較演算子( `<`, `>`, `<=`, `>=`, `<>` )を続けることで、`Select Case`の中に柔軟な条件式を埋め込むことができます。
「`Select Case` は単一の値(イコール)しか比較できない」という誤解をしている中級者が非常に多いのですが、この `Is` を使いこなせるかどうかが、VB.NET中級者への分水嶺です。
—
3. カンマ区切りによる「複数条件のまとめ書き」
「この値、または、あの値のどちらかに合致すれば処理したい」というケースは多々ありますよね。VB.NETでは、`Case` の後ろにカンマ(`,`)で複数の値を並べるだけで、スマートにOR条件を表現できます。
.net
Dim dayOfWeek As String = “土”
Select Case dayOfWeek
Case “月”, “火”, “水”, “木”, “金”
Console.WriteLine(“平日です。お仕事頑張りましょう!”)
Case “土”, “日”
Console.WriteLine(“週末です。ゆっくり休んでください。”)
Case Else
Console.WriteLine(“曜日として認識できません。”)
End Select
これだけでもスッキリしますが、さらに応用として、「値のリスト」と「範囲指定」を同じ `Case` の中で混在させることも可能です。
.net
Dim age As Integer = 17
Select Case age
Case 0, 1 C’ 0歳または1歳(乳児)
Case 2 To 6 ‘ 2歳から6歳(幼児)
Console.WriteLine(“未就学児です”)
Case 7 To 18 ‘ 7歳から18歳(児童・生徒)
Console.WriteLine(“学生です”)
Case Else
Console.WriteLine(“成人またはシニアです”)
End Select
(※上の例の `Case 0, 1` のように、処理を書かずに次の `Case` に流す書き方も、条件をまとめるテクニックの一つです)
—
陥りがちな罠:VB.NETの `Select Case` は「上から順に評価される」
ここで、C#の `switch` 文(C# 8.0以降のパターンマッチング等)や他の言語から入った人がハマりやすい、VB.NET特有の重要な仕様に触れておきます。
VB.NETの `Select Case` は、上から順に条件評価を行い、最初に一致(True)した `Case` のブロックを実行した時点で、残りの条件判定をスキップして `Select` 全体を抜けます。
したがって、範囲が重複する条件を上に書いてしまうと、下の条件に到達しなくなるという致命的なバグを生みます。
.net
‘ 【やってはいけない例】
Dim score As Integer = 85
Select Case score
Case Is >= 60 ‘ ← ここが先にヒットしてしまう!
Console.WriteLine(“合格です”)
Case 80 To 100 ‘ ← score=85 なのに、ここは絶対に実行されない
Console.WriteLine(“優秀です!”)
End Select
正しい順序の組み立て方:
条件分岐を記述する際は、「より限定的な条件(狭い範囲や特定の値)」を上に書き、「一般的な条件(広い範囲や `Case Else`)」を下に書くのが鉄則です。
.net
‘ 【正しい例】
Dim score As Integer = 85
Select Case score
Case 80 To 100
Console.WriteLine(“優秀です!”) ‘ こっちが先に評価される
Case Is >= 60
Console.WriteLine(“合格です”)
Case Else
Console.WriteLine(“不合格です”)
End Select
この「上から順に評価される」という挙動の裏側(制御フロー)を意識できるようになると、コードのバグを未然に防ぐ確かな目が養われます。
—
まとめ
今回は、VB.NETの `Select Case` 文を深化させ、実務で即戦力となる範囲指定や複数条件のスマートな書き方を解説しました。
- `To` 演算子で、数値や文字の範囲を美しく指定する。
- `Is` キーワードを組み合わせて、大小比較(以上・以下・未満)をスマートに処理する。
- カンマ(`,`)で複数の値をまとめ、冗長な `Or` を排除する。
- 「上から順に評価される」というライフサイクル上の特性を理解し、条件の順序に気をつける。
これらを意識するだけで、あなたの書くコードの可読性とメンテナンス性は劇的に向上します。現場のエンジニアたちからも「おっ、分かっているな」と一目置かれる存在になるはずです。
ここをクリアすれば、VB.NETの条件分岐はもう怖くありません。ぜひ明日からの開発現場で試してみてくださいね!
