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


답변:


429

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

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


32
완성도를 높이려면 ( Range예를 들어) 객체를 반환 할 때 Set일반 메소드에서 객체 변수를 설정할 때와 마찬가지로 사용해야 합니다. 예를 들어, "test"가 Range를 반환하는 함수 인 경우 return 문은 다음과 같습니다 set test = Range("A1").
Jay Carr

왜 @JayCarr입니까?
PsychoData

4
@PsychoData-단순히 객체 변수를 설정하는 방식이기 때문에 간단하게 수행하면 set문제가 발생할 수 있습니다. 나는없이 그것을하는 데 문제가 있었지만, 사용하면 set:).
Jay Carr

1
다른 VBA 함수 또는 Sub에서 호출하는 것과 비교하여 스프레드 시트에서 호출 할 때 함수의 동작이 다르다는 점도 언급 할 가치가 있다고 생각합니다.
더그 젠킨스

2
VBA 내에서 호출되면 함수는 범위 개체를 반환하지만 워크 시트에서 호출하면 값만 반환하므로 "test"가 Range가 아니라 Variant로 정의 된 것과 set test = Range("A1")정확히 같습니다 test = Range("A1").Value.
더그 젠킨스

86

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

test = 1

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


실제로 추가 정보를 사용하여 질문에 더 명확하게 대답했습니다 (이는 잠재적으로 새로운 질문부터 VBA 사람까지 다른 질문으로 이어질 수 있음). 좋은 일을 계속하십시오
Adarsha

죄송합니다. 방금 내 답변과 똑같은 대답을 한 것 같았지만 기능에서 벗어나지 않는다는 사실을 추가했습니다. 그것은 좋은 추가 사항입니다. 나는 그것이 의견으로 더 적절하다고 생각했습니다. 적절한 에티켓이 무엇인지 잘 모르겠습니다. 좋은 답변이기 때문에 공감하는 것이 약간 무례한 것 같지만 실행을 취소하지는 않습니다.
Dan

41

반환 값을 함수 이름으로 설정하는 것만 으로도 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

2
"당신이 방법의 다른 변수처럼 반환 변수를 사용할 수 있다는 것을 알고하는 것이 좋다"입니다 주로 반환 형식 인 경우 만 예 - 진정한 Variant당신의 목표는 무언가처럼 배열을 반환하는 ReDim test(1 to 100)오류를 트리거합니다. 또한, 그것은 비록 입니다 수와 같은 기본 타입 치료하기 Integers가 다소 unidiomatic 간주됩니다 그렇게합니다. 코드를 읽기 어렵게 만듭니다. VBA 프로그래머는 함수 이름에 지정된 행을 스캔하여 함수의 기능을 이해합니다. 함수 이름을 일반 변수로 사용하면 불필요하게 모호합니다.
John Coleman

@ JohnColeman은 두 가지 점에 전적으로 동의합니다. 마지막 예가 권장 방법론 중 하나가되어서는 안됩니다. 그러나 주제 질문은 변수를 반환하는 방법에 관한 것이므로 VB의 반환 결과에 대한 전체 설명과 확장 방법에 대한 시도입니다. 확실히 마지막 경우는 권장 사항이 아닙니다. (나는 분명히 그것을 예 이상으로 코딩하지는 않을 것입니다.) 따라서, 당신의 요점은 잘 취해지고 잘 추가됩니다. 감사합니다.
LimaNightHawk

그것은 이다 자그마한 기능에 유용합니다, 나는 당신이 그것을 언급 아무 문제가 없었다, 그래서 어떤 VBA 프로그래머가 약 알아야 할 무언가이다. 방금 경고가 포함되어야한다고 생각했습니다.
John Coleman

감사 Exit Function합니다.return
Austin D

@JohnColeman, 분명히 ReDim test(1 to 100)'test'가 배열로 선언되지 않았기 때문에 오류를 유발 하지 않고는 불가능합니다! 그리고 다른 이유는 전혀 없습니다! 함수를 배열로 선언 할 수 없습니다. 로 선언 Variant한 다음이 함수 내에 출력 배열 (동적 또는 정적 일 수 있음)을 빌드 test한 다음이 배열을 test반환 값으로 지정 ( "=")하면됩니다 . 더처럼 조작하기 ReDim를 보내고, 당신은 예를 들어 변수에 반환 값을 할당해야합니다 Dim x as Variant및 호출 x = test, 그 후에 x당신이 만든 것입니다 test수!
유전자

-6

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

Dim retVal As Integer
retVal = test()
Msgbox retVal
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.