新建From1(窗体),新建Command1(按钮CommandButton),代码:
Private Sub Command5_Click()
Dim intA As Integer
intA = 0: Call s_1(intA): Debug.Print intA
intA = 0: Call s_2(intA): Debug.Print intA
intA = 0: Call s_3(intA): Debug.Print intA
End Sub
Private Sub s_1(intA As Integer) '等效于ByRef
intA = 1
End Sub
Private Sub s_2(ByRef intA As Integer)
intA = 2
End Sub
Private Sub s_3(ByVal intA As Integer)
intA = 3
End Sub运行结果:
1
2
0ByRef:(默认情况下,当省略传递类型时,默认值是 ByRef)传递变量时,将该变量的引用地址传入过程或函数。传入引用地址意味着,在过程或函数内部对其修改时,也会影响上一级过程(父过程)中的变量的值。比如:
Option Explicit
Private Sub Command1_Click()
Dim arrA(0) As Byte
'Dim arrA$ '会显示重复声明,无效
Call s_1(arrA)
Debug.Print arrA(0)
Call s_2(arrA)
Debug.Print arrA(0)
'Call s_3(arrA) '会提示ByRef参数类型不符
'Debug.Print arrA(0)
End Sub
Private Sub s_1(arrA() As Byte) 'ByVal是错误的,只能用空或ByRef,空=ByRef
arrA(0) = 65
End Sub
Private Sub s_2(ByRef arrA() As Byte)
arrA(0) = 66
End Sub
'Private Sub s_3(arrA As Byte)
'arrA(0) = 67
'End Sub运行结果:
65
66ByVal:传递变量时,复制一份该变量,传入过程或函数。在过程和函数内部对该变量进行修改,只对该副本有效,对上一级过程(父过程)的变量没有影响。
由于ByVal会产生副本,会新建存储空间,所以比ByRef和默认更占用资源。
