Using Select Case in VBA

select case

This page shows how you can use Select Case to determine which code block (after each Case statement) needs to be executed. The different ways to specify the Case clauses are shown. In the example below the string after Debug.Print explains what the Case's condition specifies. It is important to understand that (only) the block is executed that has matching condition. Select Case statements can be nested or mixed with If statements to implement decision trees. In the example below the value 9 matches both Case 8 To 10 (Between 8 and 10) and Case Is < 10 (Smaller than 10), the first match is executed.

Sub SelectDemo1()
    Dim Number: Number = 9    ' Demo value.
    Select Case Number    'Determine which branch is appropriate.
        Case 2 To 4
        Debug.Print "Between 2 and 4"
        
        Case 1, 7
        Debug.Print "1 or 7"
        
        Case 8 To 10
        Debug.Print "Between 8 and 10"
        
        Case Is < 10
        Debug.Print "Smaller than 10"
        
        Case Is > 12
        Debug.Print "Greater than 12"
         
        Case Else
        Debug.Print "Not any of the previous cases"
    End Select
End Sub
Select Case Select Case LCase Select Case Else Case , (Or) Case .. To .. Case Is < Case Is > Case Else

Select Case

After Select Case you can put any numeric expression or string expression, but in most cases one will use a variable here, as in SelectDemo1 Number. Below gives an example of using a string expression:

Dim Products As Collection, prod As Product
Dim i As Integer: i = 2
Set prod = Products(i)
Select Case prod.Category
Case "Fruit"

Select Case LCase

The problem with strings is that if just one character is uppercase in the Select Case expression and lowercase in the Case expression it will not been considered as a match. A way to prevent this is to make all characters lower- or upper-case:

Select Case LCase(prod.Category)
Case "fruit"

Select Case Else

More often then not Select Case Else is included as an easy way to make sure all possible cases are getting handled. However it may be argued that all known cases must be explicit and this one should be used for error handling.

Err.Raise Number:=cintUnspecifiedCaseInSelect, Description:="Unspecified Case in Select"

Specifying Case

In the Case statement one or more expressions may be combined, separated by a comma, meaning if .. or .. or .., in all those cases do the statement block from this Case.

Case 1 To 4, 7 To 9, 11, 13, Is > MaxNumber

Case , (Or)

1 or 7

Case 1, 7

Case .. To ..

8 To 10: 8, 9, 10

Case 8 To 10

Interestingly, To can also be used with strings. In the below example value 'popcorn' would be considered a match for 'nuts To soup'

Case "everything", "nuts" To "soup", TestItem

Case Is <

Case Is < 10 - any number below 10

Case Is < 10

Case Is >

Case Is > 10

Case Else

If no match on all previous Case statements.