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
 
修改形参的值,而实例的值不会变化。