본문 바로가기

공부/VBA

[VBA] ByVal 키워드 사용


  • 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