VBA Select Case 문
In this Article
VBA에서 Select Case 문은 If-Then 문의 대체 구문으로, 각 조건에 대해 특정 코드를 실행하여 조건이 충족되는지 테스트할 수 있습니다. 처리할 조건이 여러 개 있는 경우 Select 문이 If 문보다 좋습니다.
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
End Sub
Select Case 구문
Select Case 구문은 다음과 같습니다:
Select Case [Test Expression]
Case [Condition 1]
[Action if condition 1 is true]
Case [Condition 2]
[Action if condition 2 is true]
Case [Condition n]
[Action if condition n is true]
Case Else
[Action if none are true]
End Select
[Test Expression] – 평가할 기준 값입니다. 일반적으로 변수입니다.
[Action if condition n is true] – 조건이 충족되면 실행할 코드입니다(If 문과 동일합니다).
[Condition n] – 기준 값에 대한 조건입니다. 기준 값을 충족하는지 테스트하는 방법에는 여러 가지가 있습니다. 아래에서 이에 대해 설명하겠습니다.
Case 문은 TRUE로 확인된 첫 번째 조건에 대한 코드를 실행합니다. 충족되는 조건이 없을 경우 Else 절을 추가하지 않으면 코드가 실행되지 않습니다.
Select Case 기준
Select Cases는 숫자 값과 텍스트를 모두 평가하는 데 사용할 수 있습니다. 먼저 Select Case를 사용하여 숫자 표현식을 평가하는 방법에 대해 설명하겠습니다.
정확히 일치하는 숫자 확인하기
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
이 프로시저는 숫자 점수(0~100)를 기준으로 학생들의 문자 점수(A~F)를 생성합니다:
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에 대해서만 코드를 실행한다는 점을 기억하세요.
이 절차는 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"
End Select
MsgBox "변환된 학점 : " & LetterGrade
End Sub
Case Else
조건이 충족되지 않는 경우 어떤 작업을 수행하기 위해 Case 문 끝에 “Case Else”를 추가할 수 있습니다:
Case Else
이전 코드 예제 끝부분에서 Case Else를 어떻게 사용했는지 확인하세요.
Select Case – 텍스트와 Like 연산자 사용하기
위의 Select Case 예제들은 숫자의 경우만 확인해 보았습니다. 텍스트와 함께 Select Case 문을 사용할 수도 있습니다.
정확히 일치하는 텍스트 확인하기
표현식이 다음 예제와 같이 정확한 구문과 일치하는지 테스트할 수 있습니다:
Case "Beets"
또는 쉼표를 사용하여 표현식이 두 개 이상의 구문과 정확히 일치하는지 테스트할 수 있습니다:
Case "Apple", "Banana", "Orange"
예제 코드는 다음과 같습니다:
Sub ExactMatch_Food()
Select Case Range("a1").Value
Case "Beets"
MsgBox "Vegetable"
Case "Apple", "Banana", "Orange"
MsgBox "Fruit"
End Select
End Sub
대문자 및 소문자
기본적으로 VBA는 대소문자를 구분합니다. 즉, VBA는 “Text”를 “text”와 다르게 간주합니다. 대소문자 구분을 끄려면 모듈 상단에 Option Compare Text를 추가합니다:
Option Compare Text
이 예제는 Case 문으로 텍스트 작업 시 대소문자를 구분하지 않습니다:
Option Compare Text
Sub ExactMatch_Food()
Select Case Range("a1").Value
Case "Beets"
MsgBox "Vegetable"
Case "Apple", "Banana", "Orange"
MsgBox "Fruit"
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 "Good"
Case Else
MsgBox "Not Good"
End Select
End Sub
Case 문에서 Like 연산자 활용하기 – 정상적으로 사용한 경우
TRUE 표현식을 추가하여 Select 문이 Like 연산자와 함께 작동하도록 할 수 있습니다:
Sub Select_Case_Like_CorrectWay()
Dim word As String
word = "COCOA"
Select Case True
Case word Like "*C*C*"
MsgBox "Good"
Case Else
MsgBox "Not Good"
End Select
End Sub
Case 문에서 콜론 활용하기
Case 문을 사용할 때는 각 조건에 대해 실행할 코드를 원하는 만큼 추가할 수 있습니다. 한 줄의 코드만 실행할 경우. 콜론(:)을 사용하여 코드를 간결하게 표현할 수 있습니다.
다음 예제 코드는 위에서 사용했던 것과 동일한 예제입니다. 학생 성적을 변환하는 예제인데 아래 코드에서 좀더 간결하게 보이도록 콜론을 사용하였습니다:
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
Case Select 문- 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 = "여자"
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 sex
Case "남자"
MsgBox "20대 미만 남자"
Case "여자"
MsgBox "20대 미만 여자"
End Select
Case Is >= 20
Select Case sex
Case "남자"
MsgBox "20대 이상 남자"
Case "female"
MsgBox "20대 이상 여자"
End Select
End Select
End Sub
Case 문과 If 문
테스트할 조건이 많을수록 Case 문이 If 문에 비해 더 유용합니다. 예제를 살펴보겠습니다.
다음은 If 문을 사용하여 특정한 이름 목록에 워크시트 이름이 포함되는지 확인하기 위한 코드입니다:
If Name = "Budget" Or Name = "Forecast" 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"
'Do Something
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 'List of all sheets with Ratios
Case "Budget", "Forecast", "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 80
cell.Offset(0, 1) = "D"
End Select
End Sub
예제4. Select Case – 날짜 확인하기
아래의 Select Case 문 예제는 날짜가 어느 분기에 속하는지 테스트하는 함수입니다.
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에서 Select Case 문 활용하기
위의 모든 예제는 Excel VBA에서와 마찬가지로 Access 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 Fransisco"
.rst.Fields("TelCode") = "415"
End Select
.Update
End With
End Sus