傳遞簡單變數 ByRef 和 ByVal
傳遞 ByRef
或 ByVal
表示引數的實際值是否通過 CallingProcedure
傳遞給 CalledProcedure
,或者是否將參考(在某些其他語言中稱為指標)傳遞給 CalledProcedure
。
如果引數傳遞給 ByRef
,則引數的記憶體地址將傳遞給 CalledProcedure
,並且 CalledProcedure
對該引數的任何修改都將轉換為 CallingProcedure
中的值。
如果引數傳遞給 ByVal
,則實際值(而不是對變數的引用)將傳遞給 CalledProcedure
。
一個簡單的例子將清楚說明這一點:
Sub CalledProcedure(ByRef X As Long, ByVal Y As Long)
X = 321
Y = 654
End Sub
Sub CallingProcedure()
Dim A As Long
Dim B As Long
A = 123
B = 456
Debug.Print "BEFORE CALL => A: " & CStr(A), "B: " & CStr(B)
''Result : BEFORE CALL => A: 123 B: 456
CalledProcedure X:=A, Y:=B
Debug.Print "AFTER CALL = A: " & CStr(A), "B: " & CStr(B)
''Result : AFTER CALL => A: 321 B: 456
End Sub
另一個例子:
Sub Main()
Dim IntVarByVal As Integer
Dim IntVarByRef As Integer
IntVarByVal = 5
IntVarByRef = 10
SubChangeArguments IntVarByVal, IntVarByRef '5 goes in as a "copy". 10 goes in as a reference
Debug.Print "IntVarByVal: " & IntVarByVal 'prints 5 (no change made by SubChangeArguments)
Debug.Print "IntVarByRef: " & IntVarByRef 'prints 99 (the variable was changed in SubChangeArguments)
End Sub
Sub SubChangeArguments(ByVal ParameterByVal As Integer, ByRef ParameterByRef As Integer)
ParameterByVal = ParameterByVal + 2 ' 5 + 2 = 7 (changed only inside this Sub)
ParameterByRef = ParameterByRef + 89 ' 10 + 89 = 99 (changes the IntVarByRef itself - in the Main Sub)
End Sub