動作確認: Excel 365 v2509 · Excel 2021 · Excel 2019 · 最終確認 2026-06-05
要点 — Select Caseは1つの値を取り、1つの結果へ振り分けます。コピーして調整してください。
Sub 評価する()
Dim score As Long
score = Range("A1").Value
Select Case score
Case Is >= 90: Range("B1").Value = "A"
Case 75 To 89: Range("B1").Value = "B"
Case 60 To 74: Range("B1").Value = "C"
Case Else: Range("B1").Value = "不合格"
End Select
End Sub
ただし、スニペットが本質ではありません。たいていの解説は10通りの書き方を並べ、いつSelect Caseが正解なのかは読者任せにします。ここではまず心智モデルを渡します——誰も見せなかったケースも自分で判断できるように。
核心の考え方: Select Case は「振り分け」であって、チェックリストではない
If...ElseIfはチェックリストです。独立した Yes/No の問いを順に並べ——これか? いいえ… あれか? いいえ…——各問いは別々の変数を見てかまいません。
Select Caseは振り分けです。1つの値を取り、出口を順に見て、最初に合った出口へつなぎます。どのCaseも、同じ入力に対する行き先候補です。
この1つの違いがすべてを教えてくれます。
- 同じ変数・多くの出口 → 振り分け。
Select Case。 - 別々の変数・本当に独立した問い → チェックリスト。
If...ElseIf。
もしElseIf score = 1 … ElseIf score = 2 … ElseIf score = 3と書いているなら、チェックリストの部品で振り分けを作ってしまっています。それが切り替えの合図です。
あらゆるバグを説明するルール: 最初に一致したものが勝つ
VBAは値を一度だけ評価し、各Caseを上から下へ試し、最初の一致で止まります。このルールを体に入れれば、定番のバグは謎でなくなります。
' バグ: 100未満は2行目に決して届かない
Select Case score
Case Is < 100: grade = "要確認"
Case Is < 50: grade = "危機的" ' ← デッドコード
End Select
Case Is < 100がすでに50未満をすべて飲み込むため、「危機的」の出口には決して届きません。直し方は新しいキーワードではなく、順序です。最も狭いケースを先に:
Select Case score
Case Is < 50: grade = "危機的"
Case Is < 100: grade = "要確認"
End Select
「Select Caseが逆のことをする」という質問のほとんどは、このルールが噛みついているだけです。概念そのものがデバッグ指南なのです。
振り分けの合わせ方——4種類の出口
照合の書き方は一度覚えれば済みます。それぞれ出口の形が違うだけで、すべて同じブロックに同居できます。
完全一致とリスト——1つの出口に複数のラベル:
Select Case country
Case "フランス", "ドイツ", "イタリア": region = "ヨーロッパ"
Case "日本", "韓国", "中国": region = "アジア"
Case Else: region = "その他"
End Select
Toによる範囲——段階や区分の主力:
Select Case 注文額
Case 0 To 99.99: 割引 = 0
Case 100 To 499.99: 割引 = 0.05
Case Else: 割引 = 0.1
End Select
Isによる比較——範囲で表せないとき(>・<・>=・<=・<>)。Isは必須で、むき出しのCase score > 5はコンパイルできません。
自由に混在——同じブロックで混ぜられる柔軟さこそ、ElseIfの連鎖が腐る場面でもSelect Caseが破綻しない理由です:
Select Case score
Case 0, 1, 2: rating = "不良" ' リスト
Case 3 To 6: rating = "普通" ' 範囲
Case Is >= 7: rating = "良好" ' 比較
End Select
非常口: Select Case True
これが、Select Caseを分かっている人と、ただ使っている人を分ける一手です。条件が別々の変数にまたがるとき、普通ならネストしたIfに戻ります。戻らないでください。判定式をTrueにすれば、各Caseが完全な真偽式になります:
Select Case True
Case age < 18 And hasGuardian: fare = "こども"
Case age >= 65: fare = "シニア"
Case isStudent And age < 26: fare = "学生"
Case Else: fare = "おとな"
End Select
これは、複数変数のロジックを平らで読みやすく保つVBAの定石です——振り分けが単一変数の枠を超える唯一の場面です。Ifのピラミッドに手を伸ばす前に、こちらを使ってください。
Select Caseを使うべきでないとき
たいていの解説が避ける、正直な線引きです。
- 結果が2通り?
If...Elseを。Caseが1つ+Case ElseのSelect Caseは儀式にすぎません。 - 分岐ごとに条件が1つ、しかも全部別々の変数? それはチェックリスト——
If...ElseIfの方が読みやすい(あえてSelect Case Trueの見た目を選ぶ場合は別)。 - 同じ変数で3通り以上? 迷わず
Select Case。 ここでまだElseIfを書いているなら、次の読み手(多くは半年後の自分)に余計な苦労をさせています。
速度は脚注です——判定式は一度しか評価されません——が、選ぶ理由は読みやすさであって、マイクロ秒ではありません。
よくあるエラー——すべてモデルの帰結
- 誤ったケースが動く/デッドな分岐。 またも最初の一致。狭い順から並べます。
Case score > 5がコンパイルできない。 むき出しの比較は不可。Case Is > 5と書きます。- 文字列照合が大文字小文字で失敗。
Select Caseは既定で区別します。Option Compare Textをモジュール冒頭に置くか、Select Case LCase(country)で正規化します。
ある段階を超えたら、分岐ロジックは手書きすべきではない
Select Caseは1つの値を振り分けるのに適した道具です——しかしルールそのものが変わり続けるなら(新しい段階、新しい区分、新しい境界値)、変更のたびにコードをテストし直すことになります。ExcelMaster Agent は、コードを書く代わりにルールを述べさせます——「A列を区分けして。100未満は割引なし、100〜499は5%、500以上は10%」——範囲も境界値も含めてロジックを生成します。無料で試す →
関連ガイド
- Excel VBAのIf Then Else文 — チェックリストが正しい形のとき
- Excel VBA Forループ — 8つの実例
- Excel VBA Whileループ — While・Do While・Do Untilの違い
よくある質問
IfではなくSelect Caseを使うべきなのはいつ?
1つの変数を3通り以上の結果へ振り分けるときです。結果が2通り、または別々の変数を条件にするならIf...ElseIfの方が読みやすい(あえてSelect Case Trueを使う場合は別)。
Select Caseで値の範囲を判定できますか?
できます——Case 1 To 10は1から10まで(両端含む)に一致し、範囲・リスト・Is比較を同じブロックで混ぜられます。
なぜSelectCaseが誤った分岐を実行するのですか? 最初に一致したものが勝つからです。広いケースを狭いケースの前に置くと、狭い方が飲み込まれます——狭い順に並べ替えてください。
Select CaseはElseIfより速い? わずかに速いです。値が一度しか評価されないためです。ただし本当の利点は読みやすさで、速度ではありません。
