【初心者向け】Select CaseとIf文の違い・使い分けをわかりやすく解説!

A子さん

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

先輩

そんな悩みを抱える方へ。
この記事では、IfSelect 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レベルではほぼ差は無いと考えて問題ありません

大規模データ処理(数万件のループ内での条件分岐)でもない限り、人間が感知できるレベルでの速度差は発生しません。むしろ「読みやすく、保守しやすいコードを書く」方が、実務では圧倒的に重要です。

A子さん

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ブームで、最近はこちらの記事がよく読まれています

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

かもろぐ屋へようこそ。

Microsoft製品が大好きな現役社内SEです。
本業では、業務改善・運用・トラブル対応・効率化など、いわゆる「社内の困った」を何でも屋のように対応しています。

このブログでは主に、

VBA
Power Apps
AI

について、実体験ベースで発信しています。

特に最近は、AIを使ったアプリ開発やブログ運営の自動化にハマっています。
「AIがあれば簡単に作れる」と思って始めた結果、普通に壊れたり、詰んだり、課金したりしながら泥臭く進めています。

キラキラした成功談というより、

「実際どうだったのか」
「どこで詰まったのか」
「初心者でも本当にできるのか」

を、できるだけリアルに残すタイプのブログです。

なお、絶賛婚活中です。

コメント

コメントする

CAPTCHA


目次