[excel] VBA 함수에서 결과를 반환하는 방법

함수에서 결과를 어떻게 반환합니까?

예를 들면 다음과 같습니다.

Public Function test() As Integer
    return 1
End Function

컴파일 오류가 발생합니다.

이 함수가 정수를 반환하게하려면 어떻게합니까?



답변

객체가 아닌 리턴 유형의 경우 다음과 같이 함수 이름에 값을 지정해야합니다.

Public Function test() As Integer
    test = 1
End Function

사용법 예 :

Dim i As Integer
i = test()

함수가 객체 유형을 반환하면 다음 Set과 같이 키워드 를 사용해야합니다 .

Public Function testRange() As Range
    Set testRange = Range("A1")
End Function

사용법 예 :

Dim r As Range
Set r = testRange()

함수 이름에 반환 값을 할당해도 함수 실행이 종료되지는 않습니다. 함수를 종료하려면 명시 적으로 말해야 Exit Function합니다. 예를 들면 다음과 같습니다.

Function test(ByVal justReturnOne As Boolean) As Integer
    If justReturnOne Then
        test = 1
        Exit Function
    End If
    'more code...
    test = 2
End Function

설명서 : http://msdn.microsoft.com/en-us/library/office/gg264233%28v=office.14%29.aspx


답변

VBA 함수는 함수 이름 자체를 일종의 변수로 취급합니다. 따라서 ” return“문 을 사용하는 대신 다음과 같이 말하면됩니다.

test = 1

그러나 이것이 기능에서 벗어나지 않는다는 점에 유의하십시오. 이 명령문 이후의 모든 코드도 실행됩니다. 따라서에 다른 값을 할당하는 많은 할당 문을 가질 수 있으며 test함수 끝에 도달하면 값이 반환됩니다.


답변

반환 값을 함수 이름으로 설정하는 것만 으로도 Java (또는 다른) 명령문 과 정확히 동일 하지는 않습니다 return. java에서 return다음과 같이 함수를 종료 하기 때문입니다 .

public int test(int x) {
    if (x == 1) {
        return 1; // exits immediately
    }

    // still here? return 0 as default.
    return 0;
}

VB에서 함수 끝에서 반환 값을 설정하지 않으면 정확히 동등한 두 줄이 사용 됩니다 . 따라서 VB에서 정확한 추론은 다음과 같습니다.

Public Function test(ByVal x As Integer) As Integer
    If x = 1 Then
        test = 1 ' does not exit immediately. You must manually terminate...
        Exit Function ' to exit
    End If

    ' Still here? return 0 as default.
    test = 0
    ' no need for an Exit Function because we're about to exit anyway.
End Function 

이 경우이므로 메소드의 다른 변수와 같이 리턴 변수를 사용할 수 있다는 것도 알고 있습니다. 이처럼 :

Public Function test(ByVal x As Integer) As Integer

    test = x ' <-- set the return value

    If test <> 1 Then ' Test the currently set return value
        test = 0 ' Reset the return value to a *new* value
    End If

End Function 

또는 반환 변수의 작동 방식에 대한 극단적 인 (실제로 코딩해야하는 방법에 대한 좋은 예는 아님) — 야간에 밤을 유지할 수있는 것 :

Public Function test(ByVal x As Integer) As Integer

    test = x ' <-- set the return value

    If test > 0 Then

        ' RECURSIVE CALL...WITH THE RETURN VALUE AS AN ARGUMENT,
        ' AND THE RESULT RESETTING THE RETURN VALUE.
        test = test(test - 1)

    End If

End Function


답변

아래 코드는 반환 값을 변수에 저장 retVal한 다음 MsgBox값을 표시하는 데 사용할 수 있습니다.

Dim retVal As Integer
retVal = test()
Msgbox retVal


답변