按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
数JoinText。VB将这些变量的值取代函数JoinText的参数,并且将结果赋到函数名称(JoinText)
上。当VB返回过程EnterText时,函数的值储存于变量r。然后,函数MsgBox在信息框里显示变量r
的内容。结果就是用户的完整姓名(姓和名用空格分开)。要从函数传递数值给子程序,需要将该
值赋到函数名称,例如,下面的函数NumOfDays将值7传递到子程序DaysInAWeek:
Function NumOfDays()
NumOfDays = 7
End Function
Sub DaysInAWeek()
MsgBox 〃There are 〃 & NumOfDays & 〃 days in a week。〃
End Sub
技巧4-8 函数过程不能做什么
函数过程不能进行任何动作,例如,它们不能在工作表里做插入,删除或设置数据格式操作,不能
打开文件,或改变屏幕显示样式
7。明确参数类型
在前面的部分,你学习了函数根据它们自变量传递的值进行计算,当你声明函数时,你将参数名称
列在一对括号里面。参数名称就像变量一样,每个参数名称在函数调用时,引用你提供的数值。当
子程序调用函数过程时,它以变量形式传递参数。一旦函数做点什么,它就将结果赋给函数名称。
注意,函数过程的名称当作变量来使用。
象变量一样,函数也有类型,函数的结果可以是字符串型,整型,长整型,等。要明确你函数的结
果类型,只有在函数声明行后添加关键字As和你想要的类型即可。例如:
Function MultiplyIt(num1; num2) As Integer
如果你不明确数据类型,VB将把你的函数结果设置为默认类型(Variant数据类型)。当你明确你的
函数结果的数据类型时,就象你明确变量的数据类型那样有一些好处,你的程序将更有效地使用内
存,因此它运行得也更快些。
我们来看看这个例子,尽管其参数在主调过程声明的是单精度浮点型,但是函数仍然返回整型数据:
1。 在工程MyFunctions (Chap04。xls)里添加一个新模块,重命名为Sample3
2。 激活模块Sample3并且输入子程序HowMuch,如下所示:
Sub HowMuch()
Dim num1 As Single
Dim num2 As Single
Dim result As Single
num1 = 45。33
num2 = 19。24
result = MultiplyIt(num1; num2)
MsgBox result
End Sub
3。 在子程序HowMuch下面输入下列函数过程:
Function MultiplyIt(num1;num2) As Integer
MultiplyIt = num1 * num2
End Function
因为储存于变量num1和num2的数值不是整数,要确保它们相乘后的结果为整数,你就得将函数结果
设置为整型。如果你不给函数MultiplyIt的结果设置数据类型,过程HowMuch将会将结果按变量
result声明的数据类型显示,相乘的结果将是872。1492,而不是872。
你可以在每次运行该过程时,提供它们不同的数值,来使得该函数更有用,你可以使用InputBox
函数来输入数据,而不拘泥于程序代码给定的数值。你自己可以依照前面章节中的子程序
EnterText,花几分钟来修改过程HowMuch。
87
… 页面 104…
8。按地址和按值传递参数
在一些过程中,当你将参数作为变量传递时,VB可能突然改变该变量的数值。要确保该被调函数不
改变传递的参数值,你应该在函数声明行在参数名称之前加上关键字ByVal。我们来看看这个例子:
1。 在工程MyFunctions (Chap04。xls)里添加一新模块,命名为Sample4
2。 激活模块Sample4并输入下列代码:
Sub ThreeNumbers()
Dim num1 As Integer; num2 As Integer; num3 As Integer
num1 = 10
num2 = 20
num3 = 30
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。3333333333333而不是期望的20,接下来的三个
函数显示每个变量的内容,变量储存的内容和它们开始被赋的值一致——10,20,30。
如果你在函数声明行忽略了参数num1前面的关键字ByVal,结果会怎样呢?函数的结果仍然相同,
但是函数MsgBox显示的变量num1的内容现在是11了。函数MyAverage不但返回了出乎意料的结果
(20。3333333333333而非20),而且改变了储存在变量num1里的原始数值。要避免VB永久地改变提
供给函数的数值,就得使用关键字ByVal。
技巧4-9 了解你的关键字:ByRef和ByVal
因为每个要传递给函数过程(或子程序)的变量,都可能在接收时改变数值,所以知道如何来保护
变量的原始数值是非常重要的。VB有两个关键字,提供或者否认改变变量内容的允许——ByRef和
ByVal。VB默认地按地址(关键字ByRef)给函数过程(或子程序)传递信息,引用函数被调用时,
函数参数明确的数据。因此,如果函数改变了参数值,原始的数值就被改变了。如果你在函数
MyAverage声明参数num1的前面忽略了关键字ByVal时,你就会得到这种结果。如果你想要函数过程
改变原始数值,你不必专门在参数前加关键字ByRef,因为,变量数值的传递默认就是ByRef。当你
在参数名称前使用关键字ByVal时,VB按值传递参数,这意味着VB复制一份原始数据,然后将复制
值传递给函数,如果函数改变了参数的数值的话,原始数据依然不会变——只有复制值变化。这就
是为什么函数MyAverage改变了变量num1的数值,而它的原始值还保持不变。
9。使用可选的参数
有时候,你也许要给函数提供额外的参数,例如,你有一个计算每个人膳食的函数。然而,有时你
不希望函数进行相同的计算。在参数名称前面加上关键字Optional可以指明该参数不是必须的。可
选参数在必须的参数之后,列在参数清单的最后;可选参数总是Variant数据类型,这意味着你不
能使用关键字As来明确可选参数的类型。在前面部分,你创建了一个计算三个数值的平均值的函数,
假设,你有时只想要计算两个数的均值,你就可以将第三个参数设置为可选的。为了不破坏原来的
函数MyAverage,我们来创建一个新的函数Avg,来计算两个或三个数字的均值:
1。 在工程MyFunctions (Chap04。xls)里添加一新模块,命名为Sample5
2。 激活模块Sample5并且输入下列函数:
Function Avg(num1; num2; Optional num3)
88
… 页面 105…
Dim totalNums As Integer
totalNums = 3
If IsMissing(num3) Then
num3 = 0
totalNums = totalNums –1
End If
Avg = (num1+num2+num3)/totalNums
End Function
3。 现在来从立即窗口调用该函数:
?Avg(2;3)
一旦你按下回车,VB就显示结果:2。5
?Avg(2;3;5)
这次结果为:3。3333333333333
你已经看到,函数Avg允许你计算两个或三个数字的平均值,你可以决定计算几个值的平均值。当
你在立即窗口开始输入函数的参数时,VB将可选的参数显示在方括号里(译者:方括号里的参数表
示是可选的)
我们花几分钟来分析一下函数Avg。该函数最多可以用三个参数;参数num1和num2是必须的,而第
三个参数num3是可选的。注意,可选参数以关键字Optional开头,可选参数列在参数清单的后面。
因为参数num1,num2和num3的类型都没有声明,VB对待它们为Variant。
函数内部,变量totalNums声明为整型,并且初始赋值为3。因为该函数必须能够处理两个或三个数
字的平均值计算,有关很方便的内置函数IsMissing在检查参数的个数。如果第三个参数没有提供,
函数IsMissing的值为0,同时变量totalNums的值被减去1,因此如果没有可选参数,totalNums为2。
接下来的代码根据提供的数据计算平均值,并且将结果传递到函数名称。
函数IsMissing用来检测可选参数是否提供,如果第三个参数没有提供,那么该函数返回逻辑值
True,如果提供了第三个参数时,则返回False。在这里,函数IsMissing是和一个做判断的语句
If…Then一起使用的(参见第五章有关该语句和VBA中其它判断语句信息)。如果没有参数num3
(IsMissing),那么(Then)VB将num3设置为0,并且将变量totalNums减去1(totalNums = totalNums
– 1)。你还能使用别的方法来运行函数Avg吗?使用你自己的方法在工作表里运行该函数,确保你
使用两个和三个参数来运行该函数。
技巧4-10 测试函数过