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

修改形参的值,而实例的值不会变化。