VBA Select Caseステートメント

Written by

Editorial Team

Reviewed by

Steve Rynearson

Translated by

masahiro yoshida

Last updated on 4月 11, 2022

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

vba select case

以下は、代わりに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 を使って、生徒の成績を素早く計算できるようになりました。 vba case select

例 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内部で関数として使うことができます。

vba case select date example

例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
vba-free-addin

VBA Code Examples Add-in

Easily access all of the code examples found on our site.

Simply navigate to the menu, click, and the code will be inserted directly into your module. .xlam add-in.

(No installation required!)

Free Download

Return to VBA Code Examples