では、先ほどの 3段階ネストの Select Case を、もっとコンパクトに書く方法 を解説します。初心者でも理解できるようにステップごとに説明します。
1. 問題点
先ほどの例はネストが深く、コードの行数が多くて読みにくくなります。
Select Case 性別
Case "男"
Select Case 年齢
Case 20 To 30
Select Case 職業
…というように 3段階もネストしているため、コードの可読性が低いのが問題です。
2. コンパクト化の基本アイデア
方法1:内側の条件を 文字列連結でまとめて判断
- 性別+年齢+職業を一つの文字列にして、
Select Caseで判定する - ネストを減らせる
例:
Sub 性別年齢職業判定_簡易版()
Dim gender As String
Dim age As Integer
Dim job As String
Dim key As String
gender = Range("A1").Value
age = Range("B1").Value
job = Range("C1").Value
' 年齢カテゴリを作る
Dim ageCategory As String
Select Case age
Case 20 To 30
ageCategory = "若い"
Case 31 To 50
ageCategory = "中年"
Case Is >= 51
ageCategory = "シニア"
Case Else
ageCategory = "不明"
End Select
' 性別+年齢カテゴリ+職業をキーにする
key = gender & "_" & ageCategory & "_" & job
Select Case key
Case "男_若い_学生"
MsgBox "若い男性の学生です"
Case "男_若い_会社員"
MsgBox "若い男性の会社員です"
Case "女_中年_自営業"
MsgBox "中年女性の自営業です"
Case "男_シニア_会社員"
MsgBox "シニア男性の会社員です"
Case Else
MsgBox "不明またはその他の組み合わせです"
End Select
End Sub
Javaポイント
- 年齢カテゴリを変数に分けて計算
→ これで中間のネストを削除 - 性別+年齢カテゴリ+職業を文字列として結合
→ 1回のSelect Caseでまとめて判定可能 - ネストが浅くなるので コードが読みやすくなり、保守もしやすい
方法2:関数化して整理
- 「年齢カテゴリを返す関数」や「メッセージを作る関数」を作ることで、さらに読みやすくなる
Function 年齢カテゴリ(age As Integer) As String
Select Case age
Case 20 To 30
年齢カテゴリ = "若い"
Case 31 To 50
年齢カテゴリ = "中年"
Case Is >= 51
年齢カテゴリ = "シニア"
Case Else
年齢カテゴリ = "不明"
End Select
End Function
Sub 性別年齢職業判定_関数版()
Dim gender As String, age As Integer, job As String
Dim key As String
gender = Range("A1").Value
age = Range("B1").Value
job = Range("C1").Value
key = gender & "_" & 年齢カテゴリ(age) & "_" & job
Select Case key
Case "男_若い_学生"
MsgBox "若い男性の学生です"
Case "女_中年_会社員"
MsgBox "中年女性の会社員です"
Case Else
MsgBox "不明またはその他の組み合わせです"
End Select
End Sub
Javaメリット
- ネストがほとんどなく、コードがスッキリ
- 条件を変えたい場合も 関数や文字列を修正するだけ
- 初心者でも理解しやすく、バグが入りにくい
💡 補足:
- 条件が増えると、ネストが深くなるより 文字列や関数で整理する方が実務向き
- もし組み合わせが非常に多い場合は、配列や Dictionary を使った判定も可能
