엑셀 VBA 매개변수 전달 방식 ByRef, ByVal 의 차이점

엑셀(Excel)/VBA

엑셀 VBA 매개변수 전달 방식 ByRef, ByVal 의 차이점

 

환경: Microsoft Excel 2013

 

VBA 에서 함수로 인수를 전달하는 방식은 두 가지입니다. 값에 의한 전달 ByVal (Call by value) 와 참조에 의한 전달 ByRef (Call by Reference) 입니다. 값에 의한 전달인 ByVal 은 인수의 주소가 아닌 직접 값을 복사해서 넘깁니다. 그 말은 변수의 실제 값은 변수가 전달되는 프로시저에 의해 바뀌지 않습니다. 참조에 의한 전달인 ByRef 는 그 반대입니다. Control 개체나 값이 든 변수를 넘기게 되면 주소를 참조하기 때문에 프로시저에 의해 값이 변경될 수 있습니다.

 

VBA 에서는 기본적으로 인수 앞에 아무것도 입력하지 않을 경우 ByRef 키워드가 생략된 것입니다. 샘플에서처럼 nVal1 nVal2 의 값이 5, 6 으로 바뀌었습니다. ByRef 로 넘긴 변수에 새로운 값을 세팅한 것이죠. 참조에 의한 전달이므로 기존 변수에 들어 있던 값이 변경된 것입니다.

엑셀 VBA 매개변수 전달 방식 ByRef, ByVal 의 차이점

 

그럼 ByVal 로 넘긴 변수는 어떻게 될까요? v1 인수 앞에 ByVal 을 추가합니다. 그리고 fByVal 함수에서 전달 받은 인수에 다른 값을 세팅합니다. MsgBox 로 출력한 결과 함수로 넘긴 변수의 값은 변경되지 않았습니다.  

엑셀 VBA 매개변수 전달 방식 ByRef, ByVal 의 차이점

 


다음은 Call 을 사용하지 않고 함수를 호출할 때 전달 방식을 구분하는 방법입니다. Call 함수를 사용하지 않을 경우 “(“ 괄호를 사용하지 않습니다. 그림과 같이 호출하는 것은 참조 방식으로 전달됩니다. 그래서 값이 변경되었습니다

엑셀 VBA 매개변수 전달 방식 ByRef, ByVal 의 차이점

 

이것을 값에 의한 전달로 바꾸고 싶다면 각각의 매개변수에 괄호를 씌웁니다. 각 인수마다 “( )” 괄호를 씌우면 ByVal 로 전달한 인수가 되는 것입니다. 그러므로 값은 변경되지 않습니다.  

엑셀 VBA 매개변수 전달 방식 ByRef, ByVal 의 차이점

저작자 표시 비영리 변경 금지
신고
Posted by 녹두장군