PrivateSubcmdFind剖析Word文件下载.docx
《PrivateSubcmdFind剖析Word文件下载.docx》由会员分享,可在线阅读,更多相关《PrivateSubcmdFind剖析Word文件下载.docx(8页珍藏版)》请在冰豆网上搜索。
arglist参数包含下列语法和部分:
[ByVal|ByVal]varname[()]
ByVal表示该参数按值传递。
ByRef表示该参数按引用传递。
Varname代表参数的变量名称,遵循标准变量命名约定。
说明
如没有显式地指定使用Public或Private,则Sub过程默认为公用,即它们对于Script中的所有其他过程都是可见的。
Sub过程中局部变量的值在调用过程中不被保留。
所有可执行代码必须包含于过程中。
不能在另一个Sub或Function过程中定义一个Sub过程。
使用ExitSub语句可以立即从Sub过程中退出。
程序继续执行调用Sub过程的语句之后的语句。
可以在Sub过程中任意位置出现任意个ExitSub语句。
与Function过程相似之处是:
Sub过程是一个可以获取参数,执行一系列语句以及可改变其参数的值的独立过程。
而与Function过程不同之处是:
Function过程可以返回值,而Sub过程不能用于表达式中。
可以使用过程名并跟随相应的参数列表来调用Sub过程。
关于如何调用Sub过程的详细说明信息,请参阅Call语句。
小心Sub过程可以是递归的,即该过程可以调用自己来完成某个给定的任务。
但是递归可能会导致堆栈溢出。
在Sub过程中使用的变量分为两类:
一类是在过程内显式声明的,另一类则不是。
在过程内显式声明的变量(使用Dim或等效方法)总是局部变量。
对于那些没有在过程中显式声明的变量也是局部的,除非在该过程外更高级别的位置显式地声明它们。
小心过程可以使用没有在过程内显式声明的变量,但只要有任何script级定义的名称与之同名,就会产生名称冲突。
如果过程中引用的未声明的变量与其他的过程、常数或变量的名称相同,则会认为过程引用的是Script级的名称。
显式声明变量可以避免这类冲突,使用OptionExplicit语句可强制显式声明变量。
VisualBasic语言概念
Sub过程
Sub过程是包含在Sub语句和EndSub语句中的一系列VisualBasic语句。
每次调用过程时都执行过程中的语句,从Sub语句后的第一个可执行语句开始,到遇到的第一个EndSub、ExitSub或Return语句结束。
Sub过程执行操作但并不返回值。
它能够带参数,如呼叫代码传递给它的常数、变量或表达式。
声明Sub过程的语法如下所示:
[accessibility]Subsubname[(argumentlist)]
'
StatementsoftheSubproceduregohere.
可访问性可以是Public、Protected、Friend、ProtectedFriend或Private。
可以在模块、类和结构中定义Sub过程。
默认情况下它们是Public,这意味着可以从应用程序中的任意位置调用它们。
参数声明
声明过程的每个参数与声明变量的方法一样,都是指定参数名和数据类型。
也可以指定传递机制,以及参数是否可选。
参数列表中每个参数的语法如下所示:
[Optional][ByVal|ByRef][ParamArray]argumentnameAsdatatype
如果参数是可选的,则还必须在其声明中提供默认值,如下所示:
Optional[ByVal|ByRef]argumentnameAsdatatype=defaultvalue
调用语法
可以使用独立的调用语句来显式调用Sub过程。
不能在表达式中使用其名称来调用它。
调用语句必须提供所有非可选参数的值,并且必须用括号将参数列表括起来。
如果未提供任何参数,则也可以选择省略括号。
Call关键字的使用也是可选的。
调用Sub过程的语法如下所示:
[Call]subname[(argumentlist)]
下面的Sub过程通知计算机操作员应用程序将要执行哪个任务,并且还显示一个时间戳。
应用程序不是在每个任务的开头重复此代码,而仅是从不同的位置调用TellOperator。
每次调用都会传递Task参数中的字符串以标识开始执行的任务。
SubTellOperator(ByValTaskAsString)
DimStampAsDate'
StampislocaltoTellOperator.
Stamp=TimeOfDay()'
Getcurrenttimefortimestamp.
UseMessageBoxclassofSystem.Windows.Formsnamespace.
MessageBox.Show("
Starting"
&
Task&
"
at"
CStr(Stamp))
典型的TellOperator调用如下所示:
CallTellOperator("
fileupdate"
)
请参见
过程|事件处理过程|Function过程|Property过程|过程参数|Sub语句
为了避免难以弄清的复杂的嵌套的If语句,你可以使用SelectCase语句代替。
它的语法为:
SelectCase测试表达式
Case表达式1
如果表达式1匹配测试表达式的语句
Case表达式2
如果表达式2匹配测试表达式的语句
Case表达式N
如果表达式N匹配测试表达式的语句
CaseElse
如果没有表达式匹配测试表达式要执行的语句
EndSelect
你在关键字SelectCase和EndSelect之间放置任意多个条件以测试。
子句CaseElse是可选的,当你希望可能有条件表达式返回假时使用它。
在SelectCase语句里,VB将每个表达式和测试表达式相比较。
这里是SelectCase语句背后的逻辑。
当VB遇到SelectCase子句,它记下测试表达式的值。
然后它前进到下面的第一个Case子句,如果这个表达式的值和测试表达式的值匹配的话,VB就会执行语句直到遇到另外一个Case子句并且跳到EndSelect语句。
然而,如果第一个Case子句后面的表达式测试结果和测试表达式不匹配时,VB就会检查每一个Case子句,直到它找到一个匹配的为止。
如果没有一个Case子句后面的表达式匹配测试表达式的值的话,VB就会跳到CaseElse子句并执行该语句直到遇到关键字EndSelect。
注意,CaseElse子句是可选的,如果你的程序里面没有使用CaseElse并且没有一个Case子句的表达式和测试表达式相匹配,VB就会跳到EndSelect后面的语句,并且继续执行你的程序。
我们来一个使用SelectCase语句的程序例子。
在第四章里,你学习了MsgBox函数允许你显示带有一个或多个按钮的信息,你也学习了MsgBox函数的结果可以赋予一个变量。
使用SelectCase语句,你现在可以基于用户按下的按钮决定采取哪个行动。
1.
在当前工程里插入一新模块
2.
重命名新模块SelectCase.
3.
输入下述过程TestButtons:
SubTestButtons()
DimquestionAsString
DimbtsAsInteger
DimmyTitleAsString
DimmyButtonAsInteger
question="
Doyouwanttoopenanewworkbook?
"
bts=vbYesNoCancel+vbQuestion+vbDefaultButton1
myTitle="
NewWorkbook"
myButton=MsgBox(prompt:
=question,buttons:
=bts,_title:
=myTitle)
SelectCasemyButton
Case6
Workbooks.Add
Case7
MsgBox"
Youcanopenanewbookmanuallylater."
YoupressedCancel."
EndSub
过程TestButtons的第一部分显示一个带有三个按钮的信息框:
是,否和取消。
用户选择按钮的值赋予变量myButton。
如果用户点击“是”,那么变量myButton就会被赋值常量vbYes或它对应的值6;
如果用户点击“否”,那么变量myButton则赋值为常量vbNo或它对应的值7;
最后,如果点击了“取消”,变量myButton的内容就等于vbCancel或2。
SelectCase语句对照储存在变量myButton里的值检查Case子句提供的值。
当有匹配时,就会执行适当的Case语句。
如果你使用常量,而不是按钮值,过程TestButtons同样会运行一致。
CasevbYes
CasevbNo
你可以忽略Else子句,可以按下述方法修改一下SelectCase语句:
CasevbCancel
*********************************************************************************
8.和Case子句一起使用Is
有时候,作决定是基于测试表达式的条件,例如它是否大于,小于,等于或使用一些其它的关系运算符(参见表5-1)。
关键字Is使你能够在Case子句里使用条件表达式。
使用关键字Is的SelectCase语句的语法如下:
CaseIs条件1
如果条件1为真时执行的语句
CaseIs条件2
如果条件2为真时执行的语句
CaseIs条件N
如果条件N为真时执行的语句
EndSelect
例如,我们来比较几个数字:
SelectCasemyNumber
CaseIs<
10
Thenumberislessthan10"
Case11
Youenteredeleven."
CaseIs>
=100
Thenumberisgreaterthanorequalto100."
Thenumberisbetween12and99."
假设变量myNumber为120,那么第三个Case子句为真,并且只有CaseIs>
=100和CaseElse之间的语句会被执行。
9.确定Case子句里数值的范围
在前面的例子里,你看到了在每个Case子句里使用一个简单表达式。
然而,很多时候,你可能需要在Case子句里确定一个数值范围。
可以通过关键字To用于表达式的数值之间来实现它,如下所示:
SelectCaseunitsSold
Case1to100
Discount=0.05
=500
Discount=0.1
Case501to1000
Discount=0.15
1000
Discount=0.2
我们来分析一下上面的SelectCase代码块,假设变量unitsSold当前值为99。
VB将变量unitsSold的值与Case子句的条件表达式进行比较。
第一和第三条Case子句示范如何通过使用关键字To在条件表达式里使用数值范围。
因为unitsSold=99,第一个Case子句里的条件表达式为真,因此,VB将0.05赋给变量Discount。
第二个Case子句如何呢?
它也为真。
尽管,很明显99小于等于500,VB不会执行相关的语句Discount=0.1。
原因是,一旦VB找到了一个真条件的Case子句,它就不会去管其它的Case子句,它将跳过那些代码,继续执行EndSelect语句后面可能有的语句。
我们来练练使用SelectCase语句,在函数过程里使用它。
回想在第四章里,函数过程允许你将结果返回给一个子过程。
假设该子过程必须根据销售的套数来显示一个折扣,你可以从用户那里获得销售套数,然后允许一个函数来确定需要的折扣:
在模块SelectCase里输入下列子过程:
SubDisplayDiscount()
DimunitsSoldAsInteger
DimmyDiscountAsSingle
unitsSold=InputBox("
Enterthenumberofsoldunits:
)
myDiscount=GetDiscount(unitsSold)
MsgBoxmyDiscount
输入下列函数过程:
FunctionGetDiscount(unitsSoldAsInteger)
Case1To200
GetDiscount=0.05
=500
GetDiscount=0.1
Case501To1000
GetDiscount=0.15
GetDiscount=0.2
EndFunction
将光标放在过程DisplayDiscount的任意地方并且按下F5来运行它。
过程DisplayDiscount将储存于变量unitsSold的值传递给函数GetDiscount。
当VB遇到SelectCase语句时,它检查第一个Case子句里的值是否合储存于unitsSold里面的值是否匹配。
如果匹配,VB给函数名称赋值百分之五(0.05),并且跳到关键字EndSelect。
因为,在函数过程里面没有更多需要运行的语句,VB就返回主调过程——DisplayDiscount,在这里,它将函数的结果赋予变量myDiscount。
最后的语句用信息框来显示获得的折扣。
10.在Case子句里确定多个表达式
你可以使用逗号明确单一Case子句里的多个表达式:
SelectCasemyMonth
Case"
January"
"
February"
March"
Debug.PrintmyMonth&
:
1stQtr."
April"
May"
June"
2ndQtr."
July"
August"
September"
3rdQtr."
October"
November"
December"
4thQtr."