函数调用:
Sub EnterText()
Dim m As String, n As String, r As String
m = InputBox("Enter your first name:")
n = InputBox("Enter your last name:")
r = JoinText(m, n)
MsgBox r
End Sub
Function JoinText(k, o)
JoinText = k + " " + o
End Function
Run F5
Results:
明确参数类型:
在前面的部分,你学习了函数根据它们自变量传递的值进行计算,当你声明函数时,你将参数名称列在一对括号里面。参数名称就像变量一样,每个参数名称在函数调用时,引用你提供的数值。当子程序调用函数过程时,它以变量形式传递参数。一旦函数做点什么,它就将结果赋给函数名称。注意,函数过程的名称当作变量来使用。
象变量一样,函数也有类型,函数的结果可以是字符串型,整型,长整型,等。要明确你函数的结
果类型,只有在函数声明行后添加关键字As和你想要的类型即可。例如:
Function MultiplyIt(num1, num2) As Integer
如果你不明确数据类型,VB将把你的函数结果设置为默认类型(Variant数据类型)。当你明确你的函数结果的数据类型时,就象你明确变量的数据类型那样有一些好处,你的程序将更有效地使用内存,因此它运行得也更快些。
Sub HowMuch()
Dim num1 As Single
Dim num2 As Single
Dim result As Single
num1 = 45.33
num2 = 19.24
result1 = MultiplyIt(num1, num2)
result2 = SumthemUP(num1, num2)
MsgBox result1
MsgBox result2
End Sub
Function MultiplyIt(num1, num2) As Integer
MultiplyIt = num1 * num2
End Function
可以得到两个不同形式的结果
按地址和值传递函数:
在一些过程中,当你将参数作为变量传递时,VB可能突然改变该变量的数值。要确保该被调函数不改变传递的参数值,你应该在函数声明行在参数名称之前加上关键字ByVal。我们来看看这个例子:
Sub ThreeNumbers()
Dim num1 As Integer, num2 As Integer, num3 As Integer
num1 = 10
num2 = 20
num3 = 30
num2 = num2 + 1
MsgBox MyAverage(num1, num2, num3)
MsgBox num1
MsgBox num2
MsgBox num3
End Sub
Function MyAverage(ByVal num1, ByVal num2, ByVal num3)
num1 = num1 + 1
MyAverage = (num1 + num2 + num3) / 3
End Function
使用关键字ByVal在参数名称前,可以防止函数改变参数值。子程序ThreeNumbers给三个变量赋值,再调用函数MyAverage来计算,最后计算该三个变量的平均值。函数的参数就是变量num1,num2和num3。注意,所有变量的前面都有关键字ByVal。同时,注意,在计算均值之前,函数MyAverage改变了变量num1的值,在函数内部,变量num1等于11(10+1),因此,当函数将计算的均值传递给过程ThreeNumbers时,函数MsgBox显示的结果是20.66667而不是期望的20,接下来的三个函数显示每个变量的内容,变量储存的内容和它们开始被赋的值一致——10,21(在本过程中num+1的有效),30。
技巧:了解你的关键字:ByRef和ByVal
因为每个要传递给函数过程(或子程序)的变量,都可能在接收时改变数值,所以知道如何来保护变量的原始数值是非常重要的。VB有两个关键字,提供或者否认改变变量内容的允许——ByRef和ByVal。VB默认地按地址(关键字ByRef)给函数过程(或子程序)传递信息,引用函数被调用时,函数参数明确的数据。因此,如果函数改变了参数值,原始的数值就被改变了。如果你在函数MyAverage声明参数num1的前面忽略了关键字ByVal时,你就会得到这种结果。如果你想要函数过程
改变原始数值,你不必专门在参数前加关键字ByRef,因为,变量数值的传递默认就是ByRef。当你在参数名称前使用关键字ByVal时,VB按值传递参数,这意味着VB复制一份原始数据,然后将复制值传递给函数,如果函数改变了参数的数值的话,原始数据依然不会变——只有复制值变化。这就是为什么函数MyAverage改变了变量num1的数值,而它的原始值还保持不变。