「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
仕組みをかんたんに説明すると、こんな流れです。
Select Caseの後ろに書いた条件式が評価される- 上から順番にCaseの値と比較していく
- 最初に一致したCaseの処理だけが実行される
- どの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 10 | 10に一致 |
| 複数値 | Case 1, 3, 5 | 1か3か5に一致 |
| 範囲 | Case 1 To 10 | 1から10の範囲 |
| 比較演算子 | Case Is >= 100 | 100以上 |
| 組み合わせ | Case 1 To 5, 10, Is >= 20 | 1~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
コードの解説
処理の流れを順番に見ていきましょう。
InputBoxでユーザーに点数を入力してもらう- 入力された値が
点数変数に代入される Select Case 点数で分岐処理が始まる- 上から順にCase条件と照合していく
- 一致したCaseのメッセージが表示される
- 想定外の値(負の数など)は
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演算子でのパターンマッチングにも挑戦してみてくださいね。
