- ByVal은 프로시저 정의시에만 사용할 수 있고, 호출시에는 쓸 수 없다.
- 프로시저 호출시 Call을 쓰지 않으면 값에 의한 참조와 동일한 효과가 있다.
아래는 각 경우의 예제와 결과다.
1/ Call 없이 바로 프로시져 호출의 경우: ByVal키워드를 사용하지 않았으나, 값을 참조 (call by value) 하는 경우와 동일한 결과. 원래 값이 바뀌지 않음
Sub ShowRoot(MyVal) Debug.Print "+++++++++++" Debug.Print "[ShowRoot] org MyVal = " & MyVal sr = Sqr(MyVal) MyVal = sr Debug.Print "[ShowRoot] sqr(MyVal) = " & MyVal End Sub
Sub Test() v = 25 ShowRoot (v) ' <-- This line Debug.Print v End Sub
결과
+++++++++++ [ShowRoot] org MyVal = 25 [ShowRoot] sqr(MyVal) =5 25
2/ Call을 이용해서 프로시저 호출: 참조를 사용(Call by reference)하였으므로 원래 변수가 값이 바뀜
Sub ShowRoot(MyVal) Debug.Print "+++++++++++" Debug.Print "[ShowRoot] org MyVal = " & MyVal sr = Sqr(MyVal) MyVal = sr Debug.Print "[ShowRoot] sqr(MyVal) = " & MyVal End Sub
Sub Test() v = 25 Call ShowRoot(v) '<-- this line Debug.Print v End Sub
결과
+++++++++++ [ShowRoot] org MyVal = 25 [ShowRoot] sqr(MyVal) = 5 5
3/ 프로시저 호출시에 ByVal키워드사용: 문법오류!
Sub ShowRoot(MyVal) Debug.Print "+++++++++++" Debug.Print "[ShowRoot] org MyVal = " & MyVal sr = Sqr(MyVal) MyVal = sr Debug.Print "[ShowRoot] sqr(MyVal) = " & MyVal End Sub Sub Test() v = 25 Call ShowRoot(ByVal v) '<-- this line Debug.Print v End Sub
결과: 문법 오류로 실행 중지.
4/ 프로시저 정의시에 ByVal키워드 사용: 값을 참조하므로 (Call by value) 원래 변수 값이 바뀌지 않음
Sub ShowRoot(ByVal MyVal) Debug.Print "+++++++++++" Debug.Print "[ShowRoot] org MyVal = " & MyVal sr = Sqr(MyVal) MyVal = sr Debug.Print "[ShowRoot] sqr(MyVal) = " & MyVal End Sub Sub Test() v = 25 Call ShowRoot(v) Debug.Print v End Sub
+++++++++++ [ShowRoot] org MyVal = 25 [ShowRoot] sqr(MyVal) = 5 25
5/ 4번의 경우에 대해서 Call을 사용하지 않고 프로시저 호출: 결과동일, 변수 값이 바뀌지 않음
Sub ShowRoot(ByVal MyVal) Debug.Print "+++++++++++" Debug.Print "[ShowRoot] org MyVal = " & MyVal sr = Sqr(MyVal) MyVal = sr Debug.Print "[ShowRoot] sqr(MyVal) = " & MyVal End Sub Sub Test() v = 25 ShowRoot (v) Debug.Print v End Sub
+++++++++++ [ShowRoot] org MyVal = 25 [ShowRoot] sqr(MyVal) = 5 25
'공부 > VBA' 카테고리의 다른 글
[VBA] 함수 재계산 시점 조절 - Application.Volatile True (0) | 2011.04.04 |
---|---|
[VBA] 프로그래밍 기초 (2) | 2011.03.04 |
[VBA] 간단한 소개 (0) | 2011.03.04 |