VBAで文字列によって処理を切り替えたい場合、「If...ElseIf...Else」を何度も並べていませんか。
条件が2~3個程度なら問題ありませんが、文字列の種類が増えるとコードが長くなり、後から修正しづらくなります。また、条件の追加や削除を繰り返すうちに、どこでどの処理が行われているのか分かりにくくなり、保守性も低下してしまいます。
そのような場面で活躍するのがSelect Case文です。
Select Caseを使えば、文字列ごとに処理を整理して記述できるため、可読性が向上し、条件追加にも柔軟に対応できます。
この記事では、VBAでSelect Caseを使って文字列を判定する基本的な方法から、実務で保守しやすいコードの書き方まで詳しく解説します。
✅ VBAでSelect Caseを使って文字列を判定する基本
文字列の条件分岐では、「動けばよい」という書き方ではなく、後から条件が増えても修正しやすい構成にしておくことが重要です。
例えば、部署名や商品区分、処理区分などは、運用が始まると種類が増えることが珍しくありません。最初から保守性を意識しておくことで、将来の仕様変更にも対応しやすくなります。
まずは、Select Case文の基本的な書き方を確認しましょう。
・Select Caseの基本構文
文字列を判定する場合の基本構文は次のようになります。
Select Case 判定する文字列
Case "文字列1"
実行する処理
Case "文字列2"
実行する処理
Case Else
上記以外の処理
End Select
処理の流れは次のとおりです。
- 判定対象となる文字列を取得する
- 上から順番にCaseを比較する
- 一致したCaseの処理だけを実行する
- 一致しない場合はCase Elseを実行する
If文を何度も書くよりも、条件が整理されるため読みやすいコードになります。
・文字列を判定するサンプル
例えば、セルやCSVから取得した部署名をもとに、部署ごとに異なる処理を実行したいケースを考えてみましょう。
営業部・経理部・総務部で処理内容を切り替えるような場面では、Select Caseを使うことで条件を分かりやすく整理できます。次のサンプルでは、部署名を判定して実行する処理を切り替える基本的な書き方を紹介します。
・条件が増えても修正しやすい実務向けの書き方
次のコードは、変数名を役割が分かる名称にし、Case Elseも用意することで、後から部署が追加されても対応しやすい構成にしています。
Sub ProcessByDepartment()
' 判定対象となる部署名
Dim departmentName As String
departmentName = "営業"
Select Case departmentName
Case "営業"
MsgBox "営業部の処理を実行します。"
Case "経理"
MsgBox "経理部の処理を実行します。"
Case "総務"
MsgBox "総務部の処理を実行します。"
Case Else
MsgBox "対象外の部署です。"
End Select
End Sub
このコードでは、判定対象をdepartmentNameという変数にまとめています。
そのため、後からセルの値や入力フォーム、CSVデータなどに変更する場合でも、判定部分を修正するだけで済む構成になっています。
・なぜこの書き方が実務では保守しやすいのか
同じ処理であれば、次のように直接文字列を書いてしまうこともできます。
Select Case "営業"
しかし、この書き方では判定対象が固定されるため、実務ではほとんど利用しません。
変数へ値を格納してから判定することで、
- セルの値
- InputBoxの入力値
- CSVから取得した値
- データベースから取得した値
などへ簡単に置き換えられます。
また、Case Elseを必ず用意しておくことも重要です。
運用開始後に新しい部署名が追加された場合でも、「対象外」として処理できるため、想定外の値による誤動作を防ぎやすくなります。
✅ Select CaseとIf文はどちらを使うべき?
「文字列の判定ならIf文でも書けるのでは?」と思う方も多いでしょう。
確かに条件が少ない場合はIf文でも問題ありません。
しかし、条件数が増えるほどコードの見通しが悪くなり、修正漏れや条件の重複が発生しやすくなります。
ここでは、実務でどのように使い分けるべきかを紹介します。
・条件が少ないならIf文でも十分
例えば、判定が2つだけならIf文の方がシンプルです。
If departmentName = "営業" Then
MsgBox "営業部"
Else
MsgBox "営業部以外"
End If
この程度であれば、無理にSelect Caseを使う必要はありません。
・条件が増えるならSelect Caseがおすすめ
一方で、
- 営業
- 経理
- 総務
- 人事
- 開発
- 購買
- 品質管理
のように条件が増えていく場合は、Select Caseの方が圧倒的に見やすくなります。
条件が追加されてもCaseを1つ追加するだけで済み、既存コードへの影響も少なくなります。
そのため、実務では「今は条件が少なくても、今後増える可能性があるならSelect Caseを採用する」という判断をすることも少なくありません。
Select Caseは複数の条件分岐に適していますが、条件が少ない場合はIf文の方がシンプルに書けることもあります。文字列の完全一致をIf文で実装する方法や使い分けについては、「【VBA】文字列の完全一致の処理(IF文)|実務で壊れない条件分岐の基本設計」で詳しく解説しています。
✅ Select Caseで複数の文字列をまとめて判定する方法
実務では、「営業」「営業一課」「営業二課」のように、複数の文字列を同じ処理へまとめたい場面がよくあります。
このような場合にIf文を並べてしまうと、条件が増えるたびにコードが長くなり、保守性も低下します。
Select Caseでは、1つのCaseへ複数の値を指定できるため、コードをすっきり整理できます。
・複数の文字列を1つのCaseで処理する
実務では、「営業」「営業一課」「営業二課」のように、名称は異なっていても同じ処理を実行したいケースが少なくありません。
このような場合にCaseを個別に記述すると、同じコードを何度も書くことになり、保守性が低下してしまいます。Select Caseでは、複数の文字列を1つのCaseへまとめて記述できるため、コードをシンプルに保ちながら管理しやすくなります。
次のサンプルでは、営業部門と管理部門をグループ化して処理を分岐する方法を紹介します。
・条件が増えても管理しやすい実務向けコード
次のコードは、営業部門をまとめて処理する例です。
変数名やコメントを付けることで、後から部署が増えても修正しやすい構成になっています。
Sub ProcessDepartmentGroup()
' 判定対象となる部署名
Dim departmentName As String
departmentName = Range("A2").Value
Select Case departmentName
' 営業関連部署
Case "営業", "営業一課", "営業二課"
MsgBox "営業部門の処理を実行します。"
' 管理部門
Case "経理", "総務"
MsgBox "管理部門の処理を実行します。"
Case Else
MsgBox "対象外の部署です。"
End Select
End Sub
・この書き方を採用する理由
同じ処理を行う条件を1つのCaseへまとめることで、
- 同じコードを何度も書かなくて済む
- 修正箇所を減らせる
- 条件漏れが起きにくい
というメリットがあります。
例えば営業部門へ「営業三課」が追加された場合も、
Case "営業", "営業一課", "営業二課", "営業三課"
と1か所修正するだけで済みます。
一方、If文で同じ条件を書いていると、複数箇所の修正が必要になり、更新漏れの原因になりやすいため注意しましょう。
✅ Select Caseで部分一致はできる?
Select Caseを使い始めた方からよくある質問が、
「"営業"を含む文字列ならすべて同じ処理にしたい」
というものです。
しかし、通常のSelect Caseは完全一致で判定します。
・通常のSelect Caseでは部分一致にならない
例えば、
departmentName = "東京営業所"
の場合、
Case "営業"
には一致しません。
あくまで文字列全体が一致した場合だけ処理が実行されます。
・部分一致ならSelect Case Trueを使う
部分一致を行いたい場合は、
Select Case True
とし、InStrなどの判定式を書く方法が実務ではよく利用されます。
・保守しやすい実務向けコード
Sub ProcessDepartmentByPartialMatch()
' 判定対象の部署名
Dim departmentName As String
departmentName = Range("A2").Value
Select Case True
' 「営業」を含む場合
Case InStr(departmentName, "営業") > 0
MsgBox "営業関連部署です。"
' 「経理」を含む場合
Case InStr(departmentName, "経理") > 0
MsgBox "経理関連部署です。"
Case Else
MsgBox "対象外です。"
End Select
End Sub
・実務ではこの方法が選ばれる理由
部署名や商品名は、
- 東京営業所
- 大阪営業所
- 名古屋営業所
のように、前後へ文字列が追加されることがあります。
完全一致だけでは対応できないため、部分一致で判定できる構成にしておくことで、仕様変更にも柔軟に対応できます。
Select Caseは基本的に完全一致で判定します。部分一致による条件分岐を詳しく知りたい方は、「【VBA】文字列の部分一致(IF文)|LikeとInStrで壊れない条件分岐を設計する」も参考にしてください。
✅ 実務で保守しやすいSelect Caseの設計ポイント
Select Caseは便利ですが、書き方によって保守性は大きく変わります。
実務では次の点を意識すると、後から修正しやすいコードになります。
・判定する値は変数へまとめる
次のように直接セルを書いてしまうこともできます。
Select Case Range("A2").Value
しかし実務では、
Dim departmentName As String
departmentName = Range("A2").Value
Select Case departmentName
のように、一度変数へ格納することをおすすめします。
これにより、
- CSV
- UserForm
- 他シート
- データベース
などへ変更しても、修正箇所を最小限にできます。
セルの値をそのまま判定すると、データ型によって思わぬ結果になることがあります。Valueプロパティと文字列の扱いについて詳しく知りたい方は、「【VBA】Valueは文字列として扱える?型変換が必要なケースと実務判断を解説」も参考にしてください。
・Case Elseは必ず用意する
実務では想定外の値が入力されることは珍しくありません。
例えば、
- 入力ミス
- 新しい部署名
- 空白セル
- CSVの仕様変更
などです。
Case Elseを用意しておけば、
- エラーメッセージを表示する
- ログを残す
- 処理を終了する
など、安全な動作へつなげられます。
条件によっては何も処理しないケースを設計したいこともあります。ElseIfを使った空分岐の考え方については、「【VBA】IF文でElseIfを用いて何も処理しない方法|空分岐の正しい設計と実務判断」で詳しく解説しています。
・Caseの順番も意識する
Select Caseは上から順番に判定されます。
そのため、関連する条件はまとめて配置すると読みやすくなります。
例えば、
営業関連
管理部門
開発部門
のようにグループ化しておくと、後から見返した際にも理解しやすくなります。
Select Caseで正しく判定するためには、判定対象の文字列を適切に取得することも重要です。セルの値を安全に文字列として取得する方法については、「【VBA】文字列として取得する方法|Cells・Range・Valueの安全な使い分け」をご覧ください。
✅ Select Caseで文字列を扱うときの注意点
最後に、実務でよくある注意点を紹介します。
- 完全一致が基本であることを理解する
- 部分一致には
Select Case Trueを利用する - 同じ処理はCaseをまとめて記述する
- 判定対象は変数へ格納する
- Case Elseを省略しない
- 条件が増えることを前提に設計する
こうした点を意識するだけでも、数か月後の保守性が大きく変わります。
Select Caseで条件分岐を理解したら、次は条件に一致したデータだけを抽出する処理にも挑戦してみましょう。「【VBA】条件に合うデータを抽出する方法|For文・IF文で実務データを自在に扱う」では、実務でよく使われる抽出処理を詳しく紹介しています。
✅ まとめ:Select Caseで文字列を判定して保守性の高いコードを書こう
この記事では、VBAでSelect Caseを使って文字列を判定する方法について解説しました。
- Select Caseは文字列の複数条件を見やすく整理できる
- 条件が増える場合はIf文より保守しやすい
- 同じ処理は1つのCaseへまとめると可読性が向上する
- 部分一致を行う場合は
Select Case TrueとInStrを組み合わせる - 判定対象は変数へ格納すると再利用しやすい
- Case Elseを用意して想定外の入力にも対応することが重要
文字列による条件分岐は、部署名・商品区分・処理区分など、多くの業務システムで利用されます。最初から保守性を意識したSelect Caseの書き方を身に付けておくことで、条件追加や仕様変更にも対応しやすい、読みやすいVBAコードを作成できるようになります。