TOP
VBA-강의 7.1. 조건 (조건)
조건은 설정된 기준에 따라 작업을 수행할 수 있게 해주기 때문에 프로그래밍에 매우 유용합니다(IF 함수 Excel에서와 동일한 원리가 사용됨).
VBA If...Then...Else 문은 지정된 조건이 true인지 아닌지에 따라 일련의 문을 실행합니다. 조건(논리 테스트)이 충족되면 한 세트의 작업이 실행됩니다. 그러나 조건이 거짓이면 대체 작업 세트가 수행됩니다.
그러나 가독성을 위해 여러 수준의 중첩된 If...Then...Else 문 대신 Select Case 문을 사용할 수 있습니다.
만약...그렇다면...그밖에
따라서 조건을 설정하는 가장 중요한 함수는 IF이며 이제 이것이 어떻게 작동하는지 살펴보겠습니다.
- If [여기서 용어] Then
-
- Else
-
- End If
If [여기서 용어] Then '=> 조건이 참이면
'"true"인 경우 지침
Else '=> 그렇지 않으면
'"거짓말"인 경우 지침
End If
실습을 통해 변수 강의에서 사용한 예로 돌아가 보겠습니다. 이 절차의 목적은 F5 셀에 지정된 문자열의 값을 표시하는 대화 상자를 표시하는 것이었습니다.
F5 셀에 문자를 입력하면 오류가 발생합니다. 우리는 이것을 방지하고 싶습니다.
- Sub variables()
-
- Dim last_name As String, first_name As String, age As Integer, row_number As Integer
-
-
- row_number = Range("F5") + 1
-
- last_name = Cells(row_number, 1)
- first_name = Cells(row_number, 2)
- age = Cells(row_number, 3)
-
-
- MsgBox last_name & " " & first_name & ", " & age & "연령"
- End Sub
Sub variables()
'변수 선언
Dim last_name As String, first_name As String, age As Integer, row_number As Integer
'변수에 값 할당
row_number = Range("F5") + 1
last_name = Cells(row_number, 1)
first_name = Cells(row_number, 2)
age = Cells(row_number, 3)
'대화 상자
MsgBox last_name & " " & first_name & ", " & age & "연령"
End Sub
코드가 실행되기 전에 F5 셀에 입력된 값이 숫자인지 확인하는 조건을 추가해 보겠습니다.
IsNumeric 함수를 사용하여 조건을 테스트하겠습니다.
- Sub variables()
-
-
- If IsNumeric(Range("F5")) Then
-
-
- Dim last_name As String, first_name As String, age As Integer, row_number As Integer
-
-
- row_number = Range("F5") + 1
-
- last_name = Cells(row_number, 1)
- first_name = Cells(row_number, 2)
- age = Cells(row_number, 3)
-
-
- MsgBox last_name & " " & first_name & ", " & age & "연령"
- End If
- End Sub
Sub variables()
'괄호 안의 값(F5 셀)이 숫자인 경우(따라서 IF CONDITION IS TRUE)
'THEN 다음에 나오는 지침을 실행하십시오.
If IsNumeric(Range("F5")) Then
'변수 선언
Dim last_name As String, first_name As String, age As Integer, row_number As Integer
'변수에 값 할당
row_number = Range("F5") + 1
last_name = Cells(row_number, 1)
first_name = Cells(row_number, 2)
age = Cells(row_number, 3)
'대화 상자
MsgBox last_name & " " & first_name & ", " & age & "연령"
End If
End Sub
또한 설정한 조건이 충족되지 않으면 지침을 작성해야 합니다.
- Sub variables()
- If IsNumeric(Range("F5")) Then
-
-
- Dim last_name As String, first_name As String, age As Integer, row_number As Integer
-
-
- row_number = Range("F5") + 1
-
- last_name = Cells(row_number, 1)
- first_name = Cells(row_number, 2)
- age = Cells(row_number, 3)
-
-
- MsgBox last_name & " " & first_name & ", " & age & "연령"
-
- Else
-
-
- MsgBox "입력된 값" & Range("F5") & "사실이 아니다!"
-
-
- Range("F5").ClearContents
- End If
- End Sub
Sub variables()
If IsNumeric(Range("F5")) Then '조건이 충족되면
'변수 선언
Dim last_name As String, first_name As String, age As Integer, row_number As Integer
'변수에 값 할당
row_number = Range("F5") + 1
last_name = Cells(row_number, 1)
first_name = Cells(row_number, 2)
age = Cells(row_number, 3)
'대화 상자
MsgBox last_name & " " & first_name & ", " & age & "연령"
Else '조건이 충족되지 않는 경우
'대화 상자: 경고
MsgBox "입력된 값" & Range("F5") & "사실이 아니다!"
'F5 셀의 내용을 삭제합니다.
Range("F5").ClearContents
End If
End Sub
이제 숫자가 아닌 값은 문제를 일으키지 않습니다.
16개 행의 데이터가 포함된 배열을 사용하여 작업할 때 다음 단계는 row_number 변수가 "2보다 크거나 같음" 및 "17보다 작거나 같음"인지 확인하는 것입니다.
하지만 먼저 비교 연산자를 살펴보겠습니다.
= |
정확히 |
<> |
정확히 |
< |
미만 |
<= |
보다 작거나 같음 |
> |
이상 |
>= |
보다 크거나 같음 |
유용한 연산자는 다음과 같습니다.
AND |
[조건1] AND [조건2]
두 가지 조건이 충족되어야 합니다. |
OR | [조건1] OR [조건2]
2가지 조건 중 1가지 이상을 충족해야 함 |
NOT | NOT [조건1]
조건이 충족되어서는 안 됩니다. |
이제 비교 연산자 사이에 위의 AND 조건 중 하나를 추가해 보겠습니다.
- Sub variables()
- If IsNumeric(Range("F5")) Then
-
- Dim last_name As String, first_name As String, age As Integer, row_number As Integer
-
- row_number = Range("F5") + 1
-
- If row_number >= 2 And row_number <= 17 Then
-
- last_name = Cells(row_number, 1)
- first_name = Cells(row_number, 2)
- age = Cells(row_number, 3)
-
- MsgBox last_name & " " & first_name & ", " & age & "연령"
-
- Else
- MsgBox "입력된 번호" & Range("F5") & "정확하지 않습니다!"
- Range("F5").ClearContents
- End If
-
- Else
- MsgBox "입력된 값" & Range("F5") & "사실이 아니다!"
- Range("F5").ClearContents
- End If
- End Sub
Sub variables()
If IsNumeric(Range("F5")) Then '숫자 값인 경우
Dim last_name As String, first_name As String, age As Integer, row_number As Integer
row_number = Range("F5") + 1
If row_number >= 2 And row_number <= 17 Then '숫자가 맞다면
last_name = Cells(row_number, 1)
first_name = Cells(row_number, 2)
age = Cells(row_number, 3)
MsgBox last_name & " " & first_name & ", " & age & "연령"
Else '번호가 정확하지 않은 경우
MsgBox "입력된 번호" & Range("F5") & "정확하지 않습니다!"
Range("F5").ClearContents
End If
Else '숫자값이 아닌 경우
MsgBox "입력된 값" & Range("F5") & "사실이 아니다!"
Range("F5").ClearContents
End If
End Sub
매크로를 보다 실용적으로 만들고 싶다면 17을 줄 수를 유지하는 변수로 바꿀 수 있습니다. 이렇게 하면 매번 이 제한을 변경할 필요 없이 배열에서 행을 추가하고 제거할 수 있습니다.
이를 위해서는 nb_rows 변수를 생성하고 이 함수를 추가해야 합니다.
이 경우 Excel 자체의 COUNTA 함수와 유사한 WorksheetFunction.CountA 함수를 사용합니다.
우리는 이 함수가 첫 번째 열에서 비어 있지 않은 셀의 수를 계산하고 결과 값을 nb_rows 변수에 쓰길 원합니다.
- Sub variables()
- If IsNumeric(Range("F5")) Then
-
- Dim last_name As String, first_name As String, age As Integer, row_number As Integer
- Dim nb_rows As Integer
-
- row_number = Range("F5") + 1
- nb_rows = WorksheetFunction.CountA(Range("A:A"))
-
- If row_number >= 2 And row_number <= nb_rows Then
-
- last_name = Cells(row_number, 1)
- first_name = Cells(row_number, 2)
- age = Cells(row_number, 3)
-
- MsgBox last_name & " " & first_name & ", " & age & "연령"
-
- Else
- MsgBox "입력된 번호" & Range("F5") & "정확하지 않습니다!"
- Range("F5").ClearContents
- End If
-
- Else
- MsgBox "입력된 값" & Range("F5") & "사실이 아니다!"
- Range("F5").ClearContents
- End If
- End Sub
Sub variables()
If IsNumeric(Range("F5")) Then '숫자인 경우
Dim last_name As String, first_name As String, age As Integer, row_number As Integer
Dim nb_rows As Integer
row_number = Range("F5") + 1
nb_rows = WorksheetFunction.CountA(Range("A:A")) '줄 수를 세는 기능
If row_number >= 2 And row_number <= nb_rows Then '유효한 번호인 경우
last_name = Cells(row_number, 1)
first_name = Cells(row_number, 2)
age = Cells(row_number, 3)
MsgBox last_name & " " & first_name & ", " & age & "연령"
Else '번호가 잘못된 경우
MsgBox "입력된 번호" & Range("F5") & "정확하지 않습니다!"
Range("F5").ClearContents
End If
Else '숫자가 아닌 경우
MsgBox "입력된 값" & Range("F5") & "사실이 아니다!"
Range("F5").ClearContents
End If
End Sub
ElseIf
ElseIf를 사용하면 IF 명령 뒤에 추가 조건을 추가할 수 있습니다.
- If [조건 1] Then
-
- ElseIf [조건 2] Then
-
- Else
-
- End If
If [조건 1] Then '=> 조건 1이 참인 경우 THEN
'지침 1
ElseIf [조건 2] Then '=> 조건 1은 거짓이지만 조건 2는 참인 경우
'지침 2
Else '=> 그렇지 않으면
'지침 3
End If
CONDITION 1이 true인 경우 명령문 1은 IF 명령문(IF로 시작하고 End If로 끝남)을 실행하고 종료합니다. CONDITION 2가 false를 반환하면 명령문 2가 실행되고, false를 반환하면 명령문 3(Else 아래)이 실행됩니다.
다음은 셀 A1에 1~6등급이 있고 셀 B1에 해당 등급에 대한 설명이 있는 예입니다.
- Sub scores_comment()
-
- Dim note As Integer, score_comment As String
-
- note = Range("A1")
-
-
- If note = 6 Then
- score_comment = "좋은 점수입니다!"
- ElseIf note = 5 Then
- score_comment = "좋은 지적"
- ElseIf note = 4 Then
- score_comment = "만족스러운 점수"
- ElseIf note = 3 Then
- score_comment = "불만족스러운 점수"
- ElseIf note = 2 Then
- score_comment = "나쁜 점수"
- ElseIf note = 1 Then
- score_comment = "끔찍한 점수"
- Else
- score_comment = "0점"
- End If
-
-
- Range("B1") = score_comment
- End Sub
Sub scores_comment()
'변수
Dim note As Integer, score_comment As String
note = Range("A1")
'받은 점수에 따른 댓글
If note = 6 Then
score_comment = "좋은 점수입니다!"
ElseIf note = 5 Then
score_comment = "좋은 지적"
ElseIf note = 4 Then
score_comment = "만족스러운 점수"
ElseIf note = 3 Then
score_comment = "불만족스러운 점수"
ElseIf note = 2 Then
score_comment = "나쁜 점수"
ElseIf note = 1 Then
score_comment = "끔찍한 점수"
Else
score_comment = "0점"
End If
'B1 셀의 메모
Range("B1") = score_comment
End Sub
Select 케이스
많은 ElseIf 문과 함께 If를 사용하는 대신 이러한 상황에 더 적합한 Select Case 명령을 사용할 수 있습니다.
Select Case 연산자가 포함된 매크로의 예를 생각해 보세요.
- Sub scores_comment()
-
- Dim note As Integer, score_comment As String
-
- note = Range("A1")
-
-
- Select Case note
- Case Is = 6
- score_comment = "좋은 점수입니다!"
- Case Is = 5
- score_comment = "좋은 지적"
- Case Is = 4
- score_comment = "만족스러운 점수"
- Case Is = 3
- score_comment = "불만족스러운 점수"
- Case Is = 2
- score_comment = "나쁜 점수"
- Case Is = 1
- score_comment = "끔찍한 점수"
- Case Else
- score_comment = "0점"
- End Select
-
-
- Range("B1") = score_comment
- End Sub
Sub scores_comment()
'변수
Dim note As Integer, score_comment As String
note = Range("A1")
'받은 점수에 따른 댓글
Select Case note '=> 시험점수(점수)
Case Is = 6 '=> 값 = 6인 경우
score_comment = "좋은 점수입니다!"
Case Is = 5 '=> 값 = 5인 경우
score_comment = "좋은 지적"
Case Is = 4 '=> 값 = 4인 경우
score_comment = "만족스러운 점수"
Case Is = 3 '=> 값 = 3인 경우
score_comment = "불만족스러운 점수"
Case Is = 2 '=> 값 = 2인 경우
score_comment = "나쁜 점수"
Case Is = 1 '=> 값 = 1인 경우
score_comment = "끔찍한 점수"
Case Else '=> 값이 위의 값과 같지 않은 경우
score_comment = "0점"
End Select
'B1 셀의 메모
Range("B1") = score_comment
End Sub
다른 비교 연산자를 사용할 수도 있다는 점은 주목할 가치가 있습니다.
Case Is >= 6 '값 >= 6인 경우
다른 의미의 예:
- Case Is = 6, 7
- Case Is <> 6, 7
Case Is = 6, 7 '값 = 6 또는 7인 경우
Case Is <> 6, 7 '값이 6 또는 7이 아닌 경우
Case 6 To 10 '값 = 6에서 10 사이의 숫자인 경우