第六课 认识过程整理版.docx
《第六课 认识过程整理版.docx》由会员分享,可在线阅读,更多相关《第六课 认识过程整理版.docx(16页珍藏版)》请在冰豆网上搜索。
第六课认识过程整理版
第六课认识过程
课程重点:
●过程的定义
●子过程的语法
●过程的作用域
●静态与动态过程
●过程的命名规则
●过程的参数
●执行过程的方法
●过程的执行流程
今天开始真正的进入编程的环节,开始编写代码,前几节都是铺垫,包括学习方法论及让大家重塑信心。
1.过程的定义
VBA中一段完整的可以执行的语句就叫过程,过程包括子过程、函数过程和属性过程,应用最频繁的是子过程。
录制宏产生的过程都是子过程。
每个新手刚开始接触的全是子过程。
自定义函数属于VBA的综合应用,高级用户才需要
以下过程属于子过程的标准格式:
Sub提示()
MsgBox"欢迎使用Excel,今天是"&Date
EndSub
大家可以按Alt+F11组合键进入VBE界面,然后单击“插入”\“模块”,然后粘贴以上代码,接着按F5键执行代码查看过程的执行结果。
使用VBA时95%的情况都是在使用子过程。
函数过程的标志是以Function开头,能返回值。
以下过程属于函数过程的标准格式:
Function及格率(cellAsRange)
及格率=WorksheetFunction.CountIf(cell,">=60")/WorksheetFunction.CountIf(cell,">0")
及格率=Format(及格率,"0.00%")
EndFunction
这是一个自定义函数,我录了一个动画,大家可以了解一下自这一义函数的使用方法。
今天课程的重点是子过程,即Sub开头、EndSub结尾的过程。
对于自定义函数的开发过程以后有专门的课程讲述
2.子过程的语法
[Private|Public|Friend][Static]Subname[(arglist)]
[statements]
[ExitSub]
[statements]
EndSub
这是子过程的语法,比较复杂。
这样标示后就不那么复杂了。
对于以上语法说明需要补充五点:
其一:
其中方括号“[]”中的部分表示可选的,可以根据需要决定是否录入。
而“|”符号是并列分隔符,表示它前后的内容属于同一级别,只能选其中一项。
例如“[Private|Public|Friend][Static]Subname[(arglist)]”实际上相当于以下三句:
[Private][Static]Subname[(arglist)]
[Public][Static]Subname[(arglist)]
[Friend][Static]Subname[(arglist)]
其中:
Public表示所有模块的所有其它过程都可调用这个Sub过程。
Private表示只有当前模块中的其它过程才可以访问当前过程。
Friend仅用于类模块中
如果这3者都忽略,那么默认当作Public处理,也就是说编写sub过程时,sub之前什么都不写,表示这个过程是公有过程,有使用Public相同的效果。
其二:
Static用于声明当前过程是动态过程还是静态过程。
有Static时表示当前过程是静态过程,其特点是过程中的私有变量的值不会消失;
过程无Static时表示当前过程是动态过程,其特点是过程中的私有变量的值将在过程结束后消失。
在后面的内容中会有案例展示。
其三:
括号“()”中的部分表示它是过程的参数。
例如“(arglist)”,同时由于参数外边也有方括号,表示参数也是可选的,可以忽略。
使用了参数的过程只能通过代码执行,不能通过【Alt+F8】的形式在“宏”对话框中执行此过程。
后面会有演示....
其四:
子过程包含程序外壳和代码两部分,程序外壳包括“Subname”和最末一句“EndSub”,这是必选项,任何时候不能省略;
代码部分可以完全省略,不过代码部分才是程序的主体,省略后就不再有意义,所以通常会至少有一句代码。
其五:
代码部分“[statements]”表示过程的任意代码,“[ExitSub]”表示终止过程,该代码允许放在过程中的任意位置,通常配合IF使用或者Goto语句使用,表示符合某条件时终止过程。
接下来针对以上五点分别阐述。
3.过程的作用域
主要针对[Private|Public]二者讲述。
所谓的作用域是指过程的可调用范围。
例如过程可在当前模块中调用,那么过程的作用域就是当前模块,如果过程能在所有模块中调用,那么它的作用域就是所有模块。
其中Public表示所有模块的所有其它过程都可调用这个Sub过程,甚至可以跨工作簿调用。
也称公有过程。
Private表示只有当前模块中的其它过程才可以访问当前过程,称为私有过程。
私有过程不会显示在工作表界面按“Alt+F8”所打开的“宏”对话框中。
以下两个过程都是公有过程:
Subtest
Endsub
PublicSubtest
Endsub
现在请大家跟着我操作:
插入一个“模块1”,写下代码:
如果已经有模块,就不用插入模块了,删除以前的代码,进行下一步就行。
在模块中录入三段代码:
PrivateSubA()
MsgBox123
EndSub
PublicSubB()
MsgBox123
EndSub
SubC()
MsgBox123
EndSub
再插入“模块2”,写下代码:
Subtest()
CallC
CallB
CallA
EndSub
执行后出现以下错误,表示过程A不可以调用,去掉该句代码即可。
由于过程A使用了Private,所以它是一个私有的过程,只能在模块1中才可以调用,而现在在模块2中调用它,所以不能成功。
大家可以删除“CallA”这一句,再执行过程test,然后弹出两个对话框,表示过程A和B都是可以调用的。
因为它们是公有过程,可以跨模块调用。
实事上不仅仅是跨模块间的问题,大家可以按Alt+F11返回工作表界面,然后按Alt+F8:
下图结果显示,私有过程是不可以通过Alt+F8执行的
所以,当你的过程需要声明是私有的时,在Sub前加上Private就行了。
4.静态与动态过程
过程中静态还是动态的由Static决定,我们通常写代码时都忽略了这个前置参数,忽略时表示过程是动态的。
动态和静态有何分别呢?
静态过程特点是过程中的私有变量的值不会消失;动态过程的特点是过程中的私有变量的值将在过程结束后消失。
请大家跟着我操作:
插入一个空白的模块
然后录入以下两个过程:
StaticSubtest1()
b=b+2
MsgBoxb
EndSub
Subtest2()
b=b+2
MsgBoxb
EndSub
两个过程的分别在于第一个是静态的,第二个是动态的。
请先执行第二个过程
执行方法是:
鼠标单击过程中的任意位置,使过程成为当前过程,然后按F5就行了。
最好删除前才的几个过程,前面的那三个过程包括A、B、C
否则会产生干扰。
。
Subtest2()
B=B+2
MsgBoxB
EndSub
的结果是:
永远都是2。
此过程的含义是:
B=B+2表示对变量B在B的原值基础上加2,原值是0,所以B的结果是2
MsgBoxB表示将B的结果显示在对话框中
此处B是一个变量,变量在过程结果后就自动消失,还原为0
所以第二次执行过程时,B又是0,在0的基础上加2,仍然是2
StaticSubtest1()
B=B+2
MsgBoxB
EndSub
这是静态过程,过程中的一切私有变量的值都会保留下来,B的原值是0,加2后就成了2
此时B的值不会消失,下一次执行代码时在2的基础上再累加。
所以就成了4、6、8、10....,这就是动态与静态的分别。
当然,工作中很少用静态的过程,此处稍有了解即可
5.过程的命名规则
我们在编程时,对过程命名有很多规则:
(1)首字母不能是数字
。
(2)不能含有标点符号及空格
(3)不能使用系统内置的保留字
(4)同一个模块中不能与其它过程同名
(5)长度不能超过255
以下是一些不合格的过程名称:
2008:
首字母使用了数字,若用“北京2008”则可以
Sub北京2008()
MsgBox"ILoveVBA"
EndSub
Sub2008()
MsgBox"ILoveVBA"
EndSub
以下是一些不合格的过程名称:
2008:
首字母使用了数字,若用“北京2008”则可以
Sub北京2008()
MsgBox"ILoveVBA"
EndSub
Sub2008()
MsgBox"ILoveVBA"
EndSub
红色表示过程的命名错了
AS:
这是系统的保留字,不可用于过程名称。
为避免与系统冲突,禁止使用此类名称
Subas()
MsgBox"ILoveVBA"
EndSub
Date:
系统的保留字,不可用于过程名称。
为避免与系统冲突,禁止使用此类名称
Subdate()
MsgBox"ILoveVBA"
EndSub
中国-北京:
使用了标点符号之类的特殊符号
Sub中国-北京()
MsgBox"ILoveVBA"
EndSub
VBA:
这个名称虽然可以作为过程的名称,但是建议不用,它会导致通过“VBA.”调用VBA的函数和常数时失败。
但是有了名为VBA的过程后,这招就不灵了,当我们输入vba.时会产生提示信息,帮助我们录入VBA自带的一些函数或者属性。
但是有了名为VBA的过程后,这招就不灵了。
大家可以测试
Range:
这个名称虽然也可以使用,但是建议不用,VBA中表示单元格就使用Range,为了避免误导阅读代码者,尽量改用与VBA中的对象、方法、属性名称不同的名称
另外,如果在同一个过程中存在多个过程同名时,将无法执行代码,它将导致代码编译错误。
下图是执行过程时由于多个过程同名而产生的错误提示:
所谓的“二义性的名称”是指一个名称出现了多次,系统无法判断该执行哪一个。
所以看到此类提示时需要马上检查模块中是否存在同名的过程。
6.过程的参数
过程的参数比较复杂,为什么要用参数也很难短时间内说明白,所以在第8课时专门讲参数,本课时忽略这个内容。
7.执行过程的方法
执行Sub过程有六种方法:
VBE界面中:
选择过程后,按F5键,刚才大家试过了,VBE界面中:
运行按钮。
大家可以找找看,能否看到绿色三角形按钮,工作表界面中:
Alt+F8
选择宏名称后,单击执行就行。
工作表菜单:
按钮
工作表界面(不是菜单)
进入“开发工具”中,单击插入,在上方有一个按钮,单击按钮后,在工作表中拖放即可。
它会自动弹出选择宏的对话框,选择宏名后返回工作表界面,然后单击按钮就能执行了,单击按钮可以调用指定的Sub过程。
工作表界面:
快捷键(以后的课程中再详述用代码对过程指定快捷键)
工作表界面:
菜单(以后的课程中再详述用代码对过程指定快捷键)
9.过程的执行流程
当一个过程中有多句代码时,代码总是按从上到下的顺序逐句执行。
大家可以使用以下简单的语句进行测试:
Sub问候()
MsgBox"早上好"
MsgBox"中午好"
MsgBox"下午好"
MsgBox"晚上好"
EndSub
执行过程后,分别弹出4个对话框,按上下顺序执行,VBA允许将多句代码写在同一行中,中间用冒号分隔开即可。
当多句代码出现在同一行时则按从左到右的顺序执行。
可以通过以下代码验证VBA代码的执行顺序:
Sub问候2()
MsgBox"早上好":
MsgBox"中午好"
MsgBox"下午好":
MsgBox"晚上好"
EndSub
请注意中间的冒号....
不过可以随时通过“ExitSub”终止程序,从而使其后面的所有代码都不再执行。
例如以下代码中使用了两次Msgbox函数,表示会弹出两个信息提示框。
不过由于在中间插入了代码“ExitSub”,所以第二个Msgbox语句并不会执行,在“ExitSub”语句处已经结束了过程。
Sub提示()
MsgBox"Excel很不错!
"
ExitSub
MsgBox"VBA也很犀利啊!
"
EndSub
由于过程是从上到下执行的,当执行到第二句时“ExitSub”结束了过程
所以此处的第三句自动忽略掉了。
如果删除第二句,后面的就可以执行
如果中途调用了另一个子过程,那么执行完该过程中的所有代码后再执行Call语句后面的代码。
以下过程“问候3”中调用了子过程“问候4”,所以执行完“问候4”的两句代码后才执行“问候3”的最后一句代码。
Sub问候3()
MsgBox"早上好"
Call问候4
MsgBox"晚上好"
EndSub
Sub问候4()
MsgBox"中午好"
MsgBox"下午好"
EndSub
大家可以测试以下代码
由于“Call问候4”在“MsgBox"晚上好"”之前
所以执行完“问候4”所有代码后,再执行“MsgBox"晚上好"”
当然,VBA也提供了改变执行顺序的办法,从而适应工作中的实际需求——使用Goto语句。
Goto语句的语法如下:
GoToline
其中参数line是标签名称
标签就相当于为代码作一个标记,当Goto语句指向此标签时可以改变代码的执行流程,跳转到标签所在位置执行其后的代码。
定义标签的方法是在代码之前插入标签名称,以冒号结尾。
以下过程“问候5”使用标签A,代码“IfHour(Now)>20ThenGoToA”表示如果当前时间大于20点,那么执行标签“A”后面的代码,Goto语句到标签A之间的所有代码都将被忽略。
Sub问候5()
MsgBox"早上好"
IfHour(Now)>20ThenGoToA'如果时间大于20点,则执行标签“A”后面的代码
MsgBox"中午好"
MsgBox"下午好"
A:
'设置一个标签:
A
MsgBox"晚上好"
EndSub
请大家录入代码后,不要按F5键执行代码,而是按F8键,每按一次执行一句,反复按下F8,可以查看代码的执行流程,F5快捷键表示瞬间执行过程。
F8一次执行一句代码,F8主要用于调试/查看代码。
使用Goto语句可以随意更改代码的执行语句,通常配合IF使用,表示符合某条件时执行某语句,符合另一条件时执行另一语句。
关于条件语句IfThen在后面的课程会有讲解。
今天的课程就讲到这里,下一次课讲
Msgbox和Inputbox
因为很多时候举例都要用到这两个语句,所以提前接触一下它们的语法和应用思路。
也就是以前的课程中间插入一课,其它的延后。