按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
选参数在必须的参数之后,列在参数清单的最后;可选参数总是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)可以将长文本分割成几行
你必须将每段文本片断用引号括起来,内嵌在括号里面的文本(显示状态)需要再用一对括号来括
起来,例如““Chap04。xls””。Chr(13)函数指明你希望开始新的一行的地方。字符串的连接字
符(&)用来返回连接字符串的字符。
在一行输入及其长的文本的时候,很容易失误。回想一下,VB有一个专门的线连续字符(下划线_)
帮你将长VBA语句分割为几行,不幸的是,这个线连续符不能在立即窗口使用。
3。 在工程MyFunctions (Chap04。xls)里添加一个新模块并命名为Sample6
4。 激活模块Sample6并且输入如下所示的子程序MyMessage,确保在每个线连续符前面加个空格:
Sub MyMessage()
MsgBox 〃All done。〃 & Chr(13) _
91
… 页面 108…
& 〃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。〃
End Sub
你运行过程MyMessage时,VB显示如图4-7一样的信息。正如你看到的,在几行输入的文本更具可
读性,而且代码更容易维护。你可以在文本行之间添加一下空白行,来增加信息的可读性。使用
Chr(13)或two Chr(10)函数就可以做到,如下列步骤所述。
5。 输入下面的MyMessage2过程:
Sub MyMessage2()
MsgBox 〃All done。〃 & Chr(10) & Chr(10) _
& 〃Now open 〃〃Chap04。xls〃〃 and place〃 & Chr(13) _
& 〃an empty disk in the diskette drive。〃 & Chr(13)& Chr(13) _
& 〃The following procedure will copy this file to the disk。〃
End Sub
图4-8显示了MyMessage2过程产生的信息框。
图4-8 你可以通过在文本行之间添加空行增加信息的可读性
既然你已经掌握了文本的格式技术,那么我们就来仔细地看看MsgBox函数的下一个参数吧。尽管按
钮参数时可选的,但是它的使用还是很频繁的。这个按钮参数明确多少个按钮,并且是什么样的按
钮你想要出现了信息框上,这个参数可以是个常量(参见表4-1),也可以是个数字。如果你忽略
这个参数,结果辛苦只会有一个“确定”按钮,正如你在前面的例子里看到的那样。
表4-1 MsgBox按钮参数的设置
常量 值 描述
按钮设置
vbOKOnly 0 仅显示确定按钮,这是默认值
vbOKCancel 1 显示确定和取消按钮
vbAbortRetryIgnore 2 显示终止,重试和忽略按钮
vbYesNoCancel 3 显示是,否和取消按钮
vbYesNo 4 显示是和否按钮
vbRetryCancel 5 显示重试和取消按钮
图标设置
vbCritical 16 显示重要信息图标
vbQuestion 32 显示问号图标
vbExclamation 48 显示警告信息图标
vbInformation 64 显示信息图标
默认按钮设置
vbDefaultButton1 0 第一个按钮是缺省值
vbDefaultButton2 256 第二个按钮是缺省值
vbDefaultButton3 512 第三个按钮是缺省值
vbDefaultButton4 768 第四个按钮是缺省值
信息框形式
vbApplicationModal 0 应用程序强制返回;应用程序一直被挂起,直到
92
… 页面 109…
用户对消息框作出响应才继续工作。
vbSystemModal 4096 系统强制返回;全部应用程序都被挂起,直到用
户对消息框作出响应才继续工作。
MsgBox显示的其它设置
vbMsgBoxHelpButton 16384 将Help按钮添加到消息框
vbMsgBoxSetForeground 65536 指定消息框窗口作为前景窗口
vbMsgBoxRight 524288 文本为右对齐
vbMsgBoxRtlReading 1048576 指定文本应为在希伯来和阿拉伯语系统中的从右
到左显示
你什么时候应该使用按钮参数呢?假设你要用户对一个问题回到“是”或“否”,你的信息框就需
要两个按钮,当信息框有一个以上的按钮时,就需要将其中一个设置为缺省值,当用户回车的时候,
这个默认的按钮就会自动地被选上。
因为,你可以显示各种各样的信息(重要,警告,信息),所以,你需要通过按钮参数设置图形代
表(图标)来指明信息的重要性。
除了信息类型之外,按钮参数还可以设置是否用户必须先关闭该信息框才能切换到另外的应用程
序。很多情况下,用户需要在对信息框的问题做出反应之前,切换到另外的程序或者进行另外的操
作。如果这个信息框是应用程序模式(vbApplication Modal)的话,用户必须先关闭该信息框后
才能继续使用你的应用程序。另一方面,如果你想要在用户对信息框响应之前,将所有应用程序挂
起,那么你必须在按钮参数里加上系统强制返回设置 (vbSystemModal)。按钮参数的设置分为五组:
按钮设置,图标设置,默认按钮设置,信息框形式和其它的MsgBox显示设置(参见图4-1)。每组
设置里面只能选一个加入按钮参数里面。你可以将每种需要的设置加和起来,来设置按钮参数,例
如,要显示一个带两个按钮(“是”和“否”),问号图标以及将“否”按钮设置为缺省值的信息框,
你可以在表4-1里查找相应的值并且加和起来,你应该得到292(4+32+256)。你可以在立即窗口里
面输入下列代码,快速查看使用该计算的按钮参数的信息框:
MsgBox 〃Do you want to proceed?〃; 292
下面显示的就是信息框结果。当你直接使用加和起来的值作为参数时,你的程序可读性就不高了,
因为没有参考索引表格供你检查292背后的意思。要改善你信息框函数的可读性,最好使用常量,
而不要使用它们的值,例如,在立即窗口输入下列修改后的语句:
MsgBox 〃Do you want to proceed?〃; vbYesNo + vbQuestion + vbDefaultButton2
上面的语句得到如图4-9所示的相同结果。
图4-9 你可以使用可选的按钮参数来确定信息框上的按钮个数
下面的例子示范如何在VB过程里使用按钮参数:
1。 在工程MyFunctions (Chap04。xls)里添加一新模块,并命名为Sample7
2。 激活Sample7模块,并且输入如下子程序MsgYesNo:
Sub MsgYesNo()
Dim question As String
Dim myButtons As Integer
question = 〃是否要打开一个新工作簿?〃
myButtons = vbYesNo + vbQuestion + vbDefaultButton2
MsgBox question; myButtons
End Sub
在上面的子程序里,变量question储存了你的信息文本,而按钮参数的设置则储存于变量
myButtons。除了使用常量名称之外,你还可以使用它们的值,例如下面的: