> 深入了解自定义函数
形参和实参
自定义函数中有形参和实参这两种概念,怎么来理解呢?先来看下面的例子
Function GreetUsers(UserName As String) As String GreetUsers = "welcome, " & UserNameEnd FunctionSub SayHello() Debug.Print GreetUsers("A哥")End Sub
[x] 在定义函数GreetUser()的定义中,变量UserName是一个形参— 函数完成其工作所需要的一个信息。
[x] 在下面代码中: Debug.Print GreetUsers("A哥")
我们向函数传递了一个数据”A哥”,这个值就是一个实参。实参是调用函数传递给函数的信息。
在GreetUser(“A哥”)中,将实参”A哥”传递给了函数GreetUser(),这个值被存储在形参UserName里。
函数里的形参和实参的结合有两种方式:按照地址传值ByRef和按照值传值ByVal
ByRef (默认模式)
通俗点讲就是系统直接把实参的地址传给了形参。由于形参现在和实参共享一个地址,在函数处理过后,实参的数值会相应的变化。
例如:
Function trybydefault(i As Integer) As Integeri = i 1trybydefault = iEnd FunctionSub test_function()Dim n%n = 2Debug.Print trybydefault(n)Debug.Print nEnd Sub
上面返回3,3 也就是函数处理的过程中:
n作为实参被默认按ByRef传值
被函数加1之后,n也发生了改变,因此返回的n值为3
ByVal(传递数值)
如果使用需要特殊指定ByVal
这种方法可以这么理解,函数在接到实参之后,复制了一个副本出来,供函数使用。因此实参的值最终没有变化。
Function trybydefault(byval i As Integer) As Integeri = i 1trybydefault = iEnd FunctionSub test_function()Dim n%n = 2Debug.Print trybydefault(n)Debug.Print nEnd Sub
返回3,2 也就是实参数值并未发生改变。
文章的最后,附上某位小朋友曾经提过的问题,让大家体会一下ByRef和ByVal是多么受出卷老师的喜欢,在这里要手动@野子。。。
总结一下
函数的形参和实参
ByVal和ByRef