VBA定位内置函数
VBA自带了很多内置函数,可以在在线帮助里很容易地找到这些函数。在VB编辑器窗口选择“帮助”-“Microsoft Visual Basic帮助”可以访问所有VBA函数按字母顺序排序的清单,然后点击“函数”,例如,以MsgBox或InputBox函数为例。一个程序好的功能之一就是要与用户互动,当你使用Excel时,你通过多种对话框与该应用程序交流,当你犯错的时候,对话框会弹出来,并且告诉你有错误。
当你编写你自己的程序时,你也可以将出乎意料的错误或某个计算的结果通知用户,你可以使用函数MsgBox帮助你做这些。到目前为止,你只是看到了这个函数的一些简单应用,在下面的部分,你将了解如何控制你信息的外观;你也将学习如何使用函数InputBox从用户获得信息。在我们详细讨论这些函数之前,我们来看一个VBA函数,在你已经很熟悉变量和它们的类型的时候,它对你特别有用处。
VB有个VarType函数,它返回一个值变量类型的整数。图4-4例显示了函数VarType的语法和它返回的值。
图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)。
使用MsgBox函数
你目前使用的MsgBox函数局限于给用户用一个简单的,一个按钮的对话框显示信息。你点击确定按钮或者回车来关闭该信息框。要创建一个简单的信息框,只要在MsgBox函数名称后面带上一个用引号包括起来的文本就可以了。换句话说,要显示信息“过程已完成”,你应该准备下列语句:
MsgBox "过程已完成" ‘(注意,英文状态的引号)
你可以将它输入立即窗口,快速地测试上面的指令,当你输入完这条指令并且回车后,VB就显示如图4-5的信息框。
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)_
& "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按钮参数的设置
你什么时候应该使用按钮参数呢?假设你要用户对一个问题回到“是”或“否”,你的信息框就需要两个按钮,当信息框有一个以上的按钮时,就需要将其中一个设置为缺省值,当用户回车的时候,这个默认的按钮就会自动地被选上。
因为,你可以显示各种各样的信息(重要,警告,信息),所以,你需要通过按钮参数设置图形代
表(图标)来指明信息的重要性。
除了信息类型之外,按钮参数还可以设置是否用户必须先关闭该信息框才能切换到另外的应用程序。很多情况下,用户需要在对信息框的问题做出反应之前,切换到另外的程序或者进行另外的操作。如果这个信息框是应用程序模式(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。除了使用常量名称之外,你还可以使用它们的值,例如下面的:
myButtons = 4 + 32 + 256
但是,明确了按钮常数的常量名称的话,你可以使你的程序对你自己以及将来可能要使用该程序的人来说更容易理解。变量question和myButtons用作MsgBox函数的参数。运行该程序后,你将看到如图4-9所示的结果。注意,现在按钮“否”是被选中的,它是该对话框的默认按钮,如果你按下回车,Excel将该信息框从屏幕上移除,因为MsgBox函数后面没有任何指令,所以,不会发生其它操作。将默认按钮换成vbDefaultButton1设置,可以更改默认按钮。
MsgBox函数的第三个参数是标题,虽然这也是个可选参数,但是它很方便,因为当你忽略它们(默认为Microsoft Excel)时,就不能给程序提供可视提示。你可以使用这个参数,将标题栏设置为你想要的任何文字。假设你要过程MsgYesNo显示标题为“新工作簿”,下面的过程MsgYesNo2示范如何使用标题参数:
Sub MsgYesNo2()
Dim question As String
Dim myButtons As Integer
Dim myTitle As String
question = "Do you want to open a new workbook?"
myButtons = vbYesNo + vbQuestion + vbDefaultButton2
myTitle = "New workbook"
MsgBox question, myButtons, myTitle
End Sub
标题参数文本储存于变量myTitle。如果你没有明确标题参数的内容,VB将默认显示为“Microsoft Excel”。注意,参数是基于MsgBox函数决定的顺序列出的,如果你要按你自己的顺序列出这些参数的话,你就必须将参数名称一起写出,例如:
MsgBox title:=myTitle, prompt:=question, buttons:=myButtons
后面两个参数——帮助文件(helpfile)和上下文(context)——经常为那些对Windows环境下的帮助文件很熟悉的程序员使用。参数helpfile指明某个包含你要显示给用户的附加信息的具体帮助文件的名称,当你明确了这个参数后,Help按钮就会在信息框上显示出来。当你使用helpfile参数时,你同时也使用context参数。这个参数表明在帮助文件里你要显示的那个帮助主题。假设Help.hlp是你创建的帮助文件,55是你要使用的帮助主题,你可以按照如下指令来显示这些信息于信息框上:
MsgBox title:=mytitle, _
prompt:=question _
buttons:=mybuttons _
helpFile:= "HelpX.hlp", _
context:=55
上面只是一条VBA语句,使用连接符打断为好几行。