VBA 에서 함수로 인수를 전달하는 방식은 두 가지입니다. 값에 의한 전달 ByVal (Call by value) 와 참조에 의한 전달 ByRef (Call by Reference) 입니다. 값에 의한 전달인 ByVal 은 인수의 주소가 아닌 직접 값을 복사해서 넘깁니다. 그 말은 변수의 실제 값은 변수가 전달되는 프로시저에 의해 바뀌지 않습니다. 참조에 의한 전달인 ByRef 는 그 반대입니다. Control 개체나 값이 든 변수를 넘기게 되면 주소를 참조하기 때문에 프로시저에 의해 값이 변경될 수 있습니다.
▼ VBA 에서는 기본적으로 인수 앞에 아무것도 입력하지 않을 경우 ByRef 키워드가 생략된 것입니다. 샘플에서처럼 nVal1 과 nVal2 의 값이 5, 6 으로 바뀌었습니다. ByRef 로 넘긴 변수에 새로운 값을 세팅한 것이죠. 참조에 의한 전달이므로 기존 변수에 들어 있던 값이 변경된 것입니다.
▼ 그럼 ByVal 로 넘긴 변수는 어떻게 될까요? v1 인수 앞에 ByVal 을 추가합니다. 그리고 fByVal 함수에서 전달 받은 인수에 다른 값을 세팅합니다. MsgBox 로 출력한 결과 함수로 넘긴 변수의 값은 변경되지 않았습니다.
※ 아래는 참고하면 좋을 만한 글들의 링크를 모아둔 것입니다. ※ ▶ 엑셀 VBA 반복문 For Next 문 사용하기 ▶ 엑셀 VBA 각종 함수 사용법과 샘플 소스 쉽게 얻는 방법 ▶ 엑셀 VBA 셀 참조하는 여러가지 방법 ▶ 엑셀 VBA 매크로 디버깅, 디버그 코드 분석하기 ▶ 엑셀 VBA 함수 만들어서 매크로와 연결하기 |
▼ 다음은 Call 을 사용하지 않고 함수를 호출할 때 전달 방식을 구분하는 방법입니다. Call 함수를 사용하지 않을 경우 “(“ 괄호를 사용하지 않습니다. 그림과 같이 호출하는 것은 참조 방식으로 전달됩니다. 그래서 값이 변경되었습니다.
▼ 이것을 값에 의한 전달로 바꾸고 싶다면 각각의 매개변수에 괄호를 씌웁니다. 각 인수마다 “( )” 괄호를 씌우면 ByVal 로 전달한 인수가 되는 것입니다. 그러므로 값은 변경되지 않습니다.
※ 아래는 참고하면 좋을 만한 글들의 링크를 모아둔 것입니다. ※ ▶ 엑셀 VBA 반복문 For Next 문 사용하기 ▶ 엑셀 VBA 각종 함수 사용법과 샘플 소스 쉽게 얻는 방법 ▶ 엑셀 VBA 셀 참조하는 여러가지 방법 ▶ 엑셀 VBA 매크로 디버깅, 디버그 코드 분석하기 ▶ 엑셀 VBA 함수 만들어서 매크로와 연결하기 |
'엑셀(Excel) > VBA' 카테고리의 다른 글
엑셀 VBA 레지스트리 키값 읽어오기 (1) | 2023.02.24 |
---|---|
엑셀 VBA 시트에서 데이터 셀 영역 구하기 (2) | 2023.02.22 |
엑셀 VBA 영어 첫 글자만 대문자로 변경하는 방법 (2) | 2023.02.05 |
엑셀 VBA 개발에 도움이 되는 편집기창 이용 방법들 (0) | 2023.01.31 |
엑셀 VBA 반복문 For Next, For Each Next 사용하기 (0) | 2023.01.11 |
엑셀 VBA 메모의 모양을 직사각형, 풍선, 다이어몬드 형태 만들기 (0) | 2023.01.10 |
엑셀 VBA 기존 AVERAGE 평균 함수 수정해서 나만의 함수 만드는 방법 (0) | 2023.01.10 |
엑셀 VBA 영역을 입력받는 RefEdit 컨트롤 사용하는 방법 (0) | 2023.01.09 |