2014-05-22 4 views
2

배열을 Sub By Reference에 전달할 때 문제가 발생했지만 배열이 실제로 수정되지 않습니다. 그 문제를 해결했지만 그 이유를 알고 싶습니다.VBA 괄호 사용 여부에 따라 Sub 또는 Function이 달라지는 이유

다음은 예제입니다.

Private Function fCountArray(ByRef arrayVar As Variant) 
    arrayVar(0) = 333 
End Function 

Sub Test1() 
     Dim changedArr As Variant 
     Dim notChangedArr As Variant 

    ' create 2 quick array 
     changedArr = Array(1, 2, 33, 56, 76, 89, 10) 
     notChangedArr = Array(1, 2, 33, 56, 76, 89, 10) 

    'intest = Array(3, 1, 2) 
    fCountArray (notChangedArr) 
    Debug.Print notChangedArr(0) 'Print Out 1 

    fCountArray changedArr 
    Debug.Print changedArr(0) 'Print Out 333 
End Sub 

그래서 무엇 fCountArray (notChangedArr)fCountArray changedArr 사이의 서로 다른 기본

fCountArray이 (notChangedArr) 참조로 통과하지 왜?

답변

3

큰 질문입니다! 나는 괄호가 평가을 일으키고 있다고 생각한다. 따라서 함수가 인자 ByRef을 취하고있다하더라도, 실제로 호출 프로 시저에 로컬 배열을 넘겨주지는 않는다. 본질적으로 그것의 복사본을 전달하고있는 것이다.

모호성을 피하기 위해 Sub 명시 적으로 이 아닌 모든 절차는 값을 반환합니다. 그리고 나는 Function만을 사용하여 값을 리턴하거나 표현식을 평가하고 결코 객체/등을 조작하지 않습니다.

그래서 내가 할 것이다 :

Sub fCountArray(ByRef arrayVar As Variant) 
    arrayVar(0) = 333 
End Sub 

을 그리고 당신은 간단하게 호출 할 수 하위 같은 :

fCountArray notChangedArr 

(가 적어도 하나의 필수 소요하기 때문에 당신은이 Private을해야하지 않을 수 있습니다 매크로 대화 상자에서 사용자에게 노출되지 않습니다.)

나는 이것을 String과 함께 테스트하여 동일한 동작을 관찰합니다.

업데이트

이것은 평가 표현의 복사/임시 인스턴스가 아닌 ByRef 변수 인스턴스를 전달하는 것이 나의 의심을 확인하는 것 같다. 식으로의 괄호 력 평가 자체적으로 인수 배치

http://msdn.microsoft.com/en-us/library/office/gg251769(v=office.15).aspx

... 평가의 결과는 임시 위치에 배치하고, 상기 임시 위치에 대한 참조이다 절차에 의해 접수. 따라서 원래 MyVar는 그 가치를 유지합니다.

+1

나는 당신이 엔드 서브를 의미한다고 생각합니다. 좋은 대답. – NYCdotNet

+0

@NYCdotNet 네, 잘 잡으세요! –

+0

+1,이 주제에 대한 가장 좋아하는 토론은 다음과 같습니다. http://dailydoseofexcel.com/archives/2012/05/01/quick-vba-tip-parentheses/ –