VBAで文字列によって処理を切り替えたい場面は非常に多くあります。
例えば、
- 商品コードごとに処理を変えたい
- 部署名ごとに担当者を変更したい
- ステータスごとに実行内容を切り替えたい
- ファイルの種類ごとに保存先を変更したい
このような場合、If文を何度も続けることもできますが、条件が増えるほどコードが読みにくくなります。
そこで活躍するのがSelect Case文です。
特に文字列を条件にした処理では、Select Case文を使うことでコード全体が整理され、保守性も大きく向上します。
この記事では、Select Case文で文字列を比較する基本から、実務で読みやすいコードを書く考え方まで詳しく解説します。
✅ VBAでSelect Case文を使って文字列を比較する基本
「文字列ならIf文で十分」と考えてしまう方は少なくありません。
しかし実務では条件が増えることが多く、If~ElseIfが10個以上続くコードになるケースも珍しくありません。
そのようなコードは後から仕様変更すると修正漏れが発生しやすく、バグの原因になります。
Select Case文は条件分岐を整理するための構文なので、文字列比較との相性が非常に良いのが特徴です。
まずは基本的な書き方を理解しておきましょう。
・Select Case文で文字列を比較する基本構文
文字列を比較する基本構文は次のようになります。
Select Case 文字列
Case "文字列1"
処理
Case "文字列2"
処理
Case Else
その他の処理
End Select
評価対象となる文字列を一度だけ指定し、その値によって実行する処理を切り替えます。
If文のように毎回
If department = "営業部" Then
と書く必要がありません。
そのため、条件が増えても読みやすさを維持できます。
・まず覚えたい文字列比較のサンプル
まずはもっとも基本的な例です。
部署名によってメッセージを変更します。
最初にコードを見てみましょう。
このサンプルでは、比較対象を一度だけ指定することで、条件が増えても読みやすい構成にしています。
部署が追加された場合もCaseを増やすだけなので、修正範囲を最小限に抑えられます。
Sub CompareDepartment()
'部署名を管理する変数
Dim departmentName As String
departmentName = "営業部"
Select Case departmentName
Case "営業部"
MsgBox "営業部の処理を実行します"
Case "総務部"
MsgBox "総務部の処理を実行します"
Case "経理部"
MsgBox "経理部の処理を実行します"
Case Else
MsgBox "対象外の部署です"
End Select
End Sub
このコードでは、
- 部署名を取得する
- Select Caseで比較する
- 一致したCaseだけ処理を実行する
- 一致しなければCase Elseが実行される
という流れになります。
If文でも同じ処理は実現できますが、部署が10個、20個と増えても読みやすさを維持できる点が大きなメリットです。
Select Case文とIf文のどちらを使うべきか迷う場合は、完全一致をIf文で判定する基本も確認しておくと、条件数に応じた使い分けがしやすくなります。詳しくは「【VBA】文字列の完全一致の処理(IF文)|実務で壊れない条件分岐の基本設計」で解説しています。
✅ VBAでSelect Case文を文字列比較に使うメリット
Select Case文は単にコードを短くするためのものではありません。
実務では保守性を高めるために使われることが多くあります。
条件分岐が複雑になるほど、その効果は大きくなります。
ここでは、If文との違いを踏まえながら見ていきましょう。
・If文より読みやすくなる理由
例えば部署ごとの処理をIf文で書くと、このようになります。
If departmentName = "営業部" Then
ElseIf departmentName = "総務部" Then
ElseIf departmentName = "経理部" Then
ElseIf departmentName = "人事部" Then
ElseIf departmentName = "情報システム部" Then
End If
条件が増えるたびに、
departmentName =
という比較を書き続ける必要があります。
一方、Select Caseなら比較対象は一度だけです。
Select Case departmentName
Case "営業部"
Case "総務部"
Case "経理部"
Case "人事部"
Case "情報システム部"
End Select
比較対象が明確なので、
- どこを比較しているか
- 条件がいくつあるか
- 新しい条件をどこへ追加するか
がすぐに分かります。
レビューや保守のしやすさも大きく向上します。
・仕様変更にも強いコードになる理由
実務では仕様変更が頻繁に発生します。
例えば新しい部署が追加された場合、
Case "品質管理部"
を追加するだけで済みます。
If文の場合はElseIfを追加する位置を考える必要がありますが、Select CaseではCaseを並べるだけなので修正ミスも起こりにくくなります。
また、コードレビューでもCaseごとに確認できるため、修正箇所を把握しやすくなります。
このような理由から、多くの実務コードでは同じ変数を何度も比較する場合はSelect Caseが選ばれることが少なくありません。
・実務では意味が伝わる変数名を使おう
サンプルでは
departmentName
という変数名を使用しました。
実務では、
Dim str As String
や
Dim a As String
のような名前では、何を比較しているのかが分かりません。
数か月後にコードを見返したときや、別の担当者へ引き継ぐときにも理解しやすいよう、
- departmentName
- employeeStatus
- productCategory
- fileType
など、役割が分かる名前を付けることをおすすめします。
意味のある変数名は、コードの品質を高める重要なポイントの一つです。
Select Case文の内部では文字列の一致を基準に処理が分岐しますが、VBAにおける文字列比較の仕組みをより深く理解するには、比較演算子の基本も重要です。「【VBA】演算子で文字列を比較する方法|一致判定・大小比較・注意点を実務で理解する」もあわせてご覧ください。
✅ VBAのSelect Case文で複数の文字列をまとめて比較する方法
実務では、1つの処理に対して対象となる文字列が複数存在することがあります。
例えば、「営業部」と「営業推進部」は同じ営業系の処理を実行したい、といったケースです。
このような場合にCaseを1つずつ分けると、同じ処理を何度も書くことになり、修正漏れが起きやすくなります。
Select Case文では、複数の文字列をカンマで区切って1つのCaseにまとめられます。
ただし、似た名称を安易にまとめると、本来別の処理にすべき対象まで同じ扱いになる可能性があります。
処理内容が本当に共通しているかを確認したうえで使うことが重要です。
・複数の部署名を1つのCaseで判定する方法
次の例では、営業関連の部署と管理関連の部署をそれぞれまとめて判定します。
同じ処理を複数のCaseへ重複して書くのではなく、共通する条件を1か所にまとめることで、後からメッセージや処理内容を変更しやすくしています。
Sub ClassifyDepartment()
'判定対象となる部署名を格納
Dim departmentName As String
departmentName = "営業推進部"
Select Case departmentName
Case "営業部", "営業推進部", "法人営業部"
MsgBox "営業部門向けの処理を実行します。"
Case "総務部", "人事部", "経理部"
MsgBox "管理部門向けの処理を実行します。"
Case Else
MsgBox "登録されていない部署です。"
End Select
End Sub
処理の流れは次のとおりです。
departmentNameに判定対象の部署名を格納する- 営業系のいずれかに一致すれば営業部門向け処理を実行する
- 管理系のいずれかに一致すれば管理部門向け処理を実行する
- どの条件にも一致しなければCase Elseへ進む
複数条件をまとめる方法は、同じ処理を何度も記述しなくて済む点がメリットです。
一方で、対象文字列が増えすぎると1行が長くなり、かえって読みづらくなります。
条件が多い場合は、処理区分そのものを見直すか、別の表から分類情報を取得する設計も検討するとよいでしょう。
✅ VBAのSelect Case文で大文字・小文字を比較するときの注意点
VBAの文字列比較では、大文字と小文字の扱いを曖昧にすると、環境や設定によって判定結果が変わる可能性があります。
特に商品コード、ファイル種別、英字のステータス値などを扱う場合は注意が必要です。
見た目がほぼ同じ文字列でも、比較ルールによっては一致しないことがあります。
一方で、すべての場面で大文字と小文字を区別すればよいわけでもありません。
利用者が手入力する値では、入力揺れを吸収した方が使いやすいこともあります。
比較前に文字列を統一するか、あえて厳密に区別するかを、業務ルールに合わせて決めることが重要です。
・UCase関数で文字列を統一してから比較する方法
ユーザーが入力した英字を比較する場合は、比較前に大文字へ統一しておくと安全です。
次の例では、入力値がapproved、Approved、APPROVEDのどれであっても同じ結果になります。
Sub CheckApprovalStatus()
'入力されたステータスを格納
Dim approvalStatus As String
approvalStatus = Range("B2").Value
'前後の余分な空白を除去し、大文字に統一して比較
Select Case UCase$(Trim$(approvalStatus))
Case "APPROVED"
MsgBox "承認済みの処理を実行します。"
Case "PENDING"
MsgBox "承認待ちです。"
Case "REJECTED"
MsgBox "却下されたデータです。"
Case Else
MsgBox "ステータスの入力内容を確認してください。"
End Select
End Sub
この書き方では、Trim$で前後の空白を削除し、UCase$で大文字へ統一しています。
単純にSelect Caseへセルの値を渡す方法と比べ、手入力による余分な空白や大文字・小文字の違いを吸収できる点がメリットです。
特に外部システムからコピーした値や、複数の担当者が入力する表では、見えない空白や表記揺れが原因で判定に失敗することがあります。
ただし、商品コードのように大文字と小文字を別の値として扱う必要がある場合は、勝手に統一してはいけません。
比較前の文字列加工は、業務ルールに合わせて使い分ける必要があります。
大文字・小文字の違いを吸収して比較したい場合は、LCase関数やUCase関数を使う方法もあります。表記揺れを防ぐ具体的な考え方は「【VBA】大文字・小文字を区別しない比較方法|LCase・UCaseの使い方と実務活用」で詳しく解説しています。
✅ Select Case文で完全一致以外の文字列を判定する考え方
Select Case文は、基本的に指定した値との一致判定に向いています。
そのため、「文字列に特定の語句が含まれているか」「文字列が特定の文字で始まるか」といった部分一致の処理には、そのままでは使いにくい場面があります。
ここを理解せずに無理にSelect Caseだけで処理しようとすると、条件が複雑になり、読みづらいコードになりがちです。
部分一致にはInStr関数やLike演算子を使う方が分かりやすい場合があります。
Select Caseは万能な構文ではなく、比較対象や条件の性質によって使い分けることが大切です。
完全一致の条件が並ぶ場合はSelect Case、柔軟な文字列検索が必要な場合はIf文を選ぶという判断が基本になります。
・完全一致はSelect Case、部分一致はIf文が分かりやすい
例えば、備考欄に「至急」という文字が含まれているかを判定する場合、次のようにIf文を使う方が自然です。
Sub CheckRemarks()
'備考欄の内容を格納
Dim remarksText As String
remarksText = Range("C2").Value
If InStr(1, remarksText, "至急", vbTextCompare) > 0 Then
MsgBox "至急対応が必要です。"
Else
MsgBox "通常処理として扱います。"
End If
End Sub
このような部分一致をSelect Caseで表現しようとすると、条件の意図が見えにくくなることがあります。
一方、次のようにステータスが明確に決まっている場合はSelect Caseが適しています。
Select Case statusName
Case "未処理"
'未処理データの処理
Case "処理中"
'処理中データの処理
Case "完了"
'完了データの処理
End Select
構文を選ぶときは、短く書けるかどうかだけでなく、後から見た人が条件の意味を理解しやすいかを基準にするとよいでしょう。
Select Case文は完全一致の判定に向いていますが、文字列に特定の語句が含まれているかを調べる場合はInStr関数が適しています。部分一致の判定方法は「【VBA】(セル内)特定の文字の最初の位置を検索(InStr関数の使用方法)」で詳しく解説しています。
✅ VBAのSelect Case文を実務で活用する文字列比較の例
Select Case文は、部署名やステータスの判定だけでなく、ファイル種別、商品区分、申請状態など、さまざまな業務で活用できます。
ただし、実務コードではセルを直接何度も参照するより、いったん変数へ値を取得してから判定する方が読みやすくなります。
また、対象シートを明示しないコードは、別のシートがアクティブになったときに誤動作する可能性があります。
動作確認時には問題がなくても、別の処理と組み合わせたときに不具合が発生することがあります。
そのため、対象のワークシートを変数で管理し、どのセルを判定しているかを明確にすることが重要です。
ここでは、実務で流用しやすい形に整えた例を見ていきます。
・申請ステータスに応じてセルへ結果を出力する方法
次のコードでは、申請ステータスに応じて、隣のセルへ対応内容を出力します。
対象シートを明示し、入力値と出力先を分けて管理することで、別シートや別列へ変更するときにも修正しやすい構成にしています。
Sub UpdateApplicationResult()
'対象のワークシート
Dim targetWorksheet As Worksheet
'申請ステータスと出力メッセージ
Dim applicationStatus As String
Dim resultMessage As String
Set targetWorksheet = ThisWorkbook.Worksheets("申請一覧")
'B2セルから申請ステータスを取得
applicationStatus = Trim$(targetWorksheet.Range("B2").Value)
Select Case applicationStatus
Case "未確認"
resultMessage = "担当者による確認が必要です。"
Case "確認中"
resultMessage = "現在確認作業を進めています。"
Case "承認"
resultMessage = "申請は承認されました。"
Case "差戻し"
resultMessage = "内容を修正して再申請してください。"
Case Else
resultMessage = "申請ステータスが正しくありません。"
End Select
'判定結果をC2セルへ出力
targetWorksheet.Range("C2").Value = resultMessage
End Sub
このコードでは、Select Caseの中で直接セルへ書き込まず、まずresultMessageへ結果を格納しています。
直接書き込む方法でも動作しますが、出力先が変わった場合に複数箇所を修正しなければならない可能性があります。
結果を変数へまとめておけば、最後の出力処理を変更するだけで、メッセージボックスへの表示や別シートへの出力にも流用できます。
また、ThisWorkbook.Worksheets("申請一覧")のように対象シートを明示しているため、アクティブシートに依存しません。
実務では、処理途中で別のシートが選択されることもあるため、Rangeだけを記述するより安全です。
セルから取得したValueが常に文字列になるとは限りません。数値・日付・エラー値などをSelect Caseで扱う場合の型変換については、「【VBA】Valueは文字列として扱える?型変換が必要なケースと実務判断を解説」で詳しく解説しています。
✅ Select Case文とIf文を使い分ける判断基準
Select Case文とIf文は、どちらか一方だけを使えばよいわけではありません。
条件の種類に合わせて使い分けることで、コードは分かりやすくなります。
すべての条件分岐をSelect Caseへ置き換えると、かえって複雑になる場合もあります。
反対に、同じ変数を何度も比較する処理をIf文だけで書くと、条件が増えるほど読みづらくなります。
重要なのは、構文の好みではなく、条件の意図が伝わるかどうかです。
実務では、将来条件が増える可能性や、別の担当者が保守することも考えて選ぶ必要があります。
次の基準を目安にすると判断しやすくなります。
・Select Case文が向いている条件
Select Case文は、次のような場合に向いています。
- 同じ変数を複数の値と比較する
- ステータスや区分が明確に決まっている
- 今後、条件が追加される可能性がある
- 条件ごとの処理を一覧で確認したい
- Case Elseで想定外の値を処理したい
例えば、部署、商品区分、申請状態、曜日、ファイル種別などの判定に適しています。
・If文が向いている条件
If文は、次のような場合に向いています。
- 複数の変数を組み合わせて判定する
- AndやOrを使った複合条件がある
- 文字列の部分一致を判定する
- 数値と文字列を同時に確認する
- 条件が1つか2つだけである
例えば、「部署が営業部で、売上が100万円以上」のような条件はIf文の方が自然です。
If departmentName = "営業部" And salesAmount >= 1000000 Then
MsgBox "営業部の高額売上データです。"
End If
無理にSelect Caseへ統一せず、処理内容に合った構文を選ぶことが、保守しやすいコードにつながります。
✅ Select Case文で文字列を比較するときの実務上の注意点
Select Case文は読みやすい構文ですが、比較する文字列が正しく整っていることが前提です。
実務データには、全角・半角の違い、余分な空白、改行、表記揺れなどが含まれることがあります。
画面上では同じように見えても、VBAでは異なる文字列として扱われる場合があります。
その結果、該当するCaseがあるのにCase Elseへ進んでしまうことがあります。
この問題を防ぐには、比較前に値を整える処理と、想定外の値を確認できる仕組みが必要です。
Case Elseを省略せず、未登録の値を検知できるようにしておくと、データの問題にも気づきやすくなります。
・余分な空白や表記揺れを確認する
例えば、セルに「承認」と入力されているように見えても、実際には末尾に空白が含まれていることがあります。
applicationStatus = Trim$(targetWorksheet.Range("B2").Value)
このようにTrim関数を使えば、文字列の前後にある半角スペースを取り除けます。
ただし、文字列の途中にある空白や全角スペースまでは削除されません。
業務上不要な空白をすべて除去する場合は、Replace関数を組み合わせる方法もあります。
applicationStatus = Replace$(applicationStatus, " ", "")
applicationStatus = Replace$(applicationStatus, " ", "")
一方で、「営業 第一課」のように空白自体が正式名称の一部である場合は、削除すると誤判定につながります。
文字列を整える処理は、対象データのルールを確認してから実装する必要があります。
・Case Elseで想定外の値を見逃さない
Case Elseは必須ではありませんが、実務ではできる限り記述することをおすすめします。
Case Else
MsgBox "未登録のステータスです:" & applicationStatus
想定外の値をそのまま表示すれば、どの文字列が一致しなかったのかを確認できます。
何も処理しないまま終了すると、正常に処理されたのか、条件に一致しなかったのか判断できません。
特に大量データを処理する場合は、メッセージボックスではなく、エラーログや確認用シートへ記録する方法も有効です。
余分な半角・全角スペースが原因でCaseに一致しない場合は、Trim関数やReplace関数を使って比較前の文字列を整える必要があります。具体的な使い分けは「【VBA】スペースを一括削除する方法|Replace関数・Trim関数の使い分けと実務活用」で解説しています。
✅ まとめ:VBAのSelect Case文で文字列比較を読みやすく設計しよう
- Select Case文は、同じ変数を複数の文字列と比較するときに適している
- 複数の文字列は、カンマで区切って1つのCaseにまとめられる
- 大文字・小文字や余分な空白は、比較前に整えると判定ミスを防ぎやすい
- 完全一致にはSelect Case、部分一致や複合条件にはIf文が向いている
- 対象のワークシートやセルを明示すると、アクティブシートによる誤動作を防げる
- 判定結果を変数へ格納すると、出力先の変更や再利用がしやすくなる
- Case Elseを用意して、想定外の文字列を見逃さないことが重要
Select Case文は、単にIf文を短く置き換えるための構文ではありません。
条件を一覧で確認しやすくし、追加や変更に強いコードを作るための手段です。
文字列の完全一致が複数並ぶ処理ではSelect Case文を活用し、部分一致や複合条件ではIf文を選ぶことで、実務でも読みやすく保守しやすいVBAコードを作成できます。