Please Enable JavaScript!
Gon[ Enable JavaScript ]

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

엑셀(Excel)/VBA

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 의 차이점

 

※ 아래는 참고하면 좋을 만한 글들의 링크를 모아둔 것입니다.
엑셀 VBA 반복문 For Next 사용하기
엑셀 VBA 각종 함수 사용법과 샘플 소스 쉽게 얻는 방법
엑셀 VBA 참조하는 여러가지 방법
엑셀 VBA 매크로 디버깅, 디버그 코드 분석하기
셀 VBA 함수 만들어서 매크로와 연결하기

 

 

 

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

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

 

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

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

※ 아래는 참고하면 좋을 만한 글들의 링크를 모아둔 것입니다.
엑셀 VBA 반복문 For Next 사용하기
엑셀 VBA 각종 함수 사용법과 샘플 소스 쉽게 얻는 방법
엑셀 VBA 참조하는 여러가지 방법
엑셀 VBA 매크로 디버깅, 디버그 코드 분석하기
셀 VBA 함수 만들어서 매크로와 연결하기
Posted by 녹두장군1
,