keepcalculator

06 Numbers and Powers

VBA Select Case: Syntax, Examples & Best Use

Card No. 06·49450 · Updated · Standard formula, shown below

Average pace 5.00 min/km
Average speed
12.00 km/h
Result
Finish time
50 min
You entered
Distance
10 km
You entered
You enter
Finish time, Distance
You get
Average pace, Average speed
Rounding
2 dp

VBA Select Case is a conditional branching structure that lets you run different blocks of code depending on the value of a single expression, offering a cleaner and more readable alternative to long chains of If…ElseIf statements. You give it an expression (like a variable, a cell value, or a calculation), and it compares that result against a series of Case clauses, executing the first one that matches. This article explains the full syntax, shows practical examples, and covers the common pitfalls so you can write efficient, maintainable VBA.

Formula

The Select Case structure follows a fixed pattern:

Select Case test_expression
    Case condition_1
        ' code to run if condition_1 is True
    Case condition_2
        ' code to run if condition_2 is True
    Case Else
        ' code to run if no condition matches
End Select

Here, test_expression is any VBA expression that evaluates to a number, string, or date. Each condition can be a single value, a comma-separated list of values, a range using To, or a comparison using Is with >, <, >=, <=, or <>. The Case Else clause is optional but recommended; it runs when no other case matches.

The expression is evaluated once at the top, and then VBA compares it against each condition in order. The first matching block executes, and then control jumps to the line after End Select. If no case matches and there is no Case Else, the structure simply does nothing.

Worked Example

Suppose you want to assign a letter grade based on a numeric score stored in the variable score. The default value in the calculator above is a finish time of 50 minutes for a 10 km distance, but for this example we use a score of 85:

Dim score As Integer
score = 85
Dim grade As String
Select Case score
    Case 90 To 100
        grade = "A"
    Case 80 To 89
        grade = "B"
    Case 70 To 79
        grade = "C"
    Case 60 To 69
        grade = "D"
    Case Else
        grade = "F"
End Select
MsgBox grade

The expression score is 85. VBA checks the first case: 85 is not in the range 90 to 100, so it moves on. The second case, 80 to 89, matches, so grade becomes “B” and the code exits the Select block. The message box shows “B”.

Notice that the ranges are inclusive: Case 80 To 89 includes both 80 and 89. If you want to exclude a boundary, use Is >= 80 And Is < 90 in a single case, or restructure your ranges.

Select Case vs. If…ElseIf

The main advantage of Select Case is readability when you have many conditions on the same expression. Compare these two blocks:

If x = 1 Then
    ' do A
ElseIf x = 2 Then
    ' do B
ElseIf x = 3 Or x = 4 Then
    ' do C
Else
    ' do D
End If
Select Case x
    Case 1
        ' do A
    Case 2
        ' do B
    Case 3, 4
        ' do C
    Case Else
        ' do D
End Select

The Select Case version is shorter and visually groups all the conditions for x together. If you need to test different variables (e.g., x > 5 And y < 10), If…ElseIf is the better choice because Select Case only evaluates one expression. Also, Select Case evaluates the test expression only once, whereas If…ElseIf re-evaluates each condition; this matters if the expression has side effects (like calling a function that modifies a global variable).

Performance-wise, both are fast; the difference is negligible for typical Excel macros. Use Select Case when you have three or more cases on the same variable, and If…ElseIf when conditions involve different variables or complex Boolean logic.

Using Case with Ranges, Lists, and Comparisons

Select Case supports several flexible ways to specify conditions:

  • Single value: Case 5 matches exactly 5.
  • List of values: Case 1, 3, 5 matches 1, 3, or 5. Commas act as OR.
  • Range with To: Case 10 To 20 matches any value from 10 to 20 inclusive.
  • Comparison with Is: Case Is >= 100 matches any value greater than or equal to 100.
  • Mixed: You can combine them in one Case: Case 1, 5 To 10, Is > 100.

For strings, you can use ranges like Case "A" To "M" (based on alphabetical order) or lists like Case "Red", "Green", "Blue". Note that string comparisons are case-insensitive by default unless you have Option Compare Binary at the top of your module, which makes them case-sensitive.

You can also use expressions in the test expression itself, such as Select Case Len(name) to branch on the length of a string, or Select Case Range("A1").Value to branch on a cell value.

Common Mistakes and How to Avoid Them

