提供可选参数的缺省值
也可以给可选参数指定缺省值。在下例中,如果未将可选参数传递到函数过程,则返回一个缺省值。
SubListText(xAsString,OptionalyAs_
Integer=12345)
List1.AddItemx
List1.AddItemy
EndSub
PrivateSubCommand1_Click()
strName="yourname" 未提供第二个参数。
CallListText(strName) 添加“yourname”和“12345”。
EndSub
使用不定数量的参数一般说来,过程调用中的参数个数应等于过程说明的参数个数。可用ParamArray关键字指明,过程将接受任意个数的参数。于是可以这样来编写计算总和的Sum函数:
DimxAsInteger
DimyAsInteger
DimintSumAsInteger
SubSum(ParamArrayintNums())
ForEachxInintNums
y=y x
Nextx
intSum=y
EndSub
PrivateSubCommand1_Click()
Sum1,3,5,7,8
List1.AddItemintSum
EndSub
用命名的参数创建简单语句
对许多内建函数、语句和方法,VisualBasic提供了命名参数方法来快捷传递参数值。对命名参数,通过给命名参数赋值,就可按任意次序提供任意多参数。为此,键入命名参数,其后为冒号、等号和值(MyArgument:="SomeValue"),可以按任意次序安排这些赋值,它们之间用逗号分开。注意,下例中的参数顺序和所要参数的顺序相反:
FunctionListText(strNameAsString,OptionalstrAddressAsString)
List1.AddItemstrName
List2.AddItemstrAddress
EndSub
PrivateSubCommand1_Click()
ListTextstrAddress:="12345",strName:="YourName"
EndSub
如果过程有若干不必总要指定的可选参数,则上述内容更为有用。
确定对命名参数的支持
要确定哪一个函数、语句和方法支持命名参数,用“代码”窗口中的“AutoQuickInfo”功能,检查“对象浏览器”,或者参阅语言参考。使用命名参数时要注意以下几点:
在VisualBasic(VB)对象库中的对象的方法不支持命名参数。而VisualBasicforapplications(VBA)对象库中的所有的语言关键字都支持命名的参数。
在语法中,命名参数是用粗体和斜体字表示的。所有其它参数只用斜体字表示。
重点使用命名参数时不能省略所需参数的输入。可以只省略可选参数。对于VisualBasic(VB)和VisualBasicforapplications(VBA)对象库,“对象浏览器”对话框将可选参数用方括号[]括起来。
详细信息请参阅语言参考中的"ByVal"、"ByRef"、"Optional"和"ParamArray"。
控制结构概述
有了控制结构就可控制程序执行的流程。如果未复选控制流语句,程序便从左至右、自顶向下地贯穿这些语句。有些简单程序可以只用单向流程来编写,有些流程可以依靠运算符的优先级来控制,但任何编程语言的效力和用途皆由其通过结构和循环改变语句顺序的能力而得。
判定结构
VisualBasic过程能够测试条件式,然后根据测试结果执行不同的操作。
VisualBasic支持的判定结构有:
1.If…Then
2.If…Then…Else
3.SelectCase
If…Then
用If…Then结构有条件地执行一个或多个语句。单行语法和多行块语法都可以使用:
IfconditionThenstatement
IfconditionThen
statements
EndIf
condition通常是比较式,但它可以是任何计算数值的表达式。VisualBasic将这个值解释为True或False:一个为零的数值为False,而任何非零数值都被看作True。若condition为True,则VisualBasic执行Then关键字后面的所有statements。可以使用单行或多行语法有条件地执行一个语句(下面两个例子等价):
IfanyDate<NowThenanyDate=Now
IfanyDate<NowThen
anyDate=Now
EndIf
注意:If…Then的单行格式不用EndIf语句。如果condition为True时要执行多行代码,则必须使用多行块If…Then…EndIf语法。
IfanyDate<NowThen
anyDate=Now
Timer1.Enabled=False 定时器控制失效。
EndIf
If…Then…Else
用If…Then…Else块定义几个语句块,执行其中一个语句:
Ifcondition1Then
[statementblock-1]
[ElseIfcondition2Then
[statementblock-2]]…
[Else
[statementblock-n]]
EndIf
VisualBasic首先测试condition1。如果它为False,VisualBasic就测试condition2,依此类推,直到找到一个为True的条件。当它找到一个为True的条件时,VisualBasic就会执行相应的语句块,然后执行EndIf后面的代码。作为一个选择,可以包含Else语句块,如果条件都不是True,则VisualBasic执行Else语句块。
If…Then…ElseIf只是If…Then…Else的一个特例。注意,可以使用任意数量的ElseIf子句,或者一个也不用。可以有一个Else子句,而不管有没有ElseIf子句。
例如,应用程序可以根据菜单控件数组中哪个控件被单击而采取相应的动作:
PrivateSubmnuCut_Click(IndexAsInteger)
IfIndex=0Then “剪切”命令。
CopyActiveControl 调用通用过程。
ClearActiveControl
ElseIfIndex=1Then “复制”命令。
CopyActiveControl
ElseIfIndex=2Then “清除”命令。
ClearActiveControl
Else “粘贴”命令。
PasteActiveControl
EndIf
EndSub
注意,总是可以添加更多的ElseIf块到If…Then结构中去。但是,当每个ElseIf都将相同的表达式比作不同的数值时,这个结构编写起来很乏味。在这种情况下可以使用SelectCase判定结构。
详细信息请参阅《VisualBasic6.0语言参考手册》中的“If…Then…Else语句”。
SelectCase
VisualBasic提供SelectCase结构替代If…Then…Else,从而可在多个语句块中有选择地执行其中一个。SelectCase语句的能力与If…Then…Else语句类似,但对多重选择的情况,SelectCase语句使代码更加易读。
SelectCase在结构的上方处理一个测试表达式并只计算一次。然后,VisualBasic将表达式的值与结构中的每个Case的值进行比较。如果相等,就执行与该Case相关联的语句块。
SelectCasetestexpression
[Caseexpressionlist1
[statementblock-1]]
[Caseexpressionlist2
[statementblock-2]]
.
.
.
[CaseElse
[statementblock-n]]
EndSelect
每一个expressionlist是一个或几个值的列表。如果在一个列表中有多个值,就用逗号把值隔开。每一个statementblock中含有零个或多个语句。
如果不止一个Case与测试表达式相匹配,则只对第一个匹配的Case执行与之相关联的语句块。如果在表达式列表中没有一个值与测试表达式相匹配,则VisualBasic执行CaseElse子句(此项是可选的)中的语句。
例如,假定在If…Then…Else的例子中要向“编辑”菜单添加命令。为此可以另加一个ElseIf子句,或用SelectCase来写函数:
PrivateSubmnuCut_Click(IndexAsInteger)
SelectCaseIndex
Case0 “剪切”命令。
CopyActiveControl 调用通用过程。
ClearActiveControl
Case1 “复制”命令。
CopyActiveControl
Case2 “清除”命令。
ClearActiveControl
Case3 “粘贴”命令。
PasteActiveControl
CaseElse
frmFind.Show 显示找到的对话框。
EndSelect
EndSub
注意SelectCase结构每次都要在开始处计算表达式的值。而If…Then…Else结构为每个ElseIf语句计算不同的表达式。只有在If语句和每一个ElseIf语句计算相同表达式时,才能用SelectCase结构替换If…Then…Else结构。
->