A子さん「条件分岐ってIf文だけじゃダメなの?
Select Caseっていつ使えばいいのか、よくわかんない……」



そんな悩みを抱える方へ。
この記事では、IfとSelect Caseの違いと使い分けのポイントをわかりやすく解説します!
結論:シンプルならIf、条件が多いならSelect Case!
1~2個程度の単純な条件 → If
3つ以上の明確な分岐がある → Select Case
数値の範囲や文字列の一致で分岐 → Select Caseが見やすい!
If文とSelect Caseの違いをざっくり比較
VBAで条件分岐を書く際、多くの初心者がIf文だけで処理してしまいます。でもプログラミングには「道具は目的に応じて使い分けるべき」という原則があります。Select Caseも同じ条件分岐ですが、出番は決して少なくありません。
| 比較項目 | If文 | Select Case |
|---|---|---|
| 分岐の数 | 少数(1~2個)向き | 多数(3つ以上)向き |
| 範囲や大小比較 | 得意 | 対応可能(Isを使う) |
| 可読性 | ネストが深くなると読みにくい | 分岐ごとにスッキリ書ける |
| 文字列の条件分岐 | 可能 | 可能(複数条件も見やすい) |
| 複雑な論理(AND/OR) | 得意 | 不向き |
最大のポイントは「どれくらいの分岐数があるか」です。分岐が少ないならIf文の簡潔さが活躍しますが、分岐が多いと状況が変わります。
If文が向いているケースとは?
If文は古くからあるオーソドックスな条件分岐です。VBAではもちろん、ほぼ全てのプログラミング言語に存在する基本中の基本。だからこそ、得意な場面を理解することが大切です。
条件が1~2個程度で単純
比較演算(<, >, =)を使いたい場合
複数の変数や複雑な論理(AND/OR)を含む場合
例えば、成績の合否判定のように「ボーダーラインを超えているか超えていないか」という二者択一の判断では、If文が最適です。シンプルで読みやすく、わざわざSelect Caseで書き換える理由がありません。
If score >= 60 Then
MsgBox "合格"
Else
MsgBox "不合格"
End If
また、複数の条件を組み合わせたい場合もIf文が活躍します。「かつ(AND)」「または(OR)」「ではない(NOT)」といった論理演算を駆使する場面ですね。
If age >= 20 And status = "社員" Then
MsgBox "給与支給対象です"
Else
MsgBox "給与支給対象外です"
End If
このように複雑な条件は、Select Caseでは対応しづらいという大きな制限があります。
Select Caseが向いているケースとは?
では、Select Caseの出番は?それは「1つの値に対して、複数の明確な分岐がある」という場面です。
1つの変数に対する複数の明確な条件がある
数値の範囲で分けたい
特定の文字列に応じた処理をしたい
成績の例を見返してみましょう。「合格」「不合格」の二者択一ではなく、「満点」「優秀」「及第点」「再試験」といった複数段階で評価したいとしたら?そこがSelect Caseの出番です。
Select Case score
Case 100
MsgBox "満点!"
Case 80 To 99
MsgBox "よくできました"
Case Else
MsgBox "がんばりましょう"
End Select
見てください。Case 80 To 99という書き方。「80以上99以下」という範囲をシンプルに表現できるのです。If文で同じことをしようとしたら、If score >= 80 And score <= 99と書かなければいけません。長くなるし読みづらい。
また、Select CaseにはIsという特別なキーワードも用意されています。これを使うと大小比較もスッキリ書けます。
Select Case score
Case Is >= 90
MsgBox "優秀"
Case Is >= 70
MsgBox "合格"
Case Else
MsgBox "不合格"
End Select
実際のコードで比較してみよう
理論だけでは実感しにくいので、実際のプログラムで見比べてみましょう。業務データの処理でよく出てくるシーン、「ステータス」に応じた処理です。
If文の例(読みづらい)
If status = "完了" Then
MsgBox "処理済みです"
ElseIf status = "未完了" Then
MsgBox "対応が必要です"
ElseIf status = "保留" Then
MsgBox "確認中です"
Else
MsgBox "不明な状態です"
End If
ElseIfが続き続き、枝分かれが深くなっていく様子が見て取れますね。データが増えると「どの条件がどの処理に対応しているのか」がパッと見で判断しにくくなります。
Select Caseの例(読みやすい)
Select Case status
Case "完了"
MsgBox "処理済みです"
Case "未完了"
MsgBox "対応が必要です"
Case "保留"
MsgBox "確認中です"
Case Else
MsgBox "不明な状態です"
End Select
どうでしょう。構造がスッキリしていますよね。各Caseが対等な扱いで並んでいるので、どの条件にどの処理が対応しているのか一目瞭然です。保守性も高まります。後から同じコードを見直すときや、他人のコードを読むときに、この差は大きいです。



