【2026年7月最新】VBA Select Caseで複数条件分岐を完全マスター|Or・To・Is・Likeの使い方を業務で徹底解説
この記事の内容
「VBAでIf文を何重にも書いてコードが読みにくくなってしまった」「Select Caseは聞いたことがあるが、OrやToをどう使えばいいか分からない」——Excelマクロを書き続けると、こうした条件分岐の壁にぶつかります。Select Caseは、複数の条件分岐をシンプルで読みやすい構造で書けるVBAの強力な構文です。特に「この値が何番のコードか」「この数値はどのランクか」「このセルの内容はどのカテゴリか」といった多分岐処理で、If文よりも圧倒的にスッキリしたコードになります。
この記事では、VBAのSelect Case文を完全に解説します。基本的な構文の書き方から、カンマを使ったOR条件・Toキーワードでの範囲指定・Is演算子での比較・Likeによるパターンマッチング・Case Elseのデフォルト処理・業務での実践活用まで、コード例とともに体系的に整理していきます。
この記事を最後まで読むと、次のことが分かります。
01 SELECT CASE BASICS Select CaseとIf文の使い分け どちらを選ぶべきかの判断基準と、Select Caseが圧倒的に有利な場面
VBAの条件分岐構文はIf文とSelect Caseの2種類があります。どちらでも同じ処理を書けますが、「1つの変数・式の値によって複数の処理を切り替えたい」ケースでは、Select Caseの方がコードが読みやすく、保守も容易になります。一方、「複数の条件が複雑に絡み合う場合」「同じ変数でない異なる条件を組み合わせる場合」はIf文が適しています。
| 観点 | If文 | Select Case |
|---|---|---|
| 適している場面 | 複数の異なる変数・複合条件・範囲の広い条件 | 1つの変数・式の値で分岐する多分岐処理 |
| 可読性 | 条件が多いと読みにくい(ElseIfが増える) | 条件が多くても縦に並ぶため読みやすい |
| 保守性 | 条件追加時にElseIfを挿入し直す必要がある | 新しいCaseを追加するだけでよい |
| パフォーマンス | 上から順に評価(条件が後ろほど遅い) | 式を1回評価して分岐(効率的) |
| 柔軟性 | 任意の条件式が書ける(高い) | 1つの式との比較のみ(低い) |
実務での判断基準を一言で言うと、「比較対象が1つの変数・式で、分岐が3つ以上あるか」でSelect Caseを選びます。たとえば「status変数の値が"未処理"・"処理中"・"完了"・"キャンセル"のどれかによって処理を変える」ような場合は、If/ElseIfを4つ書くよりSelect Caseで書く方が圧倒的にスッキリします。逆に「AがTrueかつBがFalseの場合」のような複合条件はIf文一択です。
📚 用語解説
Select Case文:VBAの多分岐制御構文。1つの変数や式の値を評価し、一致するCaseのブロックを実行します。「Select Case 式」で始まり、複数の「Case 値:処理」ブロックが続き、「End Select」で終わります。Javaのswitch文・Pythonのmatch文に相当します。
1変数・1式?
Yes→Select Case
No→If文
3つ以上?
Yes→Select Case優位
No→If文でも同程度
比較が主体?
Yes→Select Case
複合条件→If文
or If文
を選択
02 SYNTAX Select Caseの基本構文 Case・Case Else・End Selectの書き方と実行の流れ
Select Caseの基本構文は「Select Case 式」で始まり、複数の「Case 値」ブロックが続き、「End Select」で閉じます。VBAはSelect Caseブロックを上から順に評価し、最初に条件が一致したCaseのブロックを実行してEnd Selectに進みます。一致するCaseが1つも見つからない場合は、「Case Else」ブロックが実行されます。
' Select Caseの基本構文
Sub SampleSelectCase()
Dim status As String
status = Cells(2, 1).Value ' A2セルの値を取得
Select Case status
Case "未処理"
Cells(2, 2).Value = "要対応"
Cells(2, 2).Interior.Color = RGB(255, 200, 200) ' 赤背景
Case "処理中"
Cells(2, 2).Value = "進行中"
Cells(2, 2).Interior.Color = RGB(255, 255, 200) ' 黄背景
Case "完了"
Cells(2, 2).Value = "終了"
Cells(2, 2).Interior.Color = RGB(200, 255, 200) ' 緑背景
Case Else
' 上記以外の値
Cells(2, 2).Value = "不明なステータス"
Cells(2, 2).Interior.Color = RGB(220, 220, 220) ' グレー背景
End Select
End Sub
2-1. 実行の流れを理解する
Select Caseは「式を1回評価→上から順にCaseと比較→最初に一致したCaseのブロックを実行→End Selectへジャンプ」という流れで動きます。JavaやCのswitch文にあるような「breakを忘れると次のCaseへ落ちる(フォールスルー)」現象はVBAのSelect Caseにはありません。VBAでは1つのCaseに一致すると自動的にそのブロックだけが実行され、次のCaseには移りません。複数のCaseに同じ処理を割り当てたい場合は、後述するカンマ(OR条件)で複数値を1つのCaseにまとめます。
' Case Elseがない場合の動作確認
Sub TestNoElse()
Dim score As Integer
score = 75
Select Case score
Case 90 To 100
MsgBox "優"
Case 70 To 89
MsgBox "良" ' ← これが実行される(scoreが75のため)
Case 60 To 69
MsgBox "可"
' Case Elseなし → 60未満の場合は何も起きない
End Select
' フォールスルーなし:上記の"良"だけが表示される
MsgBox "処理完了" ' ← このMsgBoxは必ず実行される
End Sub
どのCaseにも一致しない場合に何もしなくていいケースではCase Elseを省略できます。ただし「想定外の値が来たときに気づけない」リスクがあります。業務マクロでは、Case Else内にMsgBoxでエラーメッセージを出す、またはログを書き出す処理を入れておくと、データの異常に早期に気づけます。
03 COMMA OR カンマで複数値(OR条件)を指定する 複数の値を1つのCaseにまとめるシンプルな書き方
1つのCaseブロックで複数の値のどれかに一致した場合に同じ処理を実行したいとき、値をカンマで区切って並べます。「Case "A", "B", "C"」と書くと、値がA・B・Cのどれかに一致すれば同じCaseブロックが実行されます。If文で「If x = "A" Or x = "B" Or x = "C"」と書くのと同じ意味で、Select Caseのほうが格段に読みやすくなります。
' カンマでOR条件を指定する例
Sub CategorizeByDepartment()
Dim dept As String
dept = Cells(ActiveCell.Row, 3).Value ' C列の部署名
Select Case dept
Case "営業部", "営業1課", "営業2課", "営業企画室"
' 営業系は全て同じ処理
Cells(ActiveCell.Row, 4).Value = "営業グループ"
Case "経理部", "財務部", "会計課"
' 経理・財務系
Cells(ActiveCell.Row, 4).Value = "財務グループ"
Case "総務部", "人事部", "法務部"
' バックオフィス系
Cells(ActiveCell.Row, 4).Value = "管理グループ"
Case "開発部", "IT部", "システム部"
' 技術系
Cells(ActiveCell.Row, 4).Value = "技術グループ"
Case Else
Cells(ActiveCell.Row, 4).Value = "その他"
End Select
End Sub
3-1. 数値・日付のOR条件
カンマ区切りのOR条件は文字列だけでなく、数値・日付にも使えます。「Case 1, 3, 5, 7, 9, 11」のように奇数かどうかを判定したり、「Case #2024/1/1#, #2024/7/1#」のように特定の日付を一括指定したりできます。業務では「特定の月・曜日・コードの集合」に対して同じ処理を適用したいケースが多く、このパターンが重宝します。
' 数値のOR条件とビジネスロジック
Sub CalcTax()
Dim categoryCode As Integer
categoryCode = Cells(ActiveCell.Row, 2).Value ' 商品カテゴリコード
Dim taxRate As Double
Select Case categoryCode
Case 1, 2, 3 ' 食料品(軽減税率)
taxRate = 0.08
Case 4, 5 ' 日用品(標準)
taxRate = 0.10
Case 6, 7, 8 ' 贅沢品(標準)
taxRate = 0.10
Case Else
taxRate = 0.10 ' デフォルト
End Select
Cells(ActiveCell.Row, 5).Value = Cells(ActiveCell.Row, 3).Value * taxRate
End Sub
04 TO RANGE Toキーワードで範囲指定する 数値・文字列の連続範囲を簡潔に指定する方法
Toキーワードを使うと、「〇〇以上△△以下」という範囲条件をSelect Caseで簡潔に書けます。「Case 1 To 10」で1〜10の整数すべてにマッチする条件になります。If文で「If x >= 1 And x <= 10 Then」と書くのと同じ意味ですが、Select CaseのToを使う方が格段に読みやすく、複数の範囲をCase-Caseで並べても整然と見えます。
' Toキーワードで範囲指定する例
Sub ScoreToGrade()
Dim score As Integer
score = Cells(2, 2).Value ' B2の点数
Dim grade As String
Select Case score
Case 90 To 100
grade = "S(優秀)"
Case 80 To 89
grade = "A(優)"
Case 70 To 79
grade = "B(良)"
Case 60 To 69
grade = "C(可)"
Case 0 To 59
grade = "D(不可)"
Case Else
grade = "入力エラー(0〜100の範囲外)"
End Select
Cells(2, 3).Value = grade
End Sub
📚 用語解説
Toキーワード(Select Case内):Select Case文のCaseで「最小値 To 最大値」と書くと、その範囲内の全ての値にマッチします。Case 1 To 10は「1以上10以下」、Case "A" To "E"は辞書順でA〜Eの文字列にマッチします。範囲は「最小値 To 最大値」の順で書く必要があり、逆に書くと正しく動作しません(Case 10 To 1はどの値にも一致しない)。
4-1. 文字列の範囲指定
Toキーワードは文字列にも使えます。「Case "A" To "M"」と書くと、辞書順でA〜Mの範囲にある文字列(1文字の場合)にマッチします。都道府県コード・都道府県名・アルファベット分類など、文字列の辞書順で処理を分岐したい場合に使えます。ただし文字列範囲の比較はバイナリ比較(大文字小文字の区別あり)で行われるため、大文字・小文字・全角・半角が混在するデータでは注意が必要です。
' 都道府県コードの地域分類(To範囲指定)
Sub ClassifyByRegion()
Dim prefCode As Integer
prefCode = Cells(ActiveCell.Row, 1).Value ' 都道府県コード(1〜47)
Dim region As String
Select Case prefCode
Case 1 ' 北海道
region = "北海道"
Case 2 To 7 ' 青森〜福島
region = "東北"
Case 8 To 14 ' 茨城〜神奈川
region = "関東"
Case 15 To 23 ' 新潟〜愛知
region = "中部"
Case 24 To 30 ' 三重〜兵庫(含む大阪、京都)
region = "近畿"
Case 31 To 35 ' 鳥取〜山口
region = "中国"
Case 36 To 39 ' 徳島〜高知
region = "四国"
Case 40 To 47 ' 福岡〜沖縄
region = "九州・沖縄"
Case Else
region = "コードエラー"
End Select
Cells(ActiveCell.Row, 2).Value = region
End Sub
Case 1, 3 To 5, 7のように、カンマと Toを同一のCase内で組み合わせることができます。「1または3から5の範囲または7」という条件です。複雑に見えますが、カンマで区切られた各条件(1、3 To 5、7)がOR評価されると理解すれば分かりやすいです。
05 IS OPERATOR Isで比較演算子(大小・不等号)を使う Case Is > 100 など比較演算子をSelect Caseに組み込む方法
Isキーワードを使うと、Select Case内で「>(大なり)」「<(小なり)」「>=(以上)」「<=(以下)」「<>(不等号)」などの比較演算子を使った条件が書けます。「Case Is > 100」で「値が100より大きい」場合にマッチする条件になります。Toキーワードが「A以上B以下」という両端指定に向いているのに対し、Isは「〇〇より大きい」「〇〇以上」のような片端指定に向いています。
' Isで比較演算子を使う例
Sub ClassifyAmount()
Dim amount As Long
amount = Cells(ActiveCell.Row, 3).Value ' 金額
Dim category As String
Select Case amount
Case Is >= 10000000 ' 1000万円以上
category = "大口顧客"
Case Is >= 1000000 ' 100万円以上(1000万未満)
category = "優良顧客"
Case Is >= 100000 ' 10万円以上(100万未満)
category = "一般顧客"
Case Is > 0 ' 0より大きい(10万未満)
category = "小口顧客"
Case Is = 0 ' ゼロ
category = "取引なし"
Case Is < 0 ' マイナス(返金等)
category = "要確認"
End Select
Cells(ActiveCell.Row, 4).Value = category
End Sub
📚 用語解説
Isキーワード(Select Case内):Select Case文のCaseで「Is 比較演算子 値」と書くと、比較演算子(>, <, >=, <=, =, <>)を使った条件が指定できます。Is > 100は「100より大きい」、Is <= 50は「50以下」を意味します。複数のIsを組み合わせて上から順に評価されるため、「最大値から順に並べる」設計が一般的です。
5-1. IsとToの組み合わせ
IsとToは同一のSelect Case内で混在させることができます。IsとToをうまく組み合わせると、複雑な範囲条件も可読性高く書けます。たとえば「100未満・100〜999・1000〜9999・10000以上」のように境界条件を全て網羅したいときは、To(両端範囲)とIs(片端範囲)の組み合わせが最もスッキリした書き方になります。
' IsとToを組み合わせた例(在庫数による発注フラグ)
Sub SetOrderFlag()
Dim stock As Integer
stock = Cells(ActiveCell.Row, 4).Value ' 在庫数
Dim flag As String
Select Case stock
Case Is < 0 ' マイナス在庫(データ異常)
flag = "データ確認要"
Case 0 ' 在庫ゼロ
flag = "緊急発注"
Case 1 To 10 ' 残りわずか
flag = "要発注"
Case 11 To 30 ' 少なめ
flag = "注意"
Case Is > 30 ' 十分な在庫
flag = "問題なし"
End Select
Cells(ActiveCell.Row, 5).Value = flag
End Sub
06 LIKE PATTERN Likeパターンマッチング(ワイルドカード) ワイルドカードを使った部分一致・前方一致の書き方
📚 用語解説
Select Case True(パターン):Select Caseの式に「True」を指定するテクニック。各CaseにBoolean式(真偽値を返す式)が書けるようになり、Like演算子を使ったパターンマッチング・複数変数の複合条件・AND/OR条件など、通常のSelect Caseでは書けない条件を実現できます。実質的にIf ElseIfチェーンと同じですが、Caseの縦並び構造を活かした可読性の高い書き方が可能です。
Select CaseのCase句ではLike演算子を直接使うことはできません。しかしVBAでは「Case Like パターン」の代わりに、If文的なLike評価をSelect Case内で実現するか、またはワイルドカードを使いたい場合はIf文を使う、という設計になります。ただし、VBA 7.x以降ではCase文にLike演算子を記述する方法が一般的で、「Case Is Like "パターン"」とは書けませんが「Like演算子をTrueと比較する」形でSelect Caseと組み合わせることは可能です。
より実践的には「Select Case True」というテクニックがあります。式に「True」を指定すると、各CaseにはBoolean式(真偽値を返す式)が書けます。これを利用してLikeを使ったパターンマッチングをSelect Case内に組み込めます。
' Select Case True + Likeのテクニック
Sub ClassifyEmailDomain()
Dim email As String
email = LCase(Cells(ActiveCell.Row, 2).Value) ' 小文字に統一
' Select Case True で各CaseにBoolean式を書く
Select Case True
Case email Like "*@gmail.com"
Cells(ActiveCell.Row, 3).Value = "Gmail"
Case email Like "*@yahoo.co.jp", email Like "*@yahoo.com"
Cells(ActiveCell.Row, 3).Value = "Yahoo"
Case email Like "*@*.co.jp", email Like "*@*.jp"
Cells(ActiveCell.Row, 3).Value = "国内法人"
Case email Like "*@*"
Cells(ActiveCell.Row, 3).Value = "その他"
Case Else
Cells(ActiveCell.Row, 3).Value = "メールアドレスではない"
End Select
End Sub
📚 用語解説
ワイルドカード(VBA Like演算子):Like演算子で使える特殊文字。「*(アスタリスク)」は0文字以上の任意の文字列にマッチ("A*"はA始まりの全て)、「?(クエスチョン)」は1文字の任意の文字にマッチ("A?"はA+1文字)、「#」は1桁の数字にマッチ、「[A-Z]」は括弧内の任意の1文字にマッチします。全て大文字・小文字を区別するバイナリ比較で行われます(LCaseで統一することを推奨)。
6-1. Like演算子のワイルドカード一覧
| ワイルドカード | 意味 | 使用例 | マッチ例 |
|---|---|---|---|
| *(アスタリスク) | 0文字以上の任意の文字列 | "株式会社*" | "株式会社GENAI"、"株式会社A"など |
| ?(クエスチョン) | 1文字の任意の文字 | "AB?" | "ABC"、"ABD"など(3文字限定) |
| #(シャープ) | 0〜9の1桁の数字 | "###-####" | "123-4567"のような電話番号形式 |
| [文字列] | 括弧内の任意の1文字 | "[AB]C" | "AC"または"BC" |
| [!文字列] | 括弧内以外の任意の1文字 | "[!AB]C" | AでもBでもない文字+Cの2文字 |
' ワイルドカードの実践例
Sub ClassifyProductCode()
Dim code As String
code = UCase(Cells(ActiveCell.Row, 1).Value) ' 大文字に統一
' Select Case True + Likeで商品コード分類
Select Case True
Case code Like "EL###-####" ' ELで始まる電器製品コード形式
Cells(ActiveCell.Row, 2).Value = "電器製品"
Case code Like "FD[0-9][0-9]-*" ' FD+2桁番号で始まる食品
Cells(ActiveCell.Row, 2).Value = "食品"
Case code Like "SV-*" ' SVで始まるサービス
Cells(ActiveCell.Row, 2).Value = "サービス"
Case code Like "####" ' 4桁数字のみ
Cells(ActiveCell.Row, 2).Value = "旧コード体系"
Case Else
Cells(ActiveCell.Row, 2).Value = "不明コード"
End Select
End Sub
07 CASE ELSE NESTING Case Elseとネスト・複合テクニック デフォルト処理の設計とSelect Caseを組み合わせる高度な使い方
Case Elseブロックは、上記のどのCaseにも一致しなかったときに実行されます。「入力値の妥当性チェック」「想定外の値への対応」「デフォルト動作の定義」に使います。業務マクロでは「想定外のデータが来たときにSEデバッグ用のメッセージを出す」または「エラーログに記録する」といった処理をCase Elseに入れることで、データの異常を早期に検知できます。
' Case Elseを使った入力値の妥当性チェック
Sub ValidateInput()
Dim inputVal As String
inputVal = Cells(2, 1).Value
Select Case inputVal
Case "A", "B", "C", "D", "E"
' 正常値の処理
Cells(2, 2).Value = "有効な評価値: " & inputVal
Cells(2, 2).Interior.Color = RGB(200, 255, 200)
Case ""
' 未入力
Cells(2, 2).Value = "未入力です"
Cells(2, 2).Interior.Color = RGB(255, 255, 200)
Case Else
' 想定外の値
Cells(2, 2).Value = "エラー: 無効な値「" & inputVal & "」が入力されました"
Cells(2, 2).Interior.Color = RGB(255, 200, 200)
' デバッグ用ログ(Immediateウィンドウに出力)
Debug.Print "想定外の値: " & inputVal & " (行: " & ActiveCell.Row & ")"
End Select
End Sub
7-1. Select Caseのネスト(入れ子)
Select Case文の中に別のSelect Case文を入れる「ネスト(入れ子)」も可能です。たとえば「まず大分類を判定してから小分類を判定する」という2段階分類や、「地域で絞り込んでから更にランクで分岐する」のような複層分類に使います。ネストは2〜3段階までに留めるのが可読性の観点から推奨されます。
' 2段階のネストSelect Case
Sub TwoLevelClassify()
Dim region As String
Dim rank As Integer
region = Cells(ActiveCell.Row, 1).Value ' 地域
rank = Cells(ActiveCell.Row, 2).Value ' ランク(1〜5)
Dim result As String
Select Case region
Case "関東"
Select Case rank
Case 5
result = "関東・プレミアム"
Case 3 To 4
result = "関東・スタンダード"
Case Else
result = "関東・エコノミー"
End Select
Case "関西"
Select Case rank
Case 5
result = "関西・プレミアム"
Case 3 To 4
result = "関西・スタンダード"
Case Else
result = "関西・エコノミー"
End Select
Case Else
result = "その他地域"
End Select
Cells(ActiveCell.Row, 3).Value = result
End Sub
Select Caseのネストが3段以上になると、どのEndSelect・End SelectがどのSelectと対応しているか読み解くのが困難になります。3段以上になる場合は、処理をサブルーチン(Subプロシージャ)に切り出して、ネストを浅くする設計を検討してください。インデントを丁寧につけることで1〜2段なら読みやすさを維持できます。
08 BUSINESS PATTERNS 業務での実践活用パターン ステータス管理・スコア評価・カテゴリ振り分けの業務マクロ例
ここまで学んだSelect Caseの各機能を組み合わせた、業務でそのまま使える実践パターンを紹介します。弊社(株式会社GENAI)の実際の業務自動化マクロを参考にした、現場で使えるコードスニペットです。
8-1. 受注ステータスの色分け(Or条件 + 色設定)
' 受注ステータスに応じたセル色分けとフラグ設定
Sub ColorByStatus()
Dim ws As Worksheet
Set ws = ActiveSheet
Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
Dim r As Long
For r = 2 To lastRow
Dim status As String
status = ws.Cells(r, 4).Value ' D列:ステータス
Select Case status
Case "未対応", "未処理", "未確認"
ws.Cells(r, 4).Interior.Color = RGB(255, 200, 200) ' 赤
ws.Cells(r, 5).Value = "要対応"
Case "対応中", "処理中", "確認中"
ws.Cells(r, 4).Interior.Color = RGB(255, 255, 200) ' 黄
ws.Cells(r, 5).Value = "進行中"
Case "完了", "対応済", "解決済"
ws.Cells(r, 4).Interior.Color = RGB(200, 255, 200) ' 緑
ws.Cells(r, 5).Value = "完了"
Case "保留", "様子見", "一時停止"
ws.Cells(r, 4).Interior.Color = RGB(200, 200, 255) ' 青
ws.Cells(r, 5).Value = "保留"
Case "キャンセル", "取消"
ws.Cells(r, 4).Interior.Color = RGB(220, 220, 220) ' グレー
ws.Cells(r, 5).Value = "終了"
Case Else
ws.Cells(r, 4).Interior.Color = RGB(255, 150, 150) ' 濃い赤
ws.Cells(r, 5).Value = "ステータス不明: " & status
End Select
Next r
MsgBox "色分け処理完了(" & lastRow - 1 & "行)"
End Sub
8-2. 売上金額のランク分類(To + Is組み合わせ)
' 売上金額でランク判定して担当アクションを設定
Sub AssignRank()
Dim ws As Worksheet
Set ws = ActiveSheet
Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
Dim r As Long
For r = 2 To lastRow
Dim amount As Long
amount = ws.Cells(r, 3).Value ' C列:売上金額
Dim rank As String
Dim action As String
Select Case amount
Case Is >= 5000000 ' 500万以上
rank = "S"
action = "営業部長対応・優先フォロー"
Case 1000000 To 4999999 ' 100〜499万
rank = "A"
action = "担当営業・月次面談"
Case 300000 To 999999 ' 30〜99万
rank = "B"
action = "担当営業・四半期面談"
Case 1 To 299999 ' 1〜29万
rank = "C"
action = "メールフォロー"
Case 0
rank = "D"
action = "休眠顧客・再アプローチ検討"
Case Else ' マイナス(返金等)
rank = "-"
action = "経理確認"
End Select
ws.Cells(r, 4).Value = rank
ws.Cells(r, 5).Value = action
Next r
MsgBox "ランク分類完了(" & lastRow - 1 & "件)"
End Sub
読み込み
全件をループ
条件判定
金額・ステータス
で分岐
アクション設定
セルに値と
色を設定
結果シートに
書き出し
09 COMMON MISTAKES よくある失敗とデバッグ方法 Select Caseで引っかかりやすいバグパターンと修正方法
Select Caseを使ったコードで発生しやすいバグのパターンをまとめます。エラーメッセージが出ずに「なぜか期待した処理が実行されない」というサイレントバグが多いため、デバッグに時間がかかりやすい領域です。
| バグパターン | 原因 | 対処法 |
|---|---|---|
| Case Elseばかり実行される | データの型・大文字小文字・全角半角がCaseの値と不一致 | Debug.Printで実際の値を確認、UCaseやTrimで正規化 |
| ToキーワードのIsより大きい値が先に実行される | Caseの順番が上位ランクより先に低ランクが来ている | 大→小・高→低の順にCaseを並べる |
| コンパイルエラー:Caseの後ろがない | End SelectとCase Elseの位置がずれている | インデントを整えてSelect〜End Selectの対応確認 |
| 数値型とString型の不一致 | 比較対象が数値なのにCase "1"(文字列)と書いた | Caseの値を比較対象と同じ型で書く |
9-1. 最頻出バグ:全角・半角・大文字・小文字の不一致
業務マクロでSelect Caseが期待通りに動かない原因の9割は「Caseの値とデータの表記ゆれ」です。たとえばCase "完了"と書いてセルに「完了」が入っていても、セルの値が全角スペース入り「完了 」だったり、半角カタカナだったりすると一致しません。LCase(小文字統一)・UCase(大文字統一)・Trim(前後スペース除去)の組み合わせでデータを正規化してからSelect Caseに渡すことで、この種のバグを防げます。
' データ正規化してからSelect Caseに渡す防御パターン
Sub SafeSelectCase()
Dim rawValue As String
rawValue = Cells(ActiveCell.Row, 1).Value
' 前後スペース除去 + 大文字統一で正規化
Dim normalized As String
normalized = UCase(Trim(rawValue)) ' 例:" complete " → "COMPLETE"
Select Case normalized
Case "COMPLETE", "COMPLETED", "完了"
' 複数の表記を一括カバー
Cells(ActiveCell.Row, 2).Value = "完了"
Case "PENDING", "保留"
Cells(ActiveCell.Row, 2).Value = "保留"
Case Else
' デバッグ用:実際の値を確認できる
Debug.Print "未定義の値: [" & rawValue & "] → 正規化後: [" & normalized & "]"
Cells(ActiveCell.Row, 2).Value = "不明: " & normalized
End Select
End Sub
Select Caseがどのケースにも一致しない場合は、Debug.Print "値:[" & 変数 & "]" をSelect Caseの直前に追加して、VBEのイミディエイトウィンドウ(Ctrl+G)で実際の値を確認します。[値]のように括弧で囲んで出力すると、スペースや不可視文字の有無が分かります。
10 CLAUDE CODE Claude CodeでSelect Caseコードを自動生成 条件分岐の業務ロジックをAIに書かせる実践ガイド
Select Caseを使った条件分岐ロジックは、「どの値のときにどの処理をするか」という業務仕様が確定していれば、Claude Codeに自動生成させることができます。条件の数が多い(10種類以上)、ToやIsを組み合わせる、ネストが必要——こうした複雑なパターンも、業務要件を日本語で説明するだけで正確なVBAコードを生成してくれます。
非エンジニアの方がSelect Caseを使って業務マクロを作りたい場合、「どの値のときに何をしたいか」を整理した対応表(Excelや箇条書きでOK)を用意して、それをClaude Codeに渡すだけで実用的なVBAコードが生成できます。プログラミングの知識がなくても、業務の仕様を言語化できれば自動化が実現できます。弊社のAI鬼管理では、こうした業務VBA自動化の設計・実装支援も承っています。
11 CONCLUSION まとめ VBA Select Caseを完全に使いこなすためのポイント整理
この記事では、VBAのSelect Case文を11のセクションで体系的に解説しました。基本構文からカンマOR条件・To範囲・Is演算子・Likeパターン・実践業務パターンまで、Select Caseの使い方を完全に整理しました。
Select Caseをマスターすることで、業務Excelマクロの「条件分岐スパゲッティ」から解放されます。20〜30行のIf ElseIfチェーンが、Select Caseによって半分以下の行数でより読みやすいコードに変わります。ぜひ今日書く次のVBAから使ってみてください。
VBAによる業務自動化を、AI鬼管理が一緒に設計します
「Excelのマクロで業務を自動化したいが、Select Caseの条件分岐が複雑で書けない」「既存のIf文スパゲッティをSelect Caseでリファクタリングしたい」という方に向けて、弊社ではClaude Codeを活用したVBA業務自動化の設計・実装支援を行っています。
NEXT STEP
この記事の内容を、あなたのビジネスで
実践してみませんか?
AI活用を自社で回せるようになりたい方へ
AI鬼管理
Claude Code・Cowork導入支援から業務設計・社内浸透まで実践ベースで伴走。「自社で回せる組織」を90日で作る経営者向けトレーニング。
よくある質問
Q. Select CaseとIf文はどちらを使えばいいですか?
A. 比較対象が1つの変数・式で、分岐の選択肢が3つ以上ある場合はSelect Caseを推奨します。「statusが"完了"・"処理中"・"未処理"のどれか」のような判定はSelect Caseが読みやすいです。「AがTrueかつBが100以上」のような複数変数の複合条件はIf文を使います。
Q. Select CaseでAnd条件(かつ)は使えますか?
A. 通常のSelect Case文でAndは使えません。「Case Is > 10 And Is < 20」のような書き方はできません。AND条件が必要な場合は、「Select Case True」パターンを使って「Case 変数 > 10 And 変数 < 20」と書くか、If文を使います。
Q. Toで範囲指定するとき、順番(小→大 vs 大→小)はどちらでも構いませんか?
A. Case 1 To 10のように「小さい値 To 大きい値」の順で書く必要があります。Case 10 To 1と逆に書くとどの値にも一致しなくなります。文字列の場合も辞書順で「前の値 To 後の値」の順で書いてください。
Q. Select Case内で複数の処理を実行してもいいですか?
A. できます。1つのCaseブロック内に何行でも処理を書けます。セルへの値設定・色変更・別の関数の呼び出し・条件付きのIf文まで、通常のVBAコードがそのまま書けます。Case Elseブロックも同様です。
Q. 大文字・小文字を区別せずにSelect Caseで比較するにはどうすればいいですか?
A. モジュールの先頭に「Option Compare Text」と書くとテキスト比較モードになり、大文字・小文字を区別しなくなります。デフォルトは「Option Compare Binary」(バイナリ比較・大文字小文字区別あり)です。または比較前にUCase()またはLCase()で統一してからSelect Caseに渡す方法もあります。
Q. Select CaseをFor Eachループと組み合わせて全行に適用できますか?
A. できます。For r = 2 To LastRowなどのループの中にSelect Caseを入れることで、シートの全行に条件分岐処理を適用できます。Section 08の業務パターンがその典型例です。ループ内でSelect Caseを使うことで「全行のステータスチェック」「全行の色分け」といった一括処理が可能になります。
Q. VBAのSelect Caseを自分で書くのが難しい場合、AIで生成できますか?
A. できます。Claude Codeに「どの値のときにどう処理したいか」の対応表や仕様を日本語で説明すると、ToキーワードやIsを組み合わせた最適なSelect Caseコードを生成してくれます。また既存のIf文をSelect Caseに書き直す「リファクタリング」も「このコードをSelect Caseで書き直して」と依頼するだけで対応できます。
Claude Codeで業務自動化を90日で叩き込む
経営者向けの伴走型パーソナルトレーニング
Claude Code を業務に落とし込む
専門研修コース一覧
受講者本人の業務を題材に、「使いこなせる」状態になるまで伴走する研修プログラム。1対1特化型・ハンズオン・法人講座の3コースを展開中。業務特化・実装まで踏み込むタイプのClaude Code研修です。
研修コース一覧を見る →AI鬼管理へのお問い合わせ
この記事を読んで気になった方へ。
AI鬼管理の専門スタッフが、御社に最適な
業務自動化プランを無料でご提案します。




