【Excel VBA】Select Case文で条件分岐を見やすく書く方法

スポンサーリンク

「If文の条件分岐、5個も6個も並んでごちゃごちゃ……」

そんな経験、ありませんか? ElseIfを何段にも重ねていくと、コードはどんどん読みづらくなりますよね。修正しようとしても、どこがどの条件なのかパッと見で分からなくなってしまいます。

でも大丈夫です。VBAの Select Case文 を使えば、条件分岐をスッキリ整理できます。この記事では基本構文から実務で使えるコードまで、まとめて解説していきますね。

Select Case文とは?If文との違い

Select Case文は、VBAで 「1つの値に対して複数の条件に分岐する」 ための構文です。

たとえば「テストの点数によってメッセージを変えたい」というとき、If文だとElseIfが何段にもなります。Select Case文なら、条件をスッキリ並べて書けるんです。

Select Caseの基本構文

まずは基本の書き方を見てみましょう。

Sub sample()
    Select Case 条件式
        Case 条件1
            '--- 条件式の結果が条件1に合致したときの処理 ---
        Case 条件2
            '--- 条件式の結果が条件2に合致したときの処理 ---
        Case Else
            '--- どの条件にも合致しなかったときの処理 ---
    End Select
End Sub

仕組みをかんたんに説明すると、こんな流れです。

  1. Select Case の後ろに書いた条件式が評価される
  2. 上から順番にCaseの値と比較していく
  3. 最初に一致したCaseの処理だけが実行される
  4. どのCaseにも一致しなければ Case Else の処理が実行される

条件式には変数を入れてもいいですし、計算式を書くこともできます。文字列・数値・日付など、基本的なデータ型はどれでも使えますよ。

ポイントは「最初に一致したCaseだけ実行される」ということです。他のプログラミング言語ではフォールスルー(次のCaseにも処理が流れる)があるものもありますが、VBAのSelect Caseにはその心配がありません。

If文と比べたメリット

同じ処理をIf文とSelect Caseで書き比べてみましょう。

If文で書いた場合

If 点数 >= 90 Then
    MsgBox "素晴らしい!"
ElseIf 点数 >= 70 Then
    MsgBox "よくできました"
ElseIf 点数 >= 50 Then
    MsgBox "もう少しがんばろう"
Else
    MsgBox "追試です"
End If

Select Caseで書いた場合

Select Case 点数
    Case Is >= 90
        MsgBox "素晴らしい!"
    Case 70 To 89
        MsgBox "よくできました"
    Case 50 To 69
        MsgBox "もう少しがんばろう"
    Case Else
        MsgBox "追試です"
End Select

条件が3つ、4つと増えてくるとSelect Caseの方がかなり読みやすくなります。使い分けの目安は以下のとおりです。

条件の数おすすめの書き方
2つ以下If文で十分
3つ以上Select Caseがスッキリ
条件式が複数の変数にまたがるIf文の方が柔軟

If文の基本的な使い方をまだ学んでいない方は、先にそちらを読んでおくとスムーズに理解できますよ。

Select Caseの条件指定パターン

Select Case文では、Caseの書き方にいくつかのパターンがあります。これを覚えておくと、かなり柔軟な条件分岐ができるようになりますよ。

単一値の指定

もっともシンプルなパターンです。特定の値にぴったり一致したときだけ処理を実行します。

Select Case 曜日
    Case "月"
        MsgBox "週の始まりです"
    Case "金"
        MsgBox "もうすぐ週末です"
    Case "土", "日"
        MsgBox "お休みです"
End Select

文字列でも数値でも、同じ書き方で使えます。

範囲指定(To)

「この値からこの値まで」という範囲を指定するには To を使います。

Select Case 年齢
    Case 0 To 12
        MsgBox "子供料金"
    Case 13 To 17
        MsgBox "学生料金"
    Case 18 To 64
        MsgBox "大人料金"
    Case Is >= 65
        MsgBox "シニア料金"
End Select

To の左側に小さい値、右側に大きい値を書くのがルールです。逆にすると正しく動作しないので注意してくださいね。

比較演算子(Is)

