靠谱电子书 > 经管其他电子书 > excel_vba_编程教程(完整版) >

第30部分

excel_vba_编程教程(完整版)-第30部分

小说: excel_vba_编程教程(完整版) 字数: 每页4000字

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!



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 测试函数过程  
可以编写一个子程序调用自定义函数,并且显示它的结果,看它是否能得到设计结果。除此之外, 
该子过程还应该能显示参数的原始数据,这样,你才能很快知道参数数值是否改变了。如果该函数 
使用了可选参数,你也需要检查不使用可选参数时候的情况。  

10。定位内置函数  

VBA自带了很多内置函数,可以在在线帮助里很容易地找到这些函数。在VB编辑器窗口选择“帮助” 
-“Microsoft Visual Basic帮助”可以访问所有VBA函数按字母顺序排序的清单,然后点击“函 
数”,  
例如,以MsgBox或InputBox函数为例。一个程序好的功能之一就是要与用户互动,当你使用Excel 
时,你通过多种对话框与该应用程序交流,当你犯错的时候,对话框会弹出来,并且告诉你有错误。 
当你编写你自己的程序时,你也可以将出乎意料的错误或某个计算的结果通知用户,你可以使用函 
数MsgBox帮助你做这些。到目前为止,你只是看到了这个函数的一些简单应用,在下面的部分,你 
将了解如何控制你信息的外观;你也将学习如何使用函数InputBox从用户获得信息。在我们详细讨 
论这些函数之前,我们来看一个VBA函数,在你已经很熟悉变量和它们的类型的时候,它对你特别 
有用处。  
VB有个VarType函数,它返回一个值变量类型的整数。图4-4例显示了函数VarType的语法和它返回 
的值。  

                                               89 

… 页面 106…

                                                                                                   
图4-4 使用内置函数VarType,你可以判别变量的类型(译者:本截图与2002版本有区别)  
现在,看看如何在立即窗口里使用这个函数:  
1。  打开立即窗口  
2。  输入下列给变量赋值的语句  
age = 18   
birthdate = #1/1/1981#   
firstName = 〃John〃   
3。  现在询问VB每个变量的数据类型是什么:  
?varType(age)  
你按下回车时,VB返回2,如图4-4所示,数字2代表整数类型。  
?varType(birthdate)   
VB返回7代表日期。如果你在变量名称上犯了个小错误(比如说,你输入了birthday而不是 
birthdate),VB将返回0。  
?varType(firstName)  
VB告诉你变量firstName的数据是字符串(8)。  

11。使用 MsgBox 函数  

你目前使用的MsgBox函数局限于给用户用一个简单的,一个按钮的对话框显示信息。你点击确定按 
钮或者回车来关闭该信息框。要创建一个简单的信息框,只要在MsgBox函数名称后面带上一个用引 
号包括起来的文本就可以了。换句话说,要显示信息“过程已完成”,你应该准备下列语句:  
MsgBox 〃过程已完成〃   ‘(注意,英文状态的引号)  
你可以将它输入立即窗口,快速地测试上面的指令,当你输入完这条指令并且回车后,VB就显示如 

                                           90 

… 页面 107…

图4-5的信息框。  

                     
图4-5 将文本作为MsgBox函数的参数,来给用户显示信息  
MsgBox函数允许你使用其它参数,使你可能决定可用的按钮数目,或者将默认的信息框的标题 
 (Microsoft Excel)改为你自己的标题。也可以设置你自己的帮助主题。MsgBox的语法如下:  
MsgBox (prompt '; buttons' '; title'; '; helpfile; context')   
注意,MsgBox函数有五个参数,只有第一个,Prompt(提示),是必须的;这些列在方括号里面的 
参数都是可选的。当你在提示参数输入一个非常长的文本时,VB决定如何断句,使文本适合信息框 
大小。我们在立即窗口里来做些练习,看不同的文本格式技巧:  
1。  在立即窗口输入以下指令,确保在一行里输入整个文本,回车  
MsgBox 〃All done。 Now open 〃〃Chap04。xls〃〃 and place an empty disk in the diskette drive。  
The following procedure will copy this file to the disk。〃  
一旦回车,VB显示信息框,如图4-6  

                                                                                                 
图4-6 如果你设置一下文本格式,长信息看上去将会更吸引人  
如果你遇到编译错误,可以点击确定,然后确定文件名用双引号括起来——““Chap04。xls””。 
当你的信息文本特别长时,你可以使用VBA函数Chr将它分割为好几行。Chr函数需要你跟参数,这 
个参数是0到255之间的数字,它返回这个数字代表的字符。例如Chr(13)返回的是回车(这和按下 
回车键相同),以及Chr(10)返回换行字符(这在文本行之间添加空行很有用)。  
2。  将上面的指令修改为下述方式:  
MsgBox 〃All done。〃 & Chr(13) & 〃Now open 〃〃Chap04。xls〃〃 and place〃 & Chr(13) & 〃an empty  
disk in the diskette drive。〃 & Chr(13) & 〃The following procedure will copy this file to  
the disk。〃  

                                            
图4-7 通过使用Chr(13)可以将长文本分割成几行  
你必须将每段文本片断用

返回目录 上一页 下一页 回到顶部 0 0

你可能喜欢的