VBA Select Caseステートメント
In this Article
VBAでは、Select CaseステートメントがIf-Thenステートメント条件を満たすかどうかをテストし、それぞれの条件に対して特定のコードを実行することができます。処理する条件が複数ある場合は、If文よりもSelect文の方が適しています。
Select Caseの例
この例では、YesNoCancelメッセージボックスでユーザにプロンプトを表示し、ユーザがどのオプションを選択したかをテストします。
Sub Select_Case_Yes_No_Cancel()
Dim nResult As VbMsgBoxResult
nResult = MsgBox("...", vbYesNoCancel)
Select Case nResult
Case vbYes
MsgBox "はい"
Case vbNo
MsgBox "いいえ"
Case vbCancel
MsgBox "キャンセル"
End Select
End Sub
以下は、代わりにIf文を使って同等のことを書いています。Case Select ステートメントを使用すると、入力が若干少なくなることに気づくでしょう。この利点は、複数の条件をテストするときに大きくなります。
Sub If_Yes_No_Cancel()
Dim nResult As VbMsgBoxResult
nResult = MsgBox("...", vbYesNoCancel)
If nResult = vbYes Then
MsgBox "はい"
ElseIf nResult = vbNo Then
MsgBox "いいえ"
ElseIf nResult = vbCancel Then
MsgBox "キャンセル"
End If
Sub Sub
Caseステートメントの構文
Select Caseステートメントの構文は以下のとおりです。
Select Case [テスト式]
Case [条件1]
[条件1が真の場合の動作]
Case [条件2]
[条件2が真の場合の動作]
Case [条件n]
[条件nが真の場合の動作]
Case Else
[どれも当てはまらない場合の動作]
End Select
[テスト式] – 評価する値です。通常は変数です。
[条件nが真の場合の動作] – 条件が満たされた場合に実行するコードです(Ifステートメントと同様です)。
[条件n] – テストする条件です。条件をテストするには、さまざまな方法があります。以下では、それらについて説明します。
Caseステートメントは、TRUEであることが判明した最初の条件に対するコードを実行します。 条件を満たさない場合は、Else句が追加されていない限り、コードは実行されません。
セレクトケースの条件
セレクトケースは、数値とテキストの両方を評価するために使用できます。 まず、数値の評価にセレクトケースを使う方法を説明します。
完全一致 – 数値
Caseステートメントを使えば、簡単に完全一致をテストすることができます。
Case 10
または、カンマを加えて複数の数字が完全に一致するかどうかをテストします。
Case 20, 30, 40
Sub ExactMatch_Numbers()
Dim n As Integer
n = CInt(InputBox("..."))
Select Case n
Case 10
' nが10の場合
Case 20, 30, 40
' nが20/30/40の場合
Case Else
' nが10/20/30/40でない場合
End Select
End Sub
範囲
ある数字がある範囲に収まっているかどうかを調べるには、次のようにします。
Case 55 To 74
このプロシージャは、数値のスコアに基づいて、学生の文字スコアを生成します。
Sub Calc_Grade()
Dim Score As Integer
Dim LetterGrade As String
Score = InputBox("学生のスコアを入力してください")
Select Case Score
Case 90 To 100
LetterGrade = "A"
Case 80 To 90
LetterGrade = "B"
Case 70 To 80
LetterGrade = "C"
Case 60 To 70
LetterGrade = "D"
Case Else
LetterGrade = "F"
End Select
MsgBox "生徒の成績は " & LetterGrade & " です"
End Sub
また、Case Isを使用して範囲をテストすることもできます。
Select Case Is
Case Is < 55
'何もしない
Case <= 74
MsgBox "範囲内"
Caseステートメントは、最初のマッチングに対してのみコードを実行することを忘れないでください。 このプロシージャは、Case To の代わりに Case Is を使って生徒の成績を計算します。
Sub Select_Case_Is_Grade()
Dim Score As Integer
Dim LetterGrade As String
Score = InputBox("学生のスコアを入力")
Select Case Score
Case Is >= 90
LetterGrade = "A"
Case Is >= 80
LetterGrade = "B"
Case Is >= 70
LetterGrade = "C"
Case Is >= 60
LetterGrade = "D"
Case Else
LetterGrade = "F"
MsgBox "生徒の成績は " & LetterGrade & " です"
End Sub
Case Else
Caseステートメントの最後に “Case Else “を追加すると、条件を満たさなかった場合の処理を記述できます。
Case Else
Case Elseの使い方は、直前のコードサンプルの最後をご覧ください。
Select Case – テキストとLike演算子
これまで、Select Caseの例では数値のみを扱ってきました。 テキストでもSelect Caseステートメントを使用することができます。
テキストの完全一致
このように、式が完全なフレーズにマッチするかどうかをテストすることができます。
Case "Beets"
また、カンマを使用すると、複数のフレーズに完全に一致するかどうかをテストできます。
Case "アップル", "バナナ", "オレンジ"
まとめると次のようになります。
Sub ExactMatch_Food()
Select Case Range("a1").Value
Case "ビーツ"
MsgBox "野菜"
Case "アップル", "バナナ", "オレンジ"
MsgBox "果物"
End Select
End Sub
大文字と小文字
デフォルトでは、VBAは大文字と小文字を区別します。つまり、「Text」と「text」は異なるテキストとして扱われるということです。大文字小文字を区別しないようにするには、モジュールの先頭にOption Compare Textを追加します。
Option Compare Text
この例では、テキストを扱うときに大文字と小文字を区別しないSelect Caseを行います。
Option Compare Text
Sub ExactMatch_Food()
Select Caes Range("a1").Value
Case "ビーツ"
MsgBox "野菜"
Case "アップル", "バナナ", "オレンジ"
MsgBox "果物"
End Select
End Sub
Case Like
Like 演算子を使うと、曖昧な比較を行うことができます。 テキストがマッチすればLikeはTRUEを返し、マッチしなければFALSEを返します。 このため、Like 演算子は If 文で簡単に使用できますが、Case 文ではそう簡単には使用できません。
Case Like – 失敗したテスト
次のコードは、Like演算子がSelect Caseでうまく行かない例を示しています。
Sub Select_Case_Like_DoesnotWork()
Dim word As String
word = "COCOA"
Select Case word
Case word Like "*C*C*"
MsgBox "いいね"
Case Else
MsgBox "よくない"
End Select
End Sub
大文字小文字を区別する – 正しい方法
しかし、TRUE式を追加することで、Select文がLike演算子で動作するようにすることができます。
Sub Select_Case_Like_CorrectWay()
Dim word As String
word = "COCOA"
Select Case True
Case word Like "*C*C*"
MsgBox "いいね"
Case Else
MsgBox "よくない"
End Select
End Sub
ケース – コロン(:)
Caseステートメントを使用する場合、各条件で実行したいコードを何行でも追加することができます。 しかし、1行だけ実行する必要がある場合は、次のようにします。コロン(:)を使って、すべてを同じ行に記述することができます。 以下は、コードを短くするためにコロンを使用していますが、その点を除いては、先に使った生徒の成績の例と同じ動作をします。
Sub Calc_Grade_colon()
Dim Score As Integer
Dim LetterGrade As String
Score = InputBox("学生のスコアを入力してください")
Select Case Score
Case 90 To 100: LetterGrade = "A"
Case 80 To 90: LetterGrade = "B"
Case 70 To 80: LetterGrade = "C"
Case 60 To 70: LetterGrade = "D"
Case Else: LetterGrade = "F"
End Select
MsgBox "生徒の成績は " & LetterGrade & " です"
End Sub
ケース選択 – And / Or – 複数条件
And / Or演算子を使って、Select Caseと一緒に追加の条件をテストすることができます。
この例では、変数「age」に対してSelect Caseを使用していますが、性別もテストしたいと思います。そこで、より複雑なテストを行うために And 演算子を使用しています。
Sub NestedSelectCase()
Dim sex As String
Dim age As Integer
sex = "男性" ' または女性
age = 15
Select Case age
Case Is < 20 And sex = "男性"
Msgbox "20歳未満の男性"
Case Is < 20 And sex = "female"
Msgbox "20歳未満の女性"
Case Is >= 20 And sex = "男性"
Msgbox "20歳以上の男性"
Case Is >= 20 And sex = "女性"
Msgbox "20歳以上の女性"
End Select
End Sub
Caseステートメントのネスト
Ifステートメントと同じように、Caseステートメントも入れ子にすることができます。
Sub NestedSelectCase()
Dim sex As String
Dim age As Integer
sex = "男性" ' または女性
age = 15
Select Case age
Case Is < 20
Select Case 性別
Case "男性"
MsgBox "20歳未満の男性"
Case "女性"
MsgBox "20歳未満の女性"
End Select
Case Is >= 20
Select Case sex
Case "男性"
MsgBox "20歳以上の男性"
Case "女性"
MsgBox "20歳以上の女性"
End Select
End Select
End Sub
CaseステートメントとIfステートメントの比較
テストする条件が多ければ多いほど、Ifステートメントに比べCaseステートメントの有用性は高くなります。例を見てみましょう。 以下は、If文を使用して、ワークシート名が一連の値に等しいかどうかをテストするために必要なコードです。
If Name = "Budget" Or Name = "Forcase" Or Name= "Trailing12" Or _
Name = "Flex" Or Name = "OtherRatios" Or Name = "Comparison" Or _
Name = "BudReview" Or Name = "P&L_Review" Or Name = "Other" Then
'任意の処理
End If
以下は、同じコードをSelect文の代わりに使用したものです。
Select Case Name
Case "Budget", "Forecast", "Trailing12", "Flex", "OtherRatios", _
"Comparison", "BudReview", "P&L_Review", "Other"
'任意の処理
End Select
このシナリオでは、Select文を使う方がはるかに簡単であることがおわかりいただけると思います。入力の手間が大幅に省け、見やすくなります。
VBAのSelect Caseの例
例1. Caseステートメント ユーザー定義関数(UDF)
上記の成績計算の例を再現して、生徒の点数を計算するUDFを作成してみましょう。
Function GetGrade(Score As Integer) As String
Select Case Score
Case 90 To 100
GetGrade = "A"
Case 80 To 90
GetGrade = "B"
Case 70 To 80
GetGrade = "C"
Case 60 To 70
GetGrade = "D"
Case Else
GetGrade = "F"
End Select
End Function
これで、Excel ワークシートで関数 GetGrade を使って、生徒の成績を素早く計算できるようになりました。
例 2. テストシート名 / ループのCase ステートメント
このコードは、ワークブック内のすべてのワークシートをループし、特定の条件を満たすシートの保護を解除します。
Sub Case_UnProtectSheet()
Dim ws As Worksheet
For Each ws In Worksheets
Select Case ws.Name 'レートを含む全シートのリスト
Case "Budget", "Forecase", "Trailing12", "Flex", "OtherRatios", _
"Comparison", "BudReview", "P&L_Review", "Other"
ws.Unprotect
End Select
Next ws
End Sub
例3. Select Case – セルの値
この例では、セル内の学生の得点をテストし、右側のセルに直接レターグレードを出力します。
Sub TestCellValue()
Dim cell As Range
Set cell = Range("C1")
Select Case cell.Value
Case 90 To 100
cell.Offset(0, 1) = "A"
Case 80 To 90
cell.Offset(0, 1) = "B"
Case 70 To 80
cell.Offset(0, 1) = "C"
Case 60 To 70
cell.Offset(0, 1) = "D"
End Select
End Sub
例4. Case Select – 日付
このケースセレクトの例では、ある日付がどの四半期に該当するかをテストする関数です。
Sub TestDate ()
MsgBox GetQuarter(CDate("7/20/2019"))
End Sub
Function GetQuarter(dt As Date) As Integer
Dim sht As Worksheet
Select Case dt
Case CDate("01/01/2019") To CDate("03/31/2019")
GetQuarter = 1
Case CDate("04/01/2019") To CDate("06/30/2019")
GetQuarter = 2
Case CDate("07/01/2019") To CDate("09/30/2019")
GetQuarter = 3
Case CDate("10/01/2019") To CDate("12/31/2019")
GetQuarter = 4
End Select
End Function
関数なので、Excel内部で関数として使うことができます。
例5. 数が奇数か偶数かチェックする
この例は、ある数字が奇数か偶数かをテストします。
Sub CheckOddEven()
Dim n As Integer
n = InputBox("数字を入力してください")
Select Case n Mod 2
Case 0
MsgBox "数値は偶数です。"
Case 1
MsgBox "数値は奇数です。"
End Select
End Sub
例6. 日付が平日か土日かのテスト
この例は、ある日付が平日か週末かをテストします。
Sub CheckWeekDay()
Dim dt As Date
dt = CDate("1/1/2020")
Select Case Weekday(dt)
Case vbMonday
MsgBox "今日は月曜日です"
Case vbTuesday
MsgBox "今日は火曜日です"
Case vbWednesday
MsgBox "今日は水曜日です"
Case vbThursday
MsgBox "木曜日です"
Case vbFriday
MsgBox "今日は金曜日です"
Case vbSaturday
MsgBox "今日は土曜日です"
Case vbSunday
MsgBox "今日は日曜日です"
End Select
End Sub
Sub CheckWeekend()
Dim dt As Date
dt = CDate("1/1/2020")
Select Case Weekday(dt)
Case vbSaturday, vbSunday
MsgBox "今日は週末です"
Case Else
MsgBox "週末ではありません"
End Select
End Sub
AccessのVBAセレクトケース
上記の例はすべて、Access VBAでもExcel VBAとまったく同じように動作します。
Sub TestCellValue()
Dim dbs as Database
Dim rst as RecordSet
Set dbs = CurrentDB
Set rst = dbs.OpenRecordset("tblClients", dbOpenDynaset)
With rst
.MoveFirst
.Edit
Select Case rst.Fields("City")
Case "Austin"
.rst.Fields("TelCode") = "512"
Case "Chicago"
.rst.Fields("TelCode") = "312"
Case "New YorK"
.rst.Fields("TelCode") = "1212"
Case "San Francisco"
.rst.Fields("TelCode") = "415"
End Select
.Update
End With
Ens Sub