excel_vba_编程教程(完整版)-第33部分
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
4。 使用鼠标选择你要的单元格,当鼠标在单元格上拖动时,VB就会将选择的区域引用到对话框的
编辑框里面。
图4…13 使用Excel的InputBox方法,你可以从用户处获得区域地址
5。 你选择了单元格后,点击对话框上的确定按钮,被选择的区域就已经设置好格式了。要检查是
否按你的意思设置了,你可以在该区域的任意单元格里输入一个整数,这个数字应该显示为两
位小数。
6。 重新运行该过程,并且当出现对话框时,点击取消按钮。如果你在选择了一个单元格或者一个
区域后点击确定按钮,过程WhatRange将工作正常。不幸地是,当你点击取消按钮或Esc按钮,
VB将显示一错误信息——“要求对象”。当你点击错误对话框上的调试按钮,VB就会加亮导致
错误的代码行。因为你不希望在取消对话框时选择任何单元格,所以你必须想个法子忽略VB
显示的这个错误。使用一个专门的语句,On Error GoTo 标志,你就可以绕过错误的发生。该
指令的语法如下:
On Error GoTo 标志
这个指令应该放在变量声明行的下面。标志可以是除了VB关键字之外的任何你想要的词语。如
果错误发生时,VB就会直接跳到该特别的标志,如下面步骤8所示。
7。 选择“运行”…“重新设置”以取消正在运行的程序。
8。 将过程WhatRange修改为如下所示WhatRange2:
Sub WhatRange2()
Dim newRange As Range
Dim tellMe As String
On Error GoTo VeryEnd
tellMe = 〃Use the mouse to select a range:〃
99
… 页面 116…
Set newRange = Application。InputBox(prompt:=tellMe; _
Title:=〃Range to format〃; _
Type:=8)
newRange。NumberFormat = 〃0。00〃
newRange。Select
VeryEnd:
End Sub
9。 运行程序WhatRange2,一旦出现对话框时就点击取消按钮。注意,这次程序没有产生错误。当
VB遭遇错误时,就会跳到位于程序结尾处的标志VeryEnd。位于错误和标志VeryEnd之间的语句
被忽略了(原文不当:The statements placed between On Error Goto VeryEnd and the VeryEnd
label are ignored)。你将在第十三章里面找到更多的诱捕VBA程序里错误的例子。
技巧4…14 子程序和函数:你应该使用哪个?
创建子程序的时候:
创建函数的时候:
16。使用主过程和子过程
当你大VBA程序得越来越大,要很好地维护这么多的代码行是很困难的。要让你的程序容易编写、
理解和改变,你就应该使用井井有条的结构化程序。如何创建结构化程序?你只要简单地将大问题
分成一些可以同时执行的小问题就行。在VBA中,你可以通过创建一个主过程和一个或多个子过程
来实现它。因为主过程和子过程都是子程序,所以你都可以用关键字Sub将它们声明。主过程可以
调用所需的子过程,并且将参数传递给它们。它也可以调用函数。下面的例子显示过程AboutUser。
该过程要求用户姓和名,并且将姓和名从全名中分离出来。最后的语句显示用户的姓,随后是逗号
和名。你再读下去,该过程将被分割成几个任务,以示范使用主过程,子过程和函数的概念。
Sub AboutUser()
Dim fullName As String
Dim firstName As String
Dim lastName As String
Dim space As Integer
'get input from user 从用户获取信息
fullName = InputBox(〃Enter first and last name:〃)
'get first and last name strings 获得姓和名字符串
space = InStr(fullName; 〃 〃)
firstName = Left(fullName; space – 1)
lastName = Right(fullName; Len(fullName) – space)
'display last name; first name 显示姓和名
MsgBox lastName & 〃; 〃 & firstName
End Sub
过程AboutUser可以分割为一些细小的任务。第一个任务便是获取用户的全名;下一个任务则需要
你将用户提供的数据分割为两个字符串:姓和名,这些任务可以交给不同的函数(例如:GetLast
和GetFirst);最后的任务是显示重新排列的姓名字符串信息。既然你已经知道了你应该注重于哪
些任务,我们现在就来看看如何完成每个任务。
1。 在你当前的VBA工程里面添加一个模块,并重命名为Sample9
2。 在Sample9模块窗口里面输入下列过程AboutUserMaster:
100
… 页面 117…
Sub AboutUserMaster()
Dim first As String; last As String; full As String
Call GetUserName(full)
first = GetFirst(full)
last = GetLast(full)
Call DisplayLastFirst(first; last)
End Sub
上面显示的主过程通过调用适当的子程序和函数来控制程序的主流程。该主过程以变量生命开始,
第一条语句Call GetUserName (full)调用子过程GetUserName(见第三步)并且传递给一参数——
变量full的内容。
因为变量在执行调用语句之前没有赋与任何值,所以它的值是一个空字符串(“ ”)。注意,子过程
的名称在Call之后。尽管你在调用过程时并没有要求使用关键字Call,但是,你在调用一个需要参
数的过程时就必须使用它。参数列表必须包括在括号里面。
3。 输入下面的GetUserName子程序:
Sub GetUserName(fullName As String)
fullName = InputBox(〃Enter first and last name:〃)
End Sub
过程GetUserName示范了两个非常重要的VB编程概念:如何传递参数给一子程序以及如何将值从子
程序传递回给主调过程。
在主过程(见第二步)中,你调用了过程GetUserName,并且将其作为一参数传递:变量full。该
变量被参数fullName接收,该参数子过程GetUserName的Sub语句里声明了。因为在VB调用子过程
GetUserName的时候,变量full包含一空字符串,参数fullName同样也接收了这个空字符串。当VB
显示对话框并且获得用户的姓名时,这个姓名将赋给参数fullName。赋给参数的值被传递回给子过
程执行后的匹配参数。因此,当VB返回主过程时,变量full就回包含用户的姓名。
传递给子过程的自变量将被其参数接收。注意,参数名称(fullName)后面紧跟着数据类型的声明
(As String)。虽然,参数的数据类型必须和相匹配的自变量的数据类型一致,但是,不同的名称
还是可以使用给一个自变量和它相应的参数。
技巧4…15 自变量(Arguments)和参数(Parameters)
4。 输入下述函数GetFirst:
Function GetFirst(fullName As String)
Dim space As Integer
space = InStr(fullName; 〃 〃)
GetFirst = Left(fullName; space … 1)
End Function
主过程中的第二条语句(见第二步)first = GetFirst(full),将变量full的值传递给函数GetFirst。
函数的参数fullName接收到该值。要从用户提供的数据里分出姓和名,你就必须找到姓和名中间的
空格。因此,该函数的开头是当地变量space的声明,下条语句则使用VBA内置函数InStr返回字符
串fullName里空格(“ ”)的位置。然后将获得的数字赋值给变量space。最后,Left函数用来提取
字符串fullName从左到某特定个数(space …1)的字符。名的长度比储存在变量space的值少一个
字符。函数的结果(用户的名)赋值给函数名。当VB返回主过程时,它就将结果放置于变量first。
5。 输入下列函数GetLast:
Function GetLast(fullName As String)
Dim space As Integer
space = InStr(fullName; 〃 〃)
GetLast = Right(fullName; Len(fullName) … space)
End Function
主过程里面的第三条语句 (见第二步)last = GetLast(full),将变量full的值传递给函数GetLast。
该函数的目的是提取用户提供的数据中的用户的姓。函数GetLast使用内置函数Len来计算字符串
101
… 页面 118…
fullName的总字符数。函数Right提取字符串fullName从右边某个特定字符开始(Len(fullName) –
space)的字符。然后,获得的字符串赋值给函数名称,一旦返回主过程,它就储存于变量last。
6。 输入下述子过程DisplayLastFirst:
Sub DisplayLastFirst(firstName As String; lastName As String)
MsgBox lastName & 〃; 〃 & firstName
End Sub
主过程里面的第四条语句(见第二步)Call DisplayLastFirst(first; last),调用子过程
DisplayLastFirst并且将两个自变量:first和last。为了接收这些自变量,子过程
DisplayLastFirst和两个相匹配的参数(firstName和lastName)一起被声明了。回想我们前面说
过,不同的名称可以用在自变量和相应的参数上。然后子过程DisplayLastFirst显示用户的姓,逗
号,和名。
技巧4…16 使用子过程的好处
17。接下来……
在本章里,你学习了子过程和函数之间的区别:子过程执行操作;函数返回数值。而且你可以通过
录制或者输入来创建子过程,函数则不可以录制,因为它们可能需要参数,你必须手动输入。你看
到了从工作表或者其他VB过程调用的函数实例。
你学习了如何给函数传递自变量,决定函数结果的数据类型。你在你的VBA关键字的系统里增加了
ByVal,ByRef和Optional等关键字。你也看到如何将问题分割为更小更简单的任务,以使你的程序
更容易理解。最后,你学习了子过程如何在参数的帮助下,将数值传递回到主调过程。
过了本章后,你应该能够创建适合你特定需要的你自己的自定义函数了。你应该可以通过使用
MsgBox和InputBox函数轻松地和用户互动。第五张将介绍程序抉择,你将学习如何基于你提供的情
形结果改变你的VBA过程的方向。
第五章 基于 VBA 做决定
作者:Julitta Korol 翻译:Tiger Chen Jan 16’ 2005
我们每天要作成千上万个决定,有些决定是自发的,我们自动地作出了这些决定,而不需要停下来
去想。其它的决定则需要我们事先两个或者两个以上的选择甚至计划好几个任务。VBA和其它的编
程语言一样,提供了专门的语句允许你在自己的程序中包含抉择点。但是,什么是做决定呢?举例
说某人问你这个问题:“你喜欢红色吗?”想过这个问题之后,你将回答“是”或者“不”。如果你
不确定或者根本就不关心这个问题,你也许就回答“也许”或“可能”。在编程中,你必须决断,
只有“是”或“否”的答案是允许的。在编程中,所有的决定都是基于提供的答案作出的。如果答
案是肯定的,程序就会执行某段特定的指令;如果答案是否定的,程序则将执行另外一段指令或者
干脆就不做任何操作。在本章,你将学习如何使用VBA条件语句来改变你的程序流向。条件语句通
常称为“控制结构”,因为它们使你能够控制你的VBA过程的走向,跳过某些语句以及“分叉”到程
序的另外一部份去了。
1。关系和逻辑运算符
你在你的VBA过程里面通过使用专门的控制结构里的条件表达式来做决定。条件表达式是使用关系
运算符(见表5…1),逻辑运算符(见表5…2)或者两者结合的表达式。当VB在你程序里遇到条件表
达式时,它将评估该表达式是对还是错。
表5…1 VBA中的关系运算符
运算符 描述
= 等于