TOP

VBA-강의 7.1. 조건 (조건)

조건은 설정된 기준에 따라 작업을 수행할 수 있게 해주기 때문에 프로그래밍에 매우 유용합니다(IF 함수 Excel에서와 동일한 원리가 사용됨).

VBA If...Then...Else 문은 지정된 조건이 true인지 아닌지에 따라 일련의 문을 실행합니다. 조건(논리 테스트)이 충족되면 한 세트의 작업이 실행됩니다. 그러나 조건이 거짓이면 대체 작업 세트가 수행됩니다.

그러나 가독성을 위해 여러 수준의 중첩된 If...Then...Else 문 대신 Select Case 문을 사용할 수 있습니다.


만약...그렇다면...그밖에

따라서 조건을 설정하는 가장 중요한 함수는 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

코드가 실행되기 전에 F5 셀에 입력된 값이 숫자인지 확인하는 조건을 추가해 보겠습니다.

IsNumeric 함수를 사용하여 조건을 테스트하겠습니다.

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") & "사실이 아니다!"
       
       'F5 셀의 내용을 삭제합니다.
       Range("F5").ClearContents
    End If
End Sub

이제 숫자가 아닌 값은 문제를 일으키지 않습니다.

16개 행의 데이터가 포함된 배열을 사용하여 작업할 때 다음 단계는 row_number 변수가 "2보다 크거나 같음" 및 "17보다 작거나 같음"인지 확인하는 것입니다.

하지만 먼저 비교 연산자를 살펴보겠습니다.

= 정확히
<> 정확히
< 미만
<= 보다 작거나 같음
> 이상
>= 보다 크거나 같음

유용한 연산자는 다음과 같습니다.

AND [조건1] AND [조건2] 두 가지 조건이 충족되어야 합니다.
OR[조건1] OR [조건2] 2가지 조건 중 1가지 이상을 충족해야 함
NOTNOT [조건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

매크로를 보다 실용적으로 만들고 싶다면 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

ElseIf

ElseIf를 사용하면 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
   
    '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         '=> 값 = 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       '값 = 6 또는 7인 경우
Case Is <> 6, 7      '값이 6 또는 7이 아닌 경우
Case 6 To 10         '값 = 6에서 10 사이의 숫자인 경우