🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

Excel VBA Select Case — 仕組みと、ElseIfではなくこれを使う場面

|

Excel VBA Select Case — 仕組みと、ElseIfではなくこれを使う場面

動作確認: Excel 365 v2509 · Excel 2021 · Excel 2019 · 最終確認 2026-06-05

要点Select Case1つの値を取り、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 ElseSelect 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%」——範囲も境界値も含めてロジックを生成します。無料で試す →

関連ガイド

よくある質問

IfではなくSelect Caseを使うべきなのはいつ? 1つの変数を3通り以上の結果へ振り分けるときです。結果が2通り、または別々の変数を条件にするならIf...ElseIfの方が読みやすい(あえてSelect Case Trueを使う場合は別)。

Select Caseで値の範囲を判定できますか? できます——Case 1 To 10は1から10まで(両端含む)に一致し、範囲・リスト・Is比較を同じブロックで混ぜられます。

なぜSelectCaseが誤った分岐を実行するのですか? 最初に一致したものが勝つからです。広いケースを狭いケースの前に置くと、狭い方が飲み込まれます——狭い順に並べ替えてください。

Select CaseはElseIfより速い? わずかに速いです。値が一度しか評価されないためです。ただし本当の利点は読みやすさで、速度ではありません。