VBA过程 按值按引用传参
问题:当在函数的内部修改形参的值时,实参的值是否会发生变化?
有些需求下,我们需要实参的数据不变,这是按值传递。
有些需求下,我们需要实参的数据变化,这是按引用传递。
1、默认的参数传递
示例代码如下。
Sub sum41(a As Integer, b As Integer)
Debug.Print "和为:" & (a + b)
a = 100
End Sub
Sub sum41_call()
Dim x As Integer
Dim y As Integer
x = 2000
y = 23
sum41 x, y
Debug.Print "x:" & x
End Sub
sum41的定义中形参为a,b,其中修改了形参a的值。
sum41的调用中实参为x,y。
问:修改形参a的值,那实参x是否会发生变化?
输出结果:
x:100
所以验证了:默认的参数传递是按引用传递。
2、参数显示声明为按引用传递
通过ByRef将参数声明为按引用传递。
Sub 过程名称( ByRef 参数1 As 数据类型1 , 参数2 As 数据类型2,…)
语句块
End Sub
表示将第1个参数显示声明为按引用传递。可以同时针对其它参数加ByRef。
示例代码。求和过程中将形参a与b显示声明为按引用传递。
Sub sum41(ByRef a As Integer, b As Integer)
Debug.Print "和为:" & (a + b)
a = 100
End Sub
参数默认不加ByRef与加ByRef等价,都是按引用传递。
3、参数显示声明为按值传递
通过ByVal将参数声明为按值传递。
Sub 过程名称( ByVal 参数1 As 数据类型1 , 参数2 As 数据类型2,…)
语句块
End Sub
表示将第1个参数显示声明为按值传递。可以同时针对其它参数加ByVal。
示例代码。求和,将参数a设为按值传递。
Sub sum42(ByVal a As Integer, b As Integer)
Debug.Print "和为:" & (a + b)
a = 100
End Sub
Sub sum42_call()
Dim x As Integer
Dim y As Integer
x = 2000
y = 23
sum42 x, y
Debug.Print "x:" & x
End Sub
运行结果:
和为:2023
x:2000
修改形参的值,而实例的值不会变化。