実務では「今から条件を追加したいな」という場面が頻繁に起こります。Select Caseならケースを追加するだけ。If文ならElseIfの構造を変える必要があるかもしれません。選択肢が増えやすい業務では、Select Caseの方が柔軟に対応できます。
複数の値にマッチさせる場合
Select Caseにはもう1つ強力な機能があります。1つのCaseに複数の値を指定できるのです。
Select Case dayOfWeek
Case "月", "火", "水", "木", "金"
MsgBox "平日です"
Case "土", "日"
MsgBox "休日です"
End Select
複数の値をカンマで区切って書くだけで、いずれかに該当したときの処理が実行されます。これをIf文でやろうとしたら?
If dayOfWeek = "月" Or dayOfWeek = "火" Or dayOfWeek = "水" Or dayOfWeek = "木" Or dayOfWeek = "金" Then
MsgBox "平日です"
ElseIf dayOfWeek = "土" Or dayOfWeek = "日" Then
MsgBox "休日です"
End If
こうなります。長い、読みづらい。Select Caseの利便性が際立ちます。
使い分けフローチャート
さて、ここまでの話を整理します。あなたが条件分岐を書く際、どっちを選べばいいのか。判断の流れを以下にまとめました。
【判断フロー】
1つの値に対する複数の分岐?
└─ はい → 分岐数は3つ以上?
├─ はい → Select Case を使う
└─ いいえ → If文でもOK、Select Caseもスッキリ
複雑な論理(AND/ORを含む)?
└─ はい → If文 を使う
└─ いいえ → Select Case も検討する
範囲判定や複数値の一致判定?
└─ はい → Select Case が最適
└─ いいえ → If文でも対応可
迷ったときの最強の判断基準は「ElseIfが3回以上続きそうか」です。3回以上なら、まずSelect Caseを考えてみてください。
よくあるつまずきポイント
実務で使い分けていると、初心者がよく引っかかるポイントが見えてきます。いくつかご紹介します。
ポイント1:Select Caseは1つの値に対してのみ有効
Select Caseはその性質上、複数の異なる値を同時に評価することには向きません。例えば「年齢と性別の組み合わせ」で分岐したい場合は、If文に軍配が上がります。
If age >= 20 And gender = "男" Then
MsgBox "条件A"
ElseIf age >= 20 And gender = "女" Then
MsgBox "条件B"
End If
こういった「複数変数の組み合わせ」がある場合は、If文の方が適切です。Select Caseで無理に書き直そうとすると、かえってコードが複雑になります。
ポイント2:Case Elseは最後に配置する
Select Caseを書く際、デフォルト処理(どれにも該当しない場合)はCase Elseで対応します。このCase Elseは、いかなる場合でも最後に配置する必要があります。途中に入れるとそれ以降のCaseが評価されなくなるからです。
Select Case status
Case "完了"
MsgBox "処理済み"
Case "保留"
MsgBox "保留中"
Case Else
MsgBox "その他" ' これが最後
End Select
ポイント3:Select Caseでは大小比較が直感的でない可能性
Select Caseで範囲判定を書く際、Is >= 値という書き方をします。この「Is」キーワードは、はじめて見たプログラマには戸惑われることがあります。
Select Case score
Case Is > 100
MsgBox "範囲外エラー"
Case Is >= 80
MsgBox "優秀"
Case Else
MsgBox "不合格"
End Select
慣れると便利ですが、チームで使う際には「Isを使った範囲判定」というコメントをあると親切です。
パフォーマンスの違いはあるのか
実務では「どっちの方が処理速度が速いのか」という質問もよく出てきます。結論から言うと、VBAレベルではほぼ差は無いと考えて問題ありません。
大規模データ処理(数万件のループ内での条件分岐)でもない限り、人間が感知できるレベルでの速度差は発生しません。むしろ「読みやすく、保守しやすいコードを書く」方が、実務では圧倒的に重要です。