「○○以上」「○○以下」といった比較には Is キーワードを使います。

Select Case 売上
    Case Is >= 1000000
        MsgBox "目標達成!"
    Case Is >= 500000
        MsgBox "あと少し!"
    Case Else
        MsgBox "がんばりましょう"
End Select

ちなみに、Caseの後に <= 9 のように比較演算子だけ書いても、VBAが自動的に Is を補完してくれます。なので忘れても大丈夫ですが、最初から書いておいた方がコードの意図が明確になりますよ。

複数条件の組み合わせ(カンマ区切り)

1つのCaseに複数の条件を書きたいときは、カンマ で区切ります。To や Is と組み合わせることも可能です。

Select Case 月
    Case 3, 4, 5
        MsgBox "春です"
    Case 6, 7, 8
        MsgBox "夏です"
    Case 9, 10, 11
        MsgBox "秋です"
    Case 12, 1, 2
        MsgBox "冬です"
End Select

Case 1 To 4, 7 To 9, 11, 13 のように、範囲指定と単一値をまとめて書くこともできます。複雑に見えますが、「カンマで区切れば何でもOR条件にできる」と覚えておけばOKです。

条件指定パターンを表にまとめておきましょう。

パターン書き方の例意味
単一値Case 1010に一致
複数値Case 1, 3, 51か3か5に一致
範囲Case 1 To 101から10の範囲
比較演算子Case Is >= 100100以上
組み合わせCase 1 To 5, 10, Is >= 201~5、10、20以上のいずれか

コピペで動く基本コード

ここからは、実際にコピペして動かせるコードを紹介していきます。VBE(Visual Basic Editor)を開いて、標準モジュールに貼り付けてみてください。

VBEの開き方は Alt + F11 キーを押すだけです。開発タブが表示されていない場合でも、このショートカットキーなら直接開けます。標準モジュールは「挿入」メニューから「標準モジュール」を選んで追加してくださいね。

テストの点数で分岐する例

Sub テスト判定()
    Dim 点数 As Long '点数を入れる変数
    点数 = InputBox("点数を入力してください")

    Select Case 点数
        Case Is <= 30
            MsgBox "追試です......がんばりましょう"
        Case 31 To 49
            MsgBox "もう少しで合格です!"
        Case 50 To 70
            MsgBox "合格!油断せずにいきましょう"
        Case 71 To 99
            MsgBox "素晴らしい結果です!"
        Case 100
            MsgBox "満点!パーフェクトです!"
        Case Else
            MsgBox "正しい点数を入力してください"
    End Select
End Sub

コードの解説

処理の流れを順番に見ていきましょう。

  1. InputBox でユーザーに点数を入力してもらう
  2. 入力された値が 点数 変数に代入される
  3. Select Case 点数 で分岐処理が始まる
  4. 上から順にCase条件と照合していく
  5. 一致したCaseのメッセージが表示される
  6. 想定外の値(負の数など)は Case Else で処理する

Case Else を入れておくと、想定外の入力があっても処理が止まりません。実務ではエラー防止のために、Case Elseは常に書いておく のがおすすめです。

実務で使えるSelect Caseコード

基本を押さえたところで、実際の業務で使えるコードを見ていきましょう。

部署コードに応じてシート名を返す

たとえば、売上データの部署コードに応じて処理先のシートを切り替えるケースです。

Sub 部署振り分け()
    Dim i As Long         '行カウンター
    Dim lastRow As Long   '最終行
    Dim 部署コード As String  '判定対象
    Dim 振り分け先 As String  '出力する部署名

    lastRow = Cells(Rows.Count, 1).End(xlUp).Row '最終行を取得

    For i = 2 To lastRow
        部署コード = Cells(i, 1).Value

        Select Case 部署コード
            Case "A01", "A02"
                振り分け先 = "営業部"
            Case "B01", "B02", "B03"
                振り分け先 = "経理部"
            Case "C01"
                振り分け先 = "人事部"
            Case Else
                振り分け先 = "その他"
        End Select

        Cells(i, 2).Value = 振り分け先
    Next i

    MsgBox "振り分け完了!"
End Sub

このコードでは、For文によるループ処理と組み合わせて、A列の部署コードを1行ずつ判定しています。最終行の取得を使っているので、データ件数が変わっても自動で対応できますよ。

Select Case Trueで複雑な条件を整理する

実は、Select Caseには少し変わった使い方があります。Select Case True と書くと、各Caseに条件式そのものを書けるんです。

Sub 在庫アラート()
    Dim 在庫数 As Long  '現在の在庫数
    Dim 単価 As Long    '商品単価

    在庫数 = Range("B2").Value
    単価 = Range("C2").Value

    Select Case True
        Case 在庫数 = 0
            MsgBox "在庫切れです!至急発注してください"
        Case 在庫数 <= 10 And 単価 >= 5000
            MsgBox "高額商品の在庫が少なくなっています"
        Case 在庫数 <= 10
            MsgBox "在庫が少なくなっています"
        Case Else
            MsgBox "在庫は十分です"
    End Select
End Sub

Select Case True では、各Caseの条件式が True になるかどうかで分岐します。複数の変数を組み合わせた条件も書けるので、If文の代わりに使うことで見通しの良いコードになります。

ちょっとむずかしく見えますが、やっていることはシンプルです。「Trueに一致するCase = 条件式がTrueになるCase」を上から探しているだけです。

よくあるエラーと対処法

Select Case文を使っていて遭遇しやすいエラーをまとめました。

Case Elseの書き忘れ

Case Elseを省略しても構文エラーにはなりません。ただし、どのCaseにも一致しない値が来たとき、何の処理も実行されずに素通り してしまいます。

'--- 悪い例:Case Elseがない ---
Select Case ステータス
    Case "完了"
        '--- 完了処理 ---
    Case "進行中"
        '--- 進行中の処理 ---
End Select
'→ 「未着手」が来ると何も起きない!

バグの原因になりやすいので、特に実務コードでは必ず Case Else を書いて、想定外の値をキャッチするようにしましょう。

型の不一致エラー

Select Caseの条件式が数値なのに、Caseに文字列を指定してしまうと、意図どおりに動作しません。

Dim 数値 As Long
数値 = 10

'--- 悪い例:数値なのに文字列で比較している ---
Select Case 数値
    Case "10"   '← 文字列の"10"
        MsgBox "一致"  'ここには来ない!
End Select

変数の型とCaseの値の型を揃えるのがポイントです。セルの値を使うときは、CLng()CStr() で明示的に型変換しておくと安心ですよ。

エラーパターンを表にまとめます。

エラー内容原因対処法
処理が実行されないCase Elseがなく、一致するCaseもないCase Elseを必ず書く
型の不一致条件式とCaseの値の型が違うCLng()やCStr()で型を揃える
「End Select に対応する Select がありません」Select Case と End Select の対応漏れインデントを整えて対応を確認
Toの範囲が動かない小さい値 To 大きい値の順になっていない左に小さい値、右に大きい値を書く

マクロを保存するときは、ファイル形式を 「Excelマクロ有効ブック(.xlsm)」 にするのを忘れないでください。通常の .xlsx で保存すると、書いたマクロが消えてしまいます。

まとめ

この記事では、VBAのSelect Case文について基本から実務活用まで解説しました。

ポイントをおさらいしておきましょう。

  • Select Case文は 「1つの値に対して複数条件に分岐」 したいときに最適
  • 条件指定は 単一値・To(範囲)・Is(比較)・カンマ(複数) の4パターン
  • Case Else は省略せずに必ず書く(想定外の値のキャッチ)
  • Select Case True を使えば、複数変数にまたがる複雑な条件分岐もスッキリ書ける
  • 条件が3つ以上ならSelect Case、2つ以下ならIf文が使いやすい

Select Caseをうまく使えると、コードの見通しがぐっと良くなります。まずはこの記事のサンプルコードをコピーして動かしてみてください。自分で書いて動かしてみると、理解が深まりますよ。

条件分岐をマスターしたら、次はFor文でのループ処理Like演算子でのパターンマッチングにも挑戦してみてくださいね。

タイトルとURLをコピーしました