HOME > 即効テクニック > Excel VBA > セル操作関連のテクニック > 複雑な条件分岐にSelect Caseの裏技を使う

複雑な条件分岐にSelect Caseの裏技を使う|Excel VBA

セル操作関連のテクニック

複雑な条件分岐にSelect Caseの裏技を使う

(Excel 97/2000/2002/2003/2007/2010/2013/2016)

セルの値が「100だったら」「そうでなかったら」という二値で処理を分岐するには、Ifステートメントを使います。

Sub Sample1()
    If Range("A1").Value = 100 Then
        MsgBox "100です"
    Else
        MsgBox "100ではありません"
    End If
End Sub

二値ではない条件で処理を分岐するときはSelect Caseを使います。

Sub Sample2()
    Select Case Range("A1").Value
    Case Is < 50
        MsgBox "50未満です"
    Case 50
        MsgBox "50です"
    Case Is > 50
        MsgBox "50超です"
    End Select
End Sub

このように、Select Caseでは評価対象(ここではRange("A1").Value)を条件式の中で使う場合、Isというキーワードを使います。このIsは、式の左側にしか指定できません。「Case 50 < Is」という書き方はエラーになります。

では、セルA1に文字列が入力されていて、

(1)左端1文字が"A"だったら、処理1を実行する
(2)右端1文字が"B"だったら、処理2を実行する

という動作をSelect Caseで実現するにはどうしたらいいでしょう。
先に書いたように、キーワードのIsは式の左端にしか使えませんので、「Case Left(Is, 1) = "A"」のようにはできません。そこで、次のようにしてみました。

Sub Sample3()
    Select Case Range("A1").Value
    Case Left(Range("A1").Value, 1) = "A"
        MsgBox "Aです"  ''処理1
    Case Right(Range("A1").Value, 1) = "B"
        MsgBox "Bです"  ''処理2
    End Select
End Sub

実行してみると分かりますが、セルA1に「A123」や「123B」が入力されていても望むように条件分岐してくれません。

これは、Select Caseが

評価対象:Range("A1").Value
分岐条件:Left(Range("A1").Value, 1) = "A"

を比較しているからです。
両者の比較結果がTrueにならないので、どれにも一致しないことになります。

こんなときは、先頭行の評価対象にTrueを指定します。

Sub Sample4()
    Select Case True
    Case Left(Range("A1").Value, 1) = "A"
        MsgBox "Aです"  ''処理1
    Case Right(Range("A1").Value, 1) = "B"
        MsgBox "Bです"  ''処理2
    End Select
End Sub

評価対象:True
分岐条件:Left(Range("A1").Value, 1) = "A"

となりますので、どんな条件でも必ず評価されます。
これを応用すると、次のような複雑な条件分岐も実現できます。

Sub Sample5()
    Select Case True
    Case Left(Range("A1").Value, 1) = "A"
        ''処理1
    Case Right(Range("B2").Value, 1) = "B"
        ''処理2
    Case Mid(Range("C3").Value, 3, 1) = "C"
        ''処理3
    End Select
End Sub