TOP

VBA-Lesson 9. 프로시저 및 기능

모든 프로그래밍 언어에는 프로시저 및 함수와 같은 개념이 있습니다. 또한 Excel용 내장 프로그래밍 언어 VBA에도 포함되었습니다.

  • 함수는 결과를 반환하는 루틴입니다. 함수 호출은 표현식이며 다른 표현식이나 할당문의 오른쪽(VBA에서 "Function"로 표시됨)에서 사용할 수 있습니다.
  • 프로시저는 함수가 아닌 모든 루틴을 말합니다. VBA에 "Sub"로 표시됩니다("서브루틴"이라는 단어에서 유래).

  • 프로시저(Public - Private)

    이 시점에서 우리가 만든 모든 프로시저는 Public 유형이므로 모든 모듈에서 액세스할 수 있습니다.

     Sub example()
     
     '다음과 동일:
     Public Sub example()
    

    특정 모듈에서만 프로시저를 사용할 수 있도록 하려면 Private 키워드가 사용됩니다.

    Private Sub example()
    

    다른 프로시저 중간에서 프로시저 실행

    다른 프로시저 내에서 프로시저를 실행하려면 해당 프로시저의 이름을 입력하기만 하면 됩니다.

    다음은 이에 대한 매우 간단한 예입니다.

    Private Sub warning()
        MsgBox "Caution !!!" '"경고!"
    End Sub
    
    Sub macro_test()
        If Range("A1") = "" Then
            warning '=> "warning" 프로시저 실행
        End If
        '등...
    End Sub
    

    인수

    인수를 사용하면 하위 프로시저에서 프로시저의 값을 사용할 수 있습니다(기본적으로 변수는 선언된 프로시저에서만 사용할 수 있음을 기억하세요).

    Private Sub warning(var_text As String)
        MsgBox "Caution : " & var_text & " !"
    End Sub
    
    Sub macro_test()
        If Range("A1") = "" Then
            warning "empty cell"               '"빈 셀"
        ElseIf Not IsNumeric(Range("A1")) Then
            warning "non-numerical value"      '"숫자가 아닌 값"
        End If
    End Sub
    

    "warning" 프로시저에 인수가 추가되었습니다. 이 경우 "String" 유형의 "var_text" 변수입니다(리본).

    Private Sub warning(var_text As String)
    

    이 루틴은 인수를 취하므로 이를 실행하려면 "warning" 뒤에 값을 입력해야 합니다.

    warning "empty cell"
    

    여러 인수를 작성하려면 쉼표로 구분해야 합니다.

    선택적 인수

    기본적으로 프로시저에 인수가 있으면 해당 인수를 제공해야 하며, 인수가 제공되지 않으면 프로시저가 실행되지 않습니다.

    Optional 키워드를 사용하여 필수 인수 뒤에 선택적 인수를 추가할 수 있습니다. 예:

    Private Sub dialog_boxes(last_name As String, Optional first_name, Optional age)
    

    이제 다음과 같이 선택적 인수를 사용하거나 사용하지 않고 이 프로시저를 실행할 수 있습니다.

     '예 1: 성을 표시합니다.
     dialog_boxes last_name1
       
     '예 2: 성과 이름을 표시합니다.
     dialog_boxes last_name1, first_name1
       
     '예시 3: 성과 나이를 표시합니다.
     dialog_boxes last_name1, , age1
       
     '예 4: 성, 이름, 나이 표시:
     dialog_boxes last_name1, first_name1, age1
    

    인수는 올바른 순서로 입력되어야 합니다.

    선택적 인수가 프로시저에 있는지 테스트하려면 IsMissing 함수를 사용합니다. 이 함수는 일부 함수 유형(Variant 유형)과만 호환되며 선택적 인수의 유형이 선언되지 않았기 때문에 이것이 중요합니다(선언되지 않은 유형 = Variant).

    다음은 위에서 설명한 두 가지 코드 조각을 사용하는 예입니다.

    Sub macro_test()
    
        Dim last_name1 As String, first_name1 As String, age1 As Integer
       
        last_name1 = Range("A1")
        first_name1 = Range("B1")
        age1 = Range("C1")
    
        '예 1: 성을 표시합니다.
        dialog_boxes last_name1
       
        '예 2: 성과 이름을 표시합니다.
        dialog_boxes last_name1, first_name1
       
        '예시 3: 성과 나이를 표시합니다.
        dialog_boxes last_name1, , age1
       
        '예 4: 성, 이름, 나이 표시:
        dialog_boxes last_name1, first_name1, age1
    
    End Sub
    
    Private Sub dialog_boxes(last_name As String, Optional first_name, Optional age)
       
        If IsMissing(age) Then '연령 변수가 누락된 경우...
           
            If IsMissing(first_name) Then '변수 first_name이 누락된 경우
            							  '성만 표시됩니다
               MsgBox last_name
            Else '그렇지 않으면 성과 이름이 표시됩니다.
               MsgBox last_name & " " & first_name
            End If
           
        Else '연령 변수가 있는 경우...
    
            If IsMissing(first_name) Then '변수 first_name이 누락된 경우
                                          '성과 나이가 표시됩니다
               MsgBox last_name & ", " & age & " years old"
            Else '그렇지 않으면 성, 이름, 나이가 표시됩니다.
               MsgBox last_name & " " & first_name & ", " & age & " years old"
            End If
       
        End If
           
    End Sub
    

    보다 아래 그림(예 1):

    ByRef - ByVal

    기본적으로 인수는 ByRef 유형입니다. 즉, 변수가 인수로 전달되면 해당 변수에 대한 참조도 전달됩니다. 즉, 변수가 다른 하위 프로시저에 의해 변경된 경우 해당 하위 프로시저를 호출하는 외부 프로시저에서도 변경됩니다.

    예:

    Sub macro_test()
        Dim var_number As Integer
        
        var_number = 30
        calcul_square var_number
       
        MsgBox var_number
    End Sub
    
    Private Sub calcul_square(ByRef var_value As Integer) 'ByRef은 선택사항입니다.
                                                          '(기본값입니다)
        var_value = var_value * var_value
    End Sub
    

    명확하게 하기 위해 다음은 매크로가 실행되기 시작하면 어떤 일이 발생하는지에 대한 예입니다.

     var_number = 30
     '변수 "var_number"의 초기값은 30입니다.
    
     calcul_square var_number
     '하위 프로시저는 "var_number"를 인수로 사용하여 실행됩니다.
    
     Private Sub calcul_square(ByRef var_value As Integer)
     '변수 "var_value"는 어느 정도 변수 "var_number"에 빠르게 액세스하는 데 사용됩니다.
     '이는 "var_value" 변수가 변경되면 "var_number" 변수도 변경된다는 의미입니다.
     '(그리고 이름이 같을 필요는 없습니다)
     var_value = var_value * var_value
     '변수 "var_value"의 값이 변경됩니다(따라서 "var_number"도 동시에 변경됩니다).
    
     End Sub
     '하위 절차의 끝
    
     MsgBox var_number
     '변수 "var_number"가 변경되어 이제 대화 상자에 900이 표시됩니다.
    

    두 번째 방법은 ByVal을 사용하는 것입니다.

    참조(레이블)를 전달하는 ByRef과 달리 ByVal은 값을 전달하므로 인수로 전달된 값이 수정되지 않았다는 의미입니다.

    아래에서는 이전 코드와 ByVal이 어떻게 작동하는지 확인할 수 있습니다.

     var_number = 30
     '변수 "var_number"의 초기값은 30입니다.
    
     calcul_square var_number
     '하위 프로시저는 "var_number"를 인수로 사용하여 실행됩니다.
    
     Private Sub calcul_square(ByVal var_value As Integer)
     '변수 "var_value"는 변수 "var_number"의 값을 복사합니다(두 변수는 관련이 없음).
    
     var_value = var_value * var_value
     '변수 "var_value"의 값이 변경되었습니다.
    
     End Sub
     '하위 절차의 끝(이 예에서 하위 절차는 아무 영향도 미치지 않음)
    
     MsgBox var_number
     '변수 "var_number"는 변경되지 않았으므로 대화 상자에 30이 표시됩니다.
    

    기억해야 할 사항: 변수를 변경해서는 안 되는 경우 ByVal을 사용하세요.

    기능

    프로시저와 함수의 주요 차이점은 함수가 값을 반환한다는 것입니다.

    다음은 간단한 예입니다.

    Function square(var_number)
        square = var_number ^ 2 '"square" 함수는 "제곱근" 값을 반환합니다.
    End Function
    
    Sub macro_test()
        Dim result As Double
        result = square(9.876) '결과 변수에는 함수에 의해 계산된 값이 할당됩니다.
        MsgBox result '결과가 표시됩니다(이 경우 9.876의 제곱).
    End Sub
    

    이 함수는 Excel의 다른 함수와 마찬가지로 워크시트에서 사용할 수 있습니다.

    예를 들어 셀 A1에 입력된 값의 제곱을 구하려면 다음을 수행합니다.