【入門編】Select Case文で複雑な条件分岐を整理する:If文の乱用からの脱却 – Excel VBA解析バイブル

スポンサーリンク

こんにちは!Excel VBAの世界へようこそ。
マクロの記録ボタンを押してコードを生成する日々から一歩進み、「自分で意のままにロジックを組み立てたい」と思えるようになったなら、あなたはもう立派なプログラミングの探求者です。

現場でよく見かけるのが、`If`文が何重にもネスト(入れ子)になり、まるで迷路のように入り組んだコードです。「条件を追加してほしい」と言われた瞬間に冷汗が流れるような、あのスパゲッティコードを見たことはありませんか?

今回は、その『If文の乱用』から綺麗に脱却し、メンテナンス性が高く美しいコードを書くための奥義「Select Case文」について、実務に直結する知見を交えてお伝えします。ここをクリアすれば、あなたの書くVBAコードの質は一段と洗練されますよ。

1. なぜ「If文の乱用」は現場で嫌われるのか?

プログラミングを学び始めると、最初に覚える条件分岐は間違いなく `If…Then…Else` ですよね。これは非常に直感的で強力ですが、判定すべき条件が増えた途端にその牙をむきます。

例えば、「売上金額に応じて評価ランク(S, A, B, C)を判定する」という処理を考えてみましょう。

❌ 息が詰まるようなIf文の連鎖(アンチパターン)

If sales >= 1000000 Then
rank = “S”
Else
If sales >= 500000 Then
rank = “A”
Else
If sales >= 100000 Then
rank = “B”
Else
rank = “C”
End If
End If
End If

…どうでしょう。`End If` が階段状に並び、右へ右へとコードが押しやられていますよね。これを「右への大行進(Arrow Anti-pattern)」と呼びます。可読性が著しく低く、条件の抜け漏れや、`Else` とどの `If` がペアになっているのかを見失う原因になります。

2. 救世主「Select Case文」の基本構造

ここで登場するのが `Select Case` です。
1つの「評価対象(変数や式)」を置き、それに対する無数の「場合(Case)」を縦に並べてスッキリと整理できるのが最大の特長です。

⭕ Select Caseによる美しい条件分岐

Select Case sales
Case Is >= 1000000
rank = “S”
Case Is >= 500000
rank = “A”
Case Is >= 100000
rank = “B”
Case Else
rank = “C”
End Select

圧倒的に読みやすいですよね!
上から順に条件を評価し、最初に合致したブロックを実行したら、残りの条件をスルーして `End Select` の外へジャンプするというスマートな仕組みになっています。

3. 実務で使える!Select Caseの多彩な表現パターン

`Select Case` の真骨頂は、単なる「一致」だけでなく、様々な条件の書き方ができる点にあります。現場で即戦力となる4つの書き方をマスターしましょう。

パターン①:複数の値をまとめて処理する(カンマ区切り)

例えば、「土曜日(土)または日曜日(日)」なら休日の判定をする場合です。

Dim dayOfWeek As String
dayOfWeek = Range(“A1”).Value

Select Case dayOfWeek
Case “土”, “日”
MsgBox “週末です!リフレッシュしましょう。”, vbInformation
Case “月”, “火”, “水”, “木”, “金”
MsgBox “平日の業務です。頑張りましょう!”, vbInformation
Case Else
MsgBox “正しい曜日を入力してください。”, vbExclamation
End Select

パターン②:値の範囲を指定する(Toキーワード)

「〇以上〜〇以下」という数値の範囲指定には `To` が使えます。スコアや年齢の判定に重宝します。

Dim score As Integer
score = Range(“B1”).Value

Select Case score
Case 80 To 100
MsgBox “素晴らしい!優秀です。”, vbInformation
Case 50 To 79
MsgBox “合格ラインです。”, vbInformation
Case 0 To 49
MsgBox “再テストが必要です。”, vbCritical
Case Else
MsgBox “無効なスコアです。”, vbExclamation
End Select

パターン③:比較演算子を使う(Isキーワード)

冒頭のランク分けでも使いましたが、「〇以上(`>=`)」などの比較演算子を使う場合は、`Case Is` と記述します。

Dim age As Integer
age = Range(“C1”).Value

Select Case age
Case Is < 20 MsgBox "未成年です。" Case Is >= 65
MsgBox “シニア層です。”
Case Else
MsgBox “一般成人の世代です。”
End Select

4. 陥りやすい罠とエンジニアの知見

ここで、実務で初心者がやりがちな「罠」と、それを回避するための知見をシェアしておきます。

⚠️ 注意点:上から順に評価される(フォールスルーの誤解)

一部のプログラミング言語(C言語など)では、`break` を書かないと次のケースに処理が流れる仕様(フォールスルー)がありますが、VBAの `Select Case` は、最初にヒットした1つのブロックだけを実行して自動的に抜けます。

そのため、「より限定的・厳密な条件を上に書く」という順番の美学が重要になります。

‘ 【NGな順序の例】
Select Case score
Case Is >= 50 ‘ ← 85点もここにヒットしてしまう!
MsgBox “合格”
Case Is >= 80 ‘ ← このコードには永遠にたどり着かない
MsgBox “優秀”
End Select

正しくは、厳しい条件(数値が大きい方)を上に持ってくるのが鉄則です。

まとめ:保守性の高いコードは「未来の自分」を救う

コードを書くとき、私たちはどうしても「動けばいいや」と思いがちです。しかし、数ヶ月後にそのコードを修正するのは、他ならぬ「未来のあなた」自身、あるいはあなたの同僚です。

  • 条件が3つ以上分岐するなら、まず `Select Case` が使えないか検討する
  • コードの見た目の美しさ(インデントと縦の並び)を意識する

たったこれだけの意識改革で、あなたのVBAコードの品質はプロフェッショナルな領域へと引き上げられます。

ここをクリアすれば、複雑な業務ロジックの組み立てだって怖くありません。ぜひ明日の実務から、美しい `Select Case` を取り入れてみてくださいね。応援しています!

タイトルとURLをコピーしました