複雑な条件分岐にSelect Caseの裏技を使う|Excel VBA |
セルの値が「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