Several pitfalls trip up both beginners and experienced VBA developers:

  • Forgetting Case Else: If no case matches and there is no Case Else, the code silently does nothing. Always include a Case Else to handle unexpected values, even if it just shows a message or does nothing.
  • Overlapping ranges: If two cases overlap (e.g., Case 1 To 10 and Case 5 To 15), only the first one runs for the overlapping values. Order matters; put more specific cases first.
  • Using And/Or inside a Case: You cannot write Case x > 5 And x < 10 because the test expression is already x. Instead use Case 6 To 9 or Case Is > 5, Is < 10 (which would match any value greater than 5 OR less than 10, not both). For strict AND logic, use If…ElseIf.
  • Type mismatch: The test expression and the case values must be compatible. If you compare a string variable to numeric cases, VBA will raise a type mismatch error. Use Val() or CStr() to convert if needed.
  • Case sensitivity: By default, string comparisons are case-insensitive. If you need case-sensitive matching, add Option Compare Binary at the top of the module, or use StrComp in an If statement.

Another common mistake is using Select Case with a Boolean expression like Select Case True. This works (each Case becomes a Boolean condition), but it is often less readable than If…ElseIf. Use it sparingly.

Real-World Examples in Excel VBA

Here are three typical uses in Excel macros:

1. Categorize sales data:

Dim sales As Double
sales = Range("B2").Value
Select Case sales
    Case Is >= 10000
        Range("C2").Value = "High"
    Case 5000 To 9999.99
        Range("C2").Value = "Medium"
    Case Else
        Range("C2").Value = "Low"
End Select

2. Handle user input from a message box:

Dim reply As VbMsgBoxResult
reply = MsgBox("Continue?", vbYesNoCancel)
Select Case reply
    Case vbYes
        ' proceed
    Case vbNo
        ' stop
    Case vbCancel
        Exit Sub
End Select

3. Map month numbers to quarter names:

Dim monthNum As Integer
monthNum = Month(Date)
Dim quarter As String
Select Case monthNum
    Case 1, 2, 3
        quarter = "Q1"
    Case 4, 5, 6
        quarter = "Q2"
    Case 7, 8, 9
        quarter = "Q3"
    Case 10, 11, 12
        quarter = "Q4"
End Select

These examples show how Select Case can replace nested If statements and make the logic explicit and easy to modify.

Select Case in Other Languages vs. VBA

If you come from another programming language, VBA’s Select Case has a few unique quirks. In C# or Java, switch requires a break after each case; VBA does not, because it automatically exits after a match. In Python, the equivalent is match (Python 3.10+) or a dictionary of lambdas. In VBA, you cannot fall through from one case to another intentionally—unlike C where you can omit break. Also, VBA’s Case Else is similar to default in other languages.

One difference that surprises many: VBA’s Case can evaluate ranges and comparisons directly, which in other languages often requires multiple if statements. This makes VBA’s Select Case more expressive for numeric ranges. However, VBA does not support switch on expressions like Case x + 1; the test expression must be a single value, though it can be a function call.

Frequently Asked Questions

Can I use Select Case with strings? Yes, you can use string values, lists, and ranges. For example, Case "apple", "banana" or Case "a" To "m". String comparisons are case-insensitive by default unless you use Option Compare Binary.

How do I use Select Case with a range of numbers like 1-10? Use Case 1 To 10. This includes both 1 and 10. If you need to exclude a boundary, use Case Is > 1, Is < 10 (but that matches values outside the range too) or restructure with If.

Can I have multiple conditions in one Case? Yes, separate them with commas: Case 1, 3, 5 or Case 1 To 5, 10 To 15. Each comma acts as an OR.

What happens if no Case matches? If there is no Case Else, the code simply skips the entire Select block and continues after End Select. No error is raised. It is good practice to include a Case Else to handle unexpected values.

Can I use Select Case with dates? Yes, dates are numeric values internally. You can use Case #1/1/2024# To #12/31/2024# or compare with Case Is > Date.

Is Select Case faster than If…ElseIf? For a handful of conditions, the difference is negligible. For many conditions on the same expression, Select Case can be slightly faster because it evaluates the expression once, but the main benefit is readability.

Related

Formula used
in t | Finish time | min | 50 | 0
in d | Distance | km | 10 | 0 | 100000
out pace | Average pace | min/km | t / d | 2
out speed | Average speed | km/h | d / (t / 60) | 2

Each line is one input (in, sel, list) or one result (out: label, unit, formula, decimals). How the calculators work

Method: the standard formula for this calculation, rounded as each result states. See how the calculators work or report an error.

More cards in this drawer

The whole Numbers and Powers drawer →