こんにちは!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` を取り入れてみてくださいね。応援しています!