3ヶ月後に自分の書いたコードを見返して「何この書き方?」と思うのは避けたいですよね。可読性を最優先に考えてください。
実装例:データ検証ロジック
最後に、実務でよく出てくる「データ検証」のシーンで、If文とSelect Caseをどう使い分けるか、実装例を示します。
複数の検証条件がある場合(If文が活躍)
Function ValidateEmployee(name As String, age As Long, department As String) As Boolean
If Len(name) = 0 Then
MsgBox "名前が入力されていません"
ValidateEmployee = False
ElseIf age < 18 Or age > 65 Then
MsgBox "年齢が範囲外です"
ValidateEmployee = False
ElseIf department = "" Then
MsgBox "部門を選択してください"
ValidateEmployee = False
Else
ValidateEmployee = True
End If
End Function
複数の異なる変数(name、age、department)を検証する場合は、If文が適切です。複雑な条件を組み合わせられるからです。
1つの入力値に対する分岐(Select Caseが活躍)
Function CalculateBonus(position As String) As Long
Dim bonusRate As Long
Select Case position
Case "部長"
bonusRate = 30
Case "課長"
bonusRate = 20
Case "主任"
bonusRate = 15
Case "一般社員"
bonusRate = 10
Case Else
MsgBox "不正な役職です"
CalculateBonus = 0
Exit Function
End Select
CalculateBonus = bonusRate
End Function
1つの変数(position)に対して複数の明確な値で分岐する場合、Select Caseがスッキリします。今後「専務」という新しい役職が追加されても、Caseを1行足すだけで対応できます。
ネスト(入れ子)を避ける工夫
業務ロジックが複雑になると、条件分岐がネスト(入れ子)状態になることがあります。例えば、まずステータスで分岐し、その中でさらに部門で分岐する、というように。
Select Case status
Case "完了"
Select Case department
Case "営業"
MsgBox "営業部の完了案件"
Case "企画"
MsgBox "企画部の完了案件"
End Select
Case "処理中"
MsgBox "処理中です"
End Select
このようなネストは読みづらくなります。プログラミングの基本原則として「ネストは深くしない」というルールがあります。このような場合は、処理を別の関数に分離するなど、工夫してみてください。
リファクタリング例
Sub ProcessData(status As String, department As String)
If status = "完了" Then
ProcessCompletedData department
ElseIf status = "処理中" Then
MsgBox "処理中です"
End If
End Sub
Sub ProcessCompletedData(dept As String)
Select Case dept
Case "営業"
MsgBox "営業部の完了案件"
Case "企画"
MsgBox "企画部の完了案件"
End Select
End Sub
処理を関数で分割することで、各層の条件分岐がシンプルになります。結果として、バグが減り、保守性が格段に上がります。
まとめ
If文は条件数が少ない、または複雑な論理が必要な場合に活躍します。
AND/ORといった論理演算を組み合わせたり、複数の異なる変数を検証したりする場面では、If文の柔軟性は手放せません。
Select Caseは1つの値に対する複数の明確な分岐があるとき、威力を発揮します。
コードが読みやすく、保守しやすくなります。特に分岐が3つ以上ある場合は、Select Caseを最初に検討する価値があります。
使い分けのコツは「分岐の数と内容」に注目することです。
どちらを選ぶか迷ったときは、自分のコードを見直して「3ヶ月後の自分が読んで理解できるか」を想像してみてください。その判断がプロフェッショナルなコード品質を生み出す秘訣です。



VBAは実務ツールです。正解より「チーム全体で読めて、保守できるコード」を目指しましょう。If とSelect Case を使い分けるスキルは、その第一歩になります。
人気の記事
AIブームで、最近はこちらの記事がよく読まれています




コメント