VBAで条件分岐を作成していると、「複数の条件を満たした場合だけ処理を実行したい」という場面があります。
例えば、
- 売上金額が100万円以上かつ担当者が営業部の場合だけ処理する
- ステータスが「完了」で、さらに日付が今日以前なら実行する
- 商品カテゴリと在庫数の両方を判定したい
このような条件では、If...ThenでAndを使う方法はよく知られていますが、「Select CaseでもAND条件を使えるのでは?」と疑問に思う方も多いでしょう。
結論から言うと、Select Case文にはCase句で直接ANDを書くことはできません。
しかし、Select Case Trueを利用すれば、AND条件を含む複雑な条件分岐も見やすく記述できます。
この記事では、Select Case文でAND条件を実現する方法や、If文との違い、実務で保守しやすいコードを書くポイントまで詳しく解説します。
✅ VBAのSelect Case文でAND条件はそのまま使えない
「Case 〇〇 And △△」のように書けば動きそうに見えますが、実際にはSelect Case文の構文とは異なります。
この仕様を知らないままコードを書くと、構文エラーになったり、意図した判定にならなかったりするため注意が必要です。
まずは、なぜ直接ANDを書けないのかを理解しましょう。
・Case句ではAND演算子は使用できない
例えば、次のようなコードを書きたくなることがあります。
Select Case 売上金額
Case >= 1000000 And 担当部署 = "営業"
MsgBox "対象です"
End Select
しかし、このような書き方は構文エラーになります。
理由は、Caseでは
- 値
- 値の一覧
- 範囲(To)
- 比較演算子(Is)
などは指定できますが、ANDやORを利用した複数条件の論理式は指定できないためです。
・複数条件ならSelect Case Trueを利用する
複数条件を扱う場合は、実務でもよく利用される方法があります。
それが
Select Case True
という書き方です。
この方法では、
Case 条件式
が
TrueかFalse
として評価されます。
つまり、
Case 売上金額 >= 1000000 And 担当部署 = "営業"
というようなAND条件も自然に記述できます。
この書き方は条件が増えても整理しやすいため、実務でもよく採用されています。
AND条件だけでなく、ANDとORを組み合わせた複雑な条件分岐を設計したい場合は、【VBA】IF文のandとorを組み合わせた複数条件|実務で迷わない条件設計も参考になります。条件式を整理する考え方が分かると、Select CaseとIF文を状況に応じて使い分けやすくなります。
✅ 実務ではSelect Case Trueを使う理由
「If文でも書けるのに、なぜSelect Case Trueを使うのか」と疑問に思う方もいるでしょう。
実際、条件が2~3個程度ならIf文でも問題ありません。
しかし、実務では条件分岐が増えるケースが多く、保守性を考えるとSelect Case Trueの方が読みやすくなる場面があります。
・条件が増えても整理しやすい
例えば、
- 売上金額
- 担当部署
- ステータス
- 在庫数
- 日付
など、複数条件が増えてくるとIf文は次第に長くなります。
一方、Select Case Trueでは、それぞれの条件をCaseごとに分けて記述できるため、条件のまとまりが分かりやすくなります。
コードレビューや仕様変更の際にも、どの条件でどの処理が実行されるのか把握しやすいのがメリットです。
・条件追加がしやすい
業務では、
「来月から新しい条件を追加したい」
というケースも珍しくありません。
If文では途中にElseIfを追加すると全体を見直す必要がありますが、Select Case TrueならCaseを追加するだけで済む場合が多くあります。
そのため、将来的な仕様変更にも対応しやすくなります。
条件分岐が増えた場合は、Select CaseだけでなくElseIfを利用した設計も選択肢になります。【VBA】IF文のElseIfを用いた複数条件|ネストを防ぎ実務で壊れない条件分岐を書く方法では、それぞれの使い分けを実務目線で解説しています。
✅ 保守しやすいAND条件の書き方
動作するコードを書くことだけを目的にすると、条件式を1行に詰め込んでしまいがちです。
しかし、実務では数か月後や数年後に自分や別の担当者が修正する可能性があります。
そのため、「何を判定しているコードなのか」がすぐ分かる書き方を意識することが重要です。
・条件の意味が分かる変数名を使う
今回のサンプルでは、判定対象が分かる変数名を利用しています。
salesAmountdepartmentNameorderStatus
など、役割が明確な名前にしておくことで、コードを読むだけで処理内容を理解しやすくなります。
・コメントで判定内容を明確にする
条件が複雑になる場合は、コメントも重要です。
例えば、
'営業部かつ売上100万円以上
というコメントを付けておけば、後からコードを見返した際にも意図が伝わります。
単に動作するコードではなく、「保守しやすいコード」を目指すことが、実務では非常に重要です。
条件式が長くなる場合は、括弧を使ったグループ化も重要になります。可読性を保ちながら誤判定を防ぐ方法については、【VBA】IF文の括弧を用いた複数条件|可読性と誤判定を防ぐ設計手法で詳しく紹介しています。
✅ 条件が増えても読みやすい実務向けコード
ここでは、実際の業務を想定した保守しやすい書き方を紹介します。
このコードでは、売上金額と担当部署を組み合わせて判定していますが、変数名やコメントを工夫することで、後から条件を追加しやすい構成にしています。
また、Select Case Trueを採用することで、条件ごとの処理が一目で分かるようにしています。単に動作するだけでなく、数か月後に見返しても理解しやすいコードを意識することが、実務では重要です。
Sub CheckSalesCategory()
Dim salesAmount As Long
Dim departmentName As String
salesAmount = 1200000
departmentName = "営業"
Select Case True
'営業部かつ売上100万円以上
Case salesAmount >= 1000000 And departmentName = "営業"
MsgBox "営業部の重点管理対象です。"
'営業部かつ売上50万円以上
Case salesAmount >= 500000 And departmentName = "営業"
MsgBox "営業部の通常管理対象です。"
Case Else
MsgBox "通常処理です。"
End Select
End Sub
✅ この書き方が実務で選ばれる理由
コードは「動けばよい」という考え方で書くこともできます。しかし、実務では後から条件が追加されたり、別の担当者が修正したりすることを前提に設計することが重要です。
今回のコードでは、単にAND条件を実現するだけではなく、「読みやすさ」「修正しやすさ」「再利用しやすさ」を意識しています。
ここでは、その設計意図を詳しく見ていきましょう。
・条件ごとに役割を分けて読みやすくしている
Select Case Trueでは、1つの条件ごとにCaseを分けて記述できます。
例えば、
- 営業部で売上100万円以上
- 営業部で売上50万円以上
- その他
というように条件を整理できるため、「どの条件でどの処理が実行されるのか」が一目で分かります。
もし条件が10個以上になっても、それぞれを独立したCaseとして管理できるため、コード全体の見通しが良くなります。
・意味が分かる変数名で保守性を高めている
実務では、変数名だけで処理内容を理解できることが理想です。
例えば、
Dim a As Long
Dim b As String
のような名前では、何を表しているのか分かりません。
一方、
salesAmountdepartmentName
のように役割が分かる名前にしておけば、コメントを読まなくても処理内容を把握しやすくなります。
将来的にコードを修正する場合も、変数名が明確であれば誤修正のリスクを減らせます。
AND条件では比較演算子を組み合わせて判定する場面も多くあります。比較演算子の使い方や条件設計の考え方については、【VBA】比較演算子を用いた複数条件の使用方法|実務で迷わない条件分岐の設計も参考にしてください。
✅ If文でAND条件を書く場合との違い
「AND条件ならIf文でも書けるのでは?」と思う方もいるでしょう。
実際、その考え方は間違いではありません。
重要なのは、「どちらが優れているか」ではなく、条件の数や処理内容に応じて使い分けることです。
・条件が少ないならIf文でも十分
例えば、判定が1〜2個程度であれば、If文の方がシンプルです。
If salesAmount >= 1000000 And departmentName = "営業" Then
MsgBox "営業部の重点管理対象です。"
End If
このようなコードであれば、十分読みやすく、無理にSelect Caseを使う必要はありません。
・条件が増えるならSelect Case Trueが有利
一方で、次のような条件が増えてくるとどうでしょうか。
- 営業部
- 総務部
- 経理部
- 開発部
- 売上条件
- 在庫条件
- 日付条件
- ステータス条件
これらをIf~ElseIfで並べると、条件式が長くなり、全体の流れを把握しにくくなります。
その点、Select Case TrueならCaseごとに条件を整理できるため、仕様変更時にも追加・削除がしやすくなります。
実務では、「今の条件数」だけでなく、「将来条件が増える可能性」も考慮して選択することが大切です。
IF文ではANDだけでなく、ORを複数組み合わせた条件分岐を書く場面もあります。条件が増えた場合の整理方法については、【VBA】IF文のORを3つ以上組み合わせた複数条件|実務で崩れない条件分岐の設計方法で詳しく解説しています。
✅ OR条件との組み合わせも可能
Select Case Trueのメリットは、AND条件だけでなくOR条件とも組み合わせられることです。
例えば、
- 営業部または総務部
- 売上100万円以上
- ステータスが「完了」
のような複雑な条件でも、1つのCaseにまとめて記述できます。
Case (departmentName = "営業" Or departmentName = "総務") _
And salesAmount >= 1000000
このように書けば、複数の条件をまとめて判定できます。
ただし、条件が長くなり過ぎると可読性が低下します。
その場合は、
- 判定を別の関数に分ける
- 条件を変数へ代入する
など、処理を整理することも検討しましょう。
Select Case Trueは、TrueまたはFalseで条件を判定する仕組みを利用しています。Boolean型の基本やTrue/Falseの考え方について詳しく知りたい方は、【VBA】Boolean型とは?True/Falseの使い方と実務での注意点を徹底解説もあわせてご覧ください。
✅ 実務でAND条件を扱うときの注意点
AND条件は便利ですが、使い方によっては保守しにくいコードになることがあります。
最後に、実務で意識したいポイントを紹介します。
・条件を1行に詰め込み過ぎない
例えば、
Case 条件A And 条件B And 条件C And 条件D And 条件E
のようなコードは、一見コンパクトですが、後から読み返すと内容を理解するのに時間がかかります。
条件が多い場合は、変数へ分けたり、判定処理を関数化したりして整理する方が保守しやすくなります。
・判定順も意識する
Select Case Trueでは、最初にTrueになったCaseだけが実行されます。
そのため、
- 条件が厳しいもの
- 優先度が高いもの
を上に配置することが重要です。
例えば、
Case salesAmount >= 1000000
Case salesAmount >= 500000
の順なら問題ありません。
逆にすると、100万円以上でも50万円以上のCaseで処理が終了してしまいます。
条件が重複する場合は、判定順まで含めて設計しましょう。
・将来の仕様変更も見据えて書く
実務では、
- 新しい部署が追加される
- 判定金額が変更される
- 条件が増える
といった仕様変更がよくあります。
そのため、最初から「後で条件を追加しやすい構成」を意識しておくと、修正範囲を最小限に抑えられます。
Select Case Trueは、このような将来的な変更にも対応しやすい書き方の一つです。
実際の業務では、AND条件を利用してデータを抽出する場面も多くあります。実務での活用例については、【VBA】条件に合うデータを抽出する方法|For文・IF文で実務データを自在に扱うで詳しく紹介しています。
今回紹介したAND条件は、実際のデータ抽出処理でも頻繁に利用します。複数条件を使った実践的な抽出方法については、【VBA】複数条件でデータ抽出する方法|実務で使える安定設計と高速化テクニックもぜひ参考にしてください。
✅ まとめ:Select Case文でAND条件を使うならSelect Case Trueを活用しよう
Select Case文では、Case句に直接AND条件を書くことはできません。
しかし、Select Case Trueを利用することで、AND条件やOR条件を含む複数条件を分かりやすく記述できます。
特に条件分岐が多くなる実務では、保守性や可読性の向上につながるため、多くの場面で活用できる書き方です。
今回の記事のポイントをまとめると、次のとおりです。
- Select Case文ではCase句に直接AND条件は記述できない
- 複数条件を扱う場合は
Select Case Trueを利用する - 条件が増えるほどIf文より整理しやすくなる
- 意味が分かる変数名やコメントを付けることで保守性が向上する
- 条件の優先順位や将来の仕様変更も考慮して設計することが重要
Select Case Trueを正しく活用すれば、複雑な条件分岐でも読みやすく、修正しやすいコードを書けるようになります。実務で長く運用されるVBAだからこそ、「動けばよい」ではなく、「後から見ても理解しやすいコード」を意識して設計していきましょう。