VBA程序设计基础.docx
《VBA程序设计基础.docx》由会员分享,可在线阅读,更多相关《VBA程序设计基础.docx(27页珍藏版)》请在冰豆网上搜索。
VBA程序设计基础
第九章程序设计基础
教学目标:
●理解什么是程序
●掌握程序设计的基本方法
●编写并调试简单的VBA应用程序
●编写简单的事件驱动程序
●会在VBA应用程序中访问数据库
教学过程:
一、程序设计概述
做一件事,计算机可以把它分解为一系列的基本操作步骤,通过程序设计语言的基本语句来完成,这就是程序。
程序设计方法主要有两种:
面向过程的结构化程序设计方法和面向对象的程序设计方法。
前面所学的窗体对象设计就是一种面向对象的设计方法。
在Access中编写程序使用的语言是VisualBasicforApplication,简单VBA。
首先看一下VBA编写的几个简单程序。
例9-1在窗体上放置一个命令按钮和一个文本框,单击命令按钮后在文本框中显示“VBA程序设计”
步骤如下:
1、打开数据库,切换到“窗体”对象下,双击“在设计视图中创建窗体”,
2、添加文本框,在对应的属性窗口“全部”选项卡的第一行设置名称为“文本1”,添加命令按钮,名称为“命令0”
3、打开“按钮”的属性窗口,在“事件”选项卡下的“单击”栏选“事件过程”,单击后面的按钮,进入编辑窗口:
4、在编辑窗口中输入如下程序:
(其实窗口中已有,所以我们只要在中间添加一句
PrivateSub命令0_Click()
文本1.Value=“VBA程序设计”
说明:
1、程序的开头“PrivateSub”和结束“EndSub”是一个固定搭配,表示这是一个过程,程序中的“命令0_Click()”表示这个程序在“命令0”按钮被单击时执行。
2、在编辑窗口已有程序的开头和结尾,所以我们只要输入中间的一句:
文本1.value=“VBA程序设计”
3、注意程序中引用的“命令0”,“文本1”一定要和窗体中的按钮、文本框名称一致。
EndSub
5、关闭程序编辑窗口,切换到窗体视图,则单击命令按钮后,“VBA程序设计”即显示在文本框中。
思考在上面的窗体中再添加一个按钮,单击则清除文本框中显示的文本,应该怎样操作?
例9-2在窗体中有一个命令按钮和两个文本框,用户在第一个文本框中输入一个正整数,当单击该按钮时计算出这个正整数的阶乘,并在第二个文本框中显示计算结果。
步骤:
1、新建一个窗体,拖入两个文本框和一个命令按钮,名称为文本1、文本2、命令0(这三个控件名称后面程序中要引用,所以一定要命名!
)
2、选中按钮,打开其属性窗口,在“事件”选项下的“单击”一栏,选“事件过程”,单击后面的按钮,输入如下程序:
说明:
1、程序中变量在使用前要先定义,这里计算阶乘,用到的只能是整数,所以定义a、b、c为整型变量。
(见中间程序部分的第一句:
DimaAsInteger)
2、单引号后面的是程序的注释语句,只起说明的作用,程序并不执行它。
不输入这些语句,程序照样正常运行。
(见绿色部分)
3、输入程序时可以用小写字母输入单词,但每一个关键词的第一个字母计算机会自动变成大写。
(见程序中蓝色部分)
4、程序一般一句一行,也可多个句子写在一行,中间用冒号隔开;如果一句太长,需要分成多行,可在上一行的最后加下划线“_”,系统就会把上下两行连在一起做为一个语句。
3、关闭程序编辑窗口,切换到窗体视图,我们输入5,单击“计算”按钮,则会显示120,
(实际上,5!
=1×2×3×4×5,计算结果是120)
二、程序的输入输入出语句
(1)InputBox函数
格式:
InputBox字符串1,[字符串2],[字符串3]
功能:
显示一个输入对话框,等待用户输入信息或按下按钮。
在按钮事件发生后返回键盘输入到文本框中的内容,返回值的类型为文本类型,
说明:
对话框中的提示信息是字符串1,对话框的标题栏是字符串2,字符串3是输入对话框中的默认值。
后两个字符串是可选项,可不选。
例9-3在窗体的命令按钮中分别加入以下代码,单击按钮后即可看出输入对话框的不同。
PrivateSubCommand0_Click()
InputBox"请输入学号","学号输入框","2009"
EndSub
改成下面程序后的输入对话框:
PrivateSubCommand0_Click()
InputBox"请输入学号","学号输入框"
EndSub
改成下面程序后的输入对话框:
PrivateSubCommand0_Click()
InputBox"请输入学号"
EndSub
(2)MsgBox函数
格式:
MsgBox字符串1,[按钮参数],[字符串2]
功能:
出现一个消息框,字符串1为消息框中的提示信息,按钮参数则决定了消息框中按钮的类型(见下面按钮参数表),字符串2为消息框的标题栏上信息。
按钮参数表:
常数
值
按钮类型
vbOKOnly
0
只显示OK按钮
vbOKCancel
1
显示OK及Cancel按钮
vbYesNoCancel
3
显示Yes、No、Cancel按钮
vbQuestion
32
显示WarningQuery图标
vbExclamation
48
显示WaringMessage图标
vbInformation
64
显示InformationMessage图标
vbDefaultButton1
0
第一个按钮是缺省值
vbDefaultButton2
256
第二个按钮是缺省值
vbDefaultButton3
512
第三个按钮是缺省值
例9-4在窗体上添加一个命令按钮,当单击该按钮后,显示一个对话框:
(1)提示消息为“您确定要退出吗?
”。
(2)包含“确定”和“取消”两个命令按钮以及一个询问图标,默认选择“确定”按钮,(3)对话框的标题栏为“确认退出”
分析:
生成对话框需要用MsgBox函数,包含“确定”和“取消”按钮,对应参数为1(见上表);包含一个询问图标,对应参数为32;默认选择是“确定”按钮(这里的第一个就是“确定”按钮),对应参数是0,根据题目要求对应的语句应为:
MsgBox“您确定要退出吗?
”,1+32+0,“确认退出”
步骤:
1、新建一个窗体,添加一个命令按钮,
2、在命令按钮的属性窗口中切换到“事件”选项下,在“单击”一栏中选“事件过程”,单击这一栏后面的按钮,出现VBA编程窗口,
3、在程序开头和结尾之间添加一句:
MsgBox“您确定要退出吗?
”,1+32+0,“确认退出”,见下图:
4、切换到窗体视图,单击命令按钮,弹出一个消息框,如图:
说明:
1、使用参数进行组合时不能互相矛盾,例如不能同时显示“确定”‘“取消”两个按钮和“是”、“否”、“取消”三个按钮。
2、上面的组合参数可以求和后表示,也可用按钮参数表中对应的常数表示,下面几种形式均可:
MsgBox“您确定要退出吗?
”,1+32+0,“确认退出”
MsgBox“您确定要退出吗?
”,33,“确认退出”
MsgBox“您确定要退出吗?
”,vbOKCancel+vbQuestion+vbDefaultButton1,“确认退出”
3、当用户点击了不同的按钮,我们可以根据按钮的返回值来判定用户选择了哪个按钮,按钮返回值如下表:
MsgBox返回值
常数
值
选择按钮
vbOK
1
选择了OK
vbCancel
2
选择了Cancel
vbYes
6
选择了Yes
vbNo
7
选择了NO
例9-5在窗体上添加一个命令按钮,当单击该按钮后接受用户输入的三角形三边长,并求出周长后输出
步骤:
1、新建一个窗体,添加一个命令按钮command0
2、
PrivateSubCommand0_Click()
'定义a,b,c,s为单精度变量,a,b,c为三边长,s为周长
DimaAsSingle,bAsSingle,cAsSingle,sAsSingle
'利用输入对话框接受键盘输入的值,并用Val()函数转把字符串转换成数值
a=Val(InputBox("请输入三角形的第一个边长:
"))
b=Val(InputBox("请输入三角形的第二个边长:
"))
c=Val(InputBox("请输入三角形的第三个边长:
"))
s=a+b+c
MsgBox"三角形的周长是:
"&s
EndSub
在命令按钮的属性窗口中为其添加代码:
如图
3、切换到窗体视图,单击命令按钮,在弹出的对话框中依次输入三个值,例如3、4、5
则弹出一个消息框,显示三边长的结果:
三、赋值语句
格式:
变量名=表达式
功能:
把右边表达式的值给左边的变量。
例如x=2+1,x=x+1
说明:
1、变量要先定义才能使用
2、赋值号两边的数值必须兼容,即数据类型尽量一致。
否则容易出错
例如:
DimxasInteger,yasSingle,zasString‘定义x为整数,y为单精度数,z为文本字符
X=3.5
Y=4
Z=”ACCESS”
第二句x定义为整数,却给了个小数3.5,此时x会取4,
第三句y是单精度数,给了整数4,但系统可以转换成4.000再给变量y,所以是合法的。
第四句z是字符变量,所以等式右边只能赋值一个字符串。
3、等号左边只能有一个变量,右边可以是含这个变量的表达式,
例如x=x+1正确,但x+1=x就不正确了。
4、赋值号右边的计算结果必须在左边变量的表示范围之内,否则系统会提示出错,
例如:
DimxasInteger‘定义x为整型变量
x=40000
整型变量x最大只能取值32767,所以40000就超出了整型数据表示的最大值,程序运行到这一句时,系统会提示出错。
5、变量被两次赋值,则新值冲掉旧值,
例如
x=2
x=3
x=x+2
x=?
例9-6在窗体上添加一个命令按钮,当单击该按钮后接受用户输入的长方形的长和宽,计算其面积并输出计算结果。
步骤:
1、新建窗体,并在上面添加一个命令按钮,按钮名称为“命令0”,在按钮上添加代码如下:
PrivateSub命令0_Click()
'定义变量a,b,s为单精度变量,a,b表示长方形的长和宽,S表示面积
DimaAsSingle,bAsSingle,sAsSingle
'通过InputBox函数输入边长,同时将文本型数据转换成数值型
a=Val(InputBox("请输入长方形的第一个边长:
"))
b=Val(InputBox("请输入长方形的第二个边长:
"))
s=a*b
MsgBox"长方形面积为:
"&s
EndSub
2、切换到窗体视图,单击命令按钮,会出现一个输入框,要求你输入长方形的两个边长,输入边长后,单击“确定”按钮,即弹出一个消息框,显示长方形的面积。
注意:
输入程序代码时,要在英文半角下输入,各关键词之间要有空格(“英文半角”输入状态下的空格!
)
四、顺序结构
在高级程序设计语言中,其语句执行都有一定的先后顺序,总体可以分为顺序结构语句(按语句的先后顺序执行)、条件分支语句(根据条件的成立来确定执行哪一个分支)、循环语句(某个条件成立时反复执行某一段程序)。
顺序结构是最简单的一种结构,这种结构让语句按先后顺序执行,以完成简单的功能。
A=2
B=3
T=A’把A的值放到T中,则T=2
A=B’把B的值放到A中,则A=3
B=T’把T的值给B,则B=2
例9-7在窗体上放一个命令按钮和两个文本框,在两个文本框中分别输入两个不同的值,单击命令按钮后交换这两个文本框中的数据。
分析:
假如a=2,b=3,利用赋值语句总是把等号右边值给左边的特性,借助中间变量,可以让a,b的值互换。
步骤:
1、新建一个窗体,窗体中放两个文本框和一个命令按钮,名称分别是“文本1”、“文本2”、“命令0”,(在属性窗体设置这些控件的名称,在代码程序中引用)
2、
选中命令按钮,在属性窗口中添加这个按钮的代码如下:
3、切换到窗体视图,在文本框中输入两个值,例如2、3,单击命令按钮,可看到文本框中两个数实现了交换。
例9-8在窗体上放一个命令按钮和两个文本框,第一个文本框中输入用分钟表示的时间,单击命令按钮则把这个时间转换成以小时和分钟表示的时间。
步骤:
1、新建一个窗体,放一个命令按钮和两个文本框,定义按钮和文本框的名称为命令0、文本1、文本2
2、选中命令按钮,在属性窗口中切换到“事件”选项下,在“单击”栏选“事件过程”,单击这一栏后面的按钮,输入以下代码:
3、切换到窗体视图下,输入一个分钟数例如:
100,单击命令按钮就可转换成1小时40分钟。
说明:
1、常量的声明:
常量是一种特殊的量,它的值设置后就不能更改或赋于新值,可以在代码中的任何地方使用常量代替实际的值,对于程序中经常出现的常数值且难以记忆无明确意义的数值,使用常量声明可增加代码的可读性和可维护性。
格式:
Const常量名[as类型名]=表达式
2、本程序中用到几种运算,常见的运算见下表:
符号
描述
示例
+
加
-
减
*
乘
4*3=12
/
除
7/2=3.5
\
整除
7\2=3(只取商的整数部分)
Mod
求余
9Mod6=3
^
求幂
10^3=1000
五、分支结构
分支结构语句有两种:
if语句和SelectCase语句
(1)if语句
单分支:
格式:
if条件表达式then
执行语句1
[Else执行语句2]
Endif
功能:
条件表达式成立就执行语句1,不成立就执行语句2
说明:
条件语句以if开头,以Endif结束,if和Endif要成对出现。
例9-9在窗体上放一个命令按钮和3个文本框,在前两个文本框中输入两个整数,单击命令按钮比较这两个文本框中输入的整数的大小,并将较大的数放到第三个文本框。
分析:
输入的两个数存放到x,y中,用z存放较大的数:
如果x>y,则z=x,否则就让z=y
步骤:
1、新建窗体,放置三个文本框,及一个命令按钮,分别选中这些控件,在属性窗口中设置文本框及按钮名称为文本1、文本2、文本3、命令0
2、
PrivateSub命令0_Click()
DimxAsInteger,yAsInteger,zAsInteger
x=文本1.Value
y=文本2.Value
Ifx>yThen
z=x
Else
z=y
EndIf
文本3.Value=z
EndSub
选中按钮,在其属性窗口的中切换到“事件”选项,再在“单击”一栏中选“事件过程”,单击这一栏后面的按钮,输入以下代码:
3、切换到窗体视图,在文本框1、2中输入两个数(例如2,6),单击“确定”则在第三个文本框中显示较大的数。
。
如果从有三种或三种以上的条件选择1种,则要用下面的条件语句:
格式:
If条件表达式1then
执行语句1
Elseif条件表达式2then
执行语句2
……
Else
执行语句n
Endif
注意书上错误,此处的Elseif没有空格(在Else和if之间)
例9-10在窗体上放一个命令按钮和两个文本框,单击命令按钮根据窗体中“成绩”文本框输入的成绩,判断成绩等级,并显示在窗体的“等级”文本框中。
判定方法:
85分以上优秀,75分至85分良好,60至75分及格,60分以下不及格。
分析:
由于一个成绩有四个等级选择,所以要用到多种条件选择语句
步骤:
1、新建一个窗体,放一个命令按钮及两个文本框,在相应的属性窗口设置它们的名称分别是“命令0”、“成绩”、“等级”
2、在按钮0上添加程序代码如下:
3、关闭程序窗口,切换到窗体视图下,输入不同的分数,单击“确定”按钮后可显示不同的等级:
多种条件选择语句除了用以上的语句格式外,还有一种更加简洁的分支语句结构SelectCase语句
(2)SelectCase语句
格式:
SelectCase变量表达式
Case表达式列表1
执行语句1
Case表达式列表2
执行语句2
……
CaseElse
执行语句n
EndSelect
功能:
第一句中变量表达式中的值满足哪个表达式列表,就执行哪个语句。
例9-11将例9-10中的if语句改成SelectCase表示。
步骤:
1、修改命令按钮上程序代码如下:
四、关闭程序窗口,切换到窗体视图下输入不同的成绩值进行调试。
六、循环结构
如果在程序中需要重复执行某段代码,可用循环结构VBA中提供了三种循环结构
(一)Do…Loop循环
格式:
Do[[While/Until]条件表达式]
……
……
Loop
功能:
根据DoWhile后面的条件表达式来重复执行循环语句体若干次,直到表达式的值不再成立时,执行Loop后面的语句。
例9-12在窗体上放一个命令按钮,当单击该按钮时,计算1+2+3+100的结果,并利用消息框显示出来
步骤如下:
1、新建一个窗体,添加一个按钮,在属性窗口中设置名称为“命令0”
2、
PrivateSub命令0_Click()
DimsAsInteger,xAsInteger
s=0:
x=1
DoWhilex<=100
s=s+x
x=x+1
Loop
MsgBox"1+2+...+100的值为:
"&s
EndSub
在按钮上添加代码如下:
3、关闭程序编辑窗口,切换到窗体视图,单击命令按钮,则弹出计算结果。
想一想:
●如果改成求1×2×3…×10的值,该怎样进行?
●如果改成在文本框中输入一个值x,求1+2+…x的值,该怎样进行?
例9-13在窗体上放一个命令按钮,当单击该命令按钮时,求满足不等式1+2+3+…+n<=100的最大整数n,并将所求的n输出在消息框中。
(最终满足条件的n为13)
PrivateSub命令0_Click()
DimsAsInteger,nAsInteger
s=0:
n=0
DoWhiles<=100
n=n+1
s=s+n
Loop'注意退出循环时n(比满足S<100的那个n)增加了1
MsgBox"满足1+2+…+n<=100的最大整数n为"&n-1
EndSub
步骤:
打开例9-12,修改程序如下:
这一题我们也可以利用Do…LoopUntil,其功能是直到…条件表达式成立退出
例9-14,利用Do…LoopUntil改写例9-13
PrivateSub命令0_Click()
DimsAsInteger,nAsInteger
s=0:
n=0
Do
n=n+1
s=s+n
LoopUntils>100'注意退出循环时n(比满足S<100的那个n)增加了1
MsgBox"满足1+2+…+n<=100的最大整数n为"&n-1
EndSub
(二)For…Next循环
格式:
For循环变量=初值to终值[step增量]
……
……
Next循环变量
功能:
其执行过程分以下两步:
(1)循环变量取初值后,执行循环体
(2)到Next循环变量时,循环变量加上增量,看是否超过终值,如超过则退出循环,否则继续执行循环体。
说明:
step1可省略不写(即循环变量增量为1时可省略step项不写)
例9-15编写一个过程,求0到100之间的所有奇数的和
分析:
过程就是在程序中反复用到的一小段程序,定义成过程后,后面再用到这段程序只要输入过程名即可调用这段程序
步骤:
1、新建一个窗体,添加一个按钮,进入按钮的代码编辑窗口:
2、在编辑窗口上修改并添加代码如下:
(见上图)
PrivateSubL15()’定义过程L15
DimsAsInteger,iAsInteger
s=0
Fori=1To100Step2
s=s+i
Nexti
MsgBox"1+3+5+...+99="&s
EndSub
4、切换到窗体设计视图,选中按钮,在属性窗口中仍然选“事件”选项卡下的“单击事件”栏中选“事件过程”,在编辑窗口中添加程序如下:
5、切换到窗体视图,单击按钮则调用过程L15,执行过程L15的程序,效果如下:
注:
任何一种循环语句都可以用另一种循环语句代替,上面的FOR…Next循环程序用D0While…Loop循环也可行,程序改动如下:
DimsAsInteger,iAsInteger
s=0
i=1
dowhilei<100
s=s+i
i=i+2
loop
MsgBox"1+3+5+...+99="&s
例9-16编写一个过程,输入一个整数n,然后求1!
+2!
+…+n!
,然后在命令按钮中调用这个过程
仿例9-15即可。
过程程序如下:
PrivateSubPro916()
DimiAsInteger,jAsInteger,nAsInteger
DimtAsLong,sAsLong't用来存放阶乘数,s用来存放阶乘的和,由于值太大,所以定义为长整型变量。
t=1:
s=0
n=inputbx("请输入一个整数n:
")
Fori=1Ton
t=1'保证每次阶乘从1开始计算
Forj=1Toi
t=t*j
Nextj
s=s+t
Nexti
MsgBox"1!
+2!
+...+"&n&"!
="&s
EndSub
例9-17编写一个过程,从键盘输入10个数,输出其中的最大数和最小数
分析:
本题可使用inputbox函数接受用户输入的数字,由于输入的数据有10个,所以定义一个包含10个元素的数组A
(1)、A
(2)、…A(10)来存放这些数字,变量Max的初始值放A
(1),然后和A
(2)到A(9)逐个比较,只要有比A
(1)大的数Max就存放这个数,这样Max就存放出最大的数;Min的初始值也存放A
(1),然后和A
(2)到A(9)逐个比较,只要有比A
(1)小的数Min就存放这个数,这样Min就存放出最小的数。
步骤:
1、窗体上添加一个命令按钮,添加代码如下:
(见下图)
2、选中按钮,添加单击按钮调用过程L17的代码(见上图代码窗口的下半部分代码)
3、切换到窗体,单击命令按钮后,会提示输入数字,先后输入10个不同的数字后,最后会显示最大数及最小数,(这里可输入1、2、3、7、8、9、10、4、5、6)
(此文档部分内容来源于网络,如有侵权请告知删除,文档可自行编辑修改内容,供参考,感谢您的支持)