《VBA程序设计初步.ppt》由会员分享,可在线阅读,更多相关《VBA程序设计初步.ppt(73页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、VBA程序设计初步 Still waters run deep.流静水深流静水深,人静心深人静心深 Where there is life,there is hope。有生命必有希望。有生命必有希望要点 7.1 VBA概述 7.2 对象模型 7.3 数据类型 7.4 程序语句 7.5 数组2022/10/152022/10/152 27.1 VBA 概述 1、VBA简介 VBA(Visual Basic Application)是Microsoft Office系列软件的内置编程语言,VBA的语法与独立运行的Visual Basic编程语言互相兼容。它使得在Microsoft Office系列
2、软件中快速开发应用程序更加容易,且可以完成特殊的、复杂的操作。2022/10/152022/10/153 37.1 VBA 概述 1、VBA简介 VBA 是面向对象的程序设计语言。是面向对象的程序设计语言。面向对象程序设计是一种以对象为基础,面向对象程序设计是一种以对象为基础,以事件来驱动对象的程序设计方法。以事件来驱动对象的程序设计方法。2022/10/152022/10/154 47.1 VBA 概述 1、VBA简介(续)VBA和常用的程序开发语言VB非常相似,二者来自同一种编程语言,即BASIC。VBA与VB所包含的对象级是相同的,也就是说,对于VB所支持对象的多数属性和方法,VBA也同
3、样支持。但两者并非完全一致,在许多语法和功能上有所不同,VBA从VB中获得了主要的语法结构,另外又加上Office中的一些功能。2022/10/152022/10/155 52、VBA编程环境 Office中提供的VBA开发界面称为VBE(Visual Basic Editor),即可视化的Basic 编程环境。在Access中,打开VBE窗口的方法有多种。在模块对象窗口单击“新建”按钮,或打开一个已存在的模块,都会打开VBE窗口。选择工具菜单中“宏”子菜单的“Visual Basic编辑器”命令。使用Alt+F11快捷键打开VBE界面,或切换数据库窗口和VBE窗口。2022/10/15202
4、2/10/156 62、VBA编程环境 2022/10/152022/10/157 7工具栏 工程资源管理器窗口 属性窗口 代码窗口 2022/10/152022/10/158 87.2 对象模型 1、Access对象 Access中的对象大多都有父子关系,有根对象,也有子对象(包括子对象的子对象等等)。在VBA代码中访问对象,必须从根对象开始,逐步取其子对象,直到需要访问的对象为止。2022/10/152022/10/159 9Access根对象有6个,如表所示:对象名说明Application应用程序,即Access环境。DBEngine数据库管理系统,表对象、查询对象、记录对象、字段对象
5、等都是它的子对象。Debug立即窗口对象,在调试阶段可用其 Print 方法在立即窗口显示输出信息。Forms所有处于打开状态的窗体所构成的对象。Reports所有处于打开状态的报表所构成的对象。Screen屏幕对象。2022/10/152022/10/151010Forms是一个集合对象,包括当前数据库中所有打开的窗体对象。引用窗体对象的语法为 Forms!formname,其中的formname 是窗体名每个Form对象都有一个 Controls 集合例如要引用窗体Form_窗体窗体1上的控件Text1,可以显式或隐式地引用Controls集合集合。Forms!Form_窗体1!Text1
6、 隐式引用Forms!Form_窗体1.Controls!Text1 显示引用2022/10/152022/10/1511112、对象的属性、对象的属性 在程序代码中,通过赋值的方式来设置对象的属性。格式为:对象.属性=属性值 例如:Label1.Caption=“学生成绩表”2022/10/152022/10/1512123、对象的事件、对象的事件 事件是发生在对象上的事情或消息。系统为每个对象预先定义了一系列的事件,如:Click(单击)、DblClick(双击)等等。例如:按下按钮Command1时,文本框Text1的字体改变。Private Sub Command1_Click()Te
7、xt1.FontSize=14 End Sub 2022/10/152022/10/1513134、对象的方法 方法是一些系统封装起来的通用过程和函数,以方便用户的调用。对象方法的调用格式为:对象.方法 参数名表 例如:在立即窗口输出2+3的结果 Debug.Print 2+3Sub q1()定义了一个宏,名为”q1”.Debug.Print 2+3End Sub2022/10/152022/10/1514144、对象的方法 除窗体、控件的SetFocus(获得控制焦点)、Requery(更新数据)等方法外,用得最多的是DoCmd对象的一些方法。使用DoCmd对象的方法,可以在VBA中运行Ac
8、cess的操作,如执行打开窗体(OpenForm)、关闭窗体(Close)、SelectObject(指定数据库对象)等操作。例如:打开”学生资料浏览”窗体的语句是 DoCmd.OpenForm”学生资料浏览”2022/10/152022/10/151515例例7-2-1:制作一个显示欢迎信息的窗体。(P169)新建一个窗体,放置两个按钮和一个文本框。Option Compare DatabasePrivate Sub Command1_Click()Me.Text1.SetFocus Me.Text1.Text=您好!欢迎您学习VBA“End SubPrivate Sub Command2_
9、Click()Me.Text1.SetFocusMe.Text1.Text=End SubPrivate Sub Form_Load()Me.Caption=欢迎End Sub在”工具”菜单的”选项”的“编辑器格式”中,调整字体2022/10/152022/10/1516167.3 数据类型 1、变量、变量 变量是在程序运行时发生变化的量。作用:S 保存计算结果S 设置属性S 指定方法的参数S 在过程间传递数据2022/10/152022/10/1517177.3 数据类型 变量名变量名是内存中存放数据的缓冲区的名字。在使用变量前必须先声明,通知VBA变量的名字和数据类型。变量命名应注意:1.
10、变量名必须以字母开头,其最大长度为255。2.变量名不能包含下列字符:+/*!.$&等。3.变量名不能包含空格,可以包含下划线。4.不能包括VBA中的关键字(在程序中有特定含义的词)、运算符Or内置函数名Len、Abs 等等。2022/10/152022/10/151818变量的类型(P170)数据类型关键字占字节数取值范围字节型Byte10255布尔型Boolean2True或False整型Integer2-32 76832 767长整型Long4-2 147 483 6482 147 483 647单精度浮点型Single4负数:-3.402823E38-1.401298E-45正数:1.
11、401298E-453.402823E38双精度浮点型Double8负数:-1.79769313486232E308-4.94065645841247E-324正数:4.94065645841247E-3241.79769313486232E308小数型Decimal12小数点右边的数字个数为028货币型Currency8-922 337 203 685 447.5808922 337 203 685 447.5807日期型Date8100年1月1日9999年12月31日字符型String与字符串有关定长:165400变长:0到20亿对象型Object4任何对象引用变体型Variant数字:1
12、6;字符:22+字符串长0到20亿2022/10/152022/10/151919声明变量 作用作用:指定变量的数据类型,变量的适用范围(作用域)。显式声明变量:可以在变量被使用之前,在代码的任意位置进行声明。最好在程序的开始位置声明所有变量。可以用Dim语句声明变量,其格式为:Dim 变量名变量名 As 类型类型 例如:Dim x As Integer 即即 Dim x%Dim x1 As Integer,x2 As Integer,x3 As Single隐式声明变量:使用变量前不对变量类型进行明确声明,系统会默认为 Variant 数据类型。2022/10/152022/10/15202
13、02、常量 常量在程序运行期间,其值保持不变。常量可以是数字、字符串,也可以是其他值。每个应用程序都包含一组常量,用户也可以定义新常量。定义了常量,就可以在程序中使用它,不必再用实际值。VBA支持两种类型的常量,即内置常量和用户定义的常量。2022/10/152022/10/1521212、常量 用户自定义常量在程序中经常用到某个常数值,或为了程序的阅读或修改方便。声明常量使用Const 关键字,其格式为:Const 常量名 As 类型=表达式 例如:Const PI=3.141593 2022/10/152022/10/1522223、运算符及优先级 算术运算 +(加)、-(减、取负)、*(
14、乘)、/(除)、Mod(取模)、(整除)、(乘方)连接运算符&2022/10/152022/10/1523233、运算符及优先级 关系运算符 =(等于)、(不等于)、(大于)、=(大于等于)、连接运算符 关系运算符 逻辑运算符2022/10/152022/10/1525254、表达式 定义:表达式由运算符、数值和标识符组成。(P172)表达式书写规则:(1)每个符号占一格,所有符号必须并排写在同一横线上,不能在右上角或右下角写方次或下标。例如:X3 写成 X3 ,X1+X2 写成 X1+X2 (2)所有运算符都不能省略。例如:2X 写成 2*X2022/10/152022/10/1526264
15、、表达式(3)所有括号都用小括号,成对出现。例如:5X+2(Y+Z)必须写成 5*(X+(Y+Z)(4)数学表达式中的有些符号需要修改。例如:2R 可改写为 2*PI*R 例如:数学表达式 写成VBA表达式为:(-b+sqr(b2-4*a*c)/(2*a)2022/10/152022/10/1527275、内置函数 VBA提供的内置函数按其功能可分为数学函数、字符串函数、日期函数、转换函数等。(常用内置函数 见P174 表7.3.3)2022/10/152022/10/1528281 MsgBox 函数MsgBox(提示,按钮,标题)例7-3-1:(P175)Private Sub Form_
16、Load()Dim IntResponse As Integer,StrTitle As StringStrTitle=“MsgBox 示例IntResponse=MsgBox(“停止处理!,19,StrTitle)If IntResponse=vbYes Then MsgBox“你按下的是”确认”键.Else MsgBox“你按下的不是”确认”键.End IfEnd Sub 2022/10/152022/10/1529292 InputBox函数 InputBox(提示,标题,默认,X坐标位置,Y坐标位置)例7-3-2:Private Sub Form_Load()Dim StrMsg As
17、 String,StrTitle As String,StrName As StringStrMsg=请输入你的名字:StrTitle=InputBox示例StrName=InputBox(StrMsg,StrTitle,李四)End Sub 2022/10/152022/10/1530307.4 程序语句 VBA中的语句是执行具体操作的指令,每个语句以 Enter(回车)结束。语句由VBA关键字、属性、函数、运算符以及VBE可以识别的指令符号组合而成。2022/10/152022/10/1531317.4 程序语句 书写程序语句时遵循的构造规则称为语法。缺省情况下,输入语句时,VBA将自动对
18、输入的内容进行语法检查,发现错误会弹出一个信息框提示出错的原因。VBA按约定对语句进行简单的格式化处理,例如关键字、函数的第一个字母自动变为大写。2022/10/152022/10/1532327.4 程序语句 书写程序的语法规则 一般情况下,一行输入一个语句。允许使用复合语句,即把几个语句放在一行中,各语句间用冒号“:”分隔。一个语句也可分若干行书写,在要续行的行尾加入续行符(空格和下划线)。(见P176)2022/10/152022/10/1533337.4 程序语句 VBA具有结构化程序设计的三种基本结构:S 顺序结构S 选择结构S 循环结构2022/10/152022/10/15343
19、41、赋值语句 赋值语句是程序语言中最基本的语句,其格式为:=例如:Total=100 ReadOut=Good Morning!Text1.Text=请输入您的姓名:A=35+Total/2 2022/10/152022/10/1535351、赋值语句 注意(P177)1.赋值语句兼有计算与赋值的双重功能。2.右边表达式类型与左边变量类型不同时,要进行类型的转换。3.赋值号左边只能是变量,不能是常量或表达式。2022/10/152022/10/1536361、赋值语句 4.不能在一条赋值语句中,同时给多个变量赋值。反例:反例:Dim x%,y%,z%:x=y=z=50 运行结果为 x=0 因
20、为因为系统系统只将最左边的只将最左边的“=”作为赋值符号作为赋值符号,另外另外两个两个“=”当作关系运算符当作关系运算符。(y,z 默认初值为默认初值为 0)则)则 y=z比较,结果为比较,结果为真:真:-1,而而-1与与 50比比较,结果为较,结果为假:假:05.用 With 语句 可以给一个对象的多个属性同时赋值。(P177 例7-4-1)2022/10/152022/10/153737例例7-4-3:某商场促销采用购物打折的办法,顾客一次购物 S在1000元以上者,按八折优惠;S在500元以上,但不足1000元者,按八五折优惠;S在300元以上,但不足500元者,按九折优惠;S在100元
21、以上,但不足300元者,按九五折优惠;S不足100元者,没有优惠。(P179)则计算折扣的程序代码为:Dim a As Single,b As Single a为原价为原价,b为折扣后应付款为折扣后应付款If a=1000 Then b=0.8*aElseIf a=500 Then b=0.85*a ElseIf a=300 Then b=0.9*a ElseIf a=100 Then b=0.95*aElse b=aEnd If2022/10/152022/10/1538383、条件语句二 Select Case 语句 例例7-4-5Select Case a Case Is=1000 b=
22、0.8*a Case Is=500 b=0.85*a Case Is=300 b=0.9*aCase Is=100 b=0.95*a Case Else b=a End Select 表达式1表达式2表达式n语句块1语句块2语句块n语句块n+1FFFTTT2022/10/152022/10/153939 在实际中遇到操作过程不太复杂,但需要重复相同处理的问题,比如,统计本单位所有人员的工资,求全班同学各科的平均成绩等等。如果用顺序结构来处理,是一个非常乏味且冗长的程序。例如:求自然数 1100 的和,用顺序结构,程序如下:4、循环语句2022/10/152022/10/154040Privat
23、e Sub Form_Click()Dim s&,x%s=0 x=1 s=s+x x=x+1 s=s+x x=x+1 s=s+x x=x+1 x的值累加到99 s=s+xEnd Sub4、循环语句解决这类问题最好用循环语句。循环就是重复地执行同一组语句。2022/10/152022/10/154141新建一个窗体,添加一个文本框,名称为 text 0。在窗体上添加如下代码:Private Sub Form_Click()Dim s&,x%s=0 For x=1 To 99 Step 1 s=s+x Next x text 0.value=“自然数 1100 的和=”&sEnd Sub4、循环语
24、句2022/10/152022/10/154242VBA提供两种不同风格的循环语句:For Next 语句Do Loop 语句循环结构适合处理过程相同、数据相关,但具体值不同的问题。4、循环语句2022/10/152022/10/154343For循环的一般格式:For 循环变量=初值 To 终值 Step 步长 循环体 Next 循环变量 参见下页图示4、循环语句一 For循环例例:For n=1 To 10s=s+nNext n2022/10/152022/10/1544444、循环语句一 For循环执行过程 1)系统将初值赋给循环变量,并自动记下终值和步长。2)检查循环变量的值是否超过终
25、值。如果超过就结束循环,执行 Next 后面的语句;否则,执行一次循环体。3)执行 Next 语句,将循环变量增加一个步长值 再赋给循环变量,转到(2)继续执行。2022/10/152022/10/154545说明 循环变量:或循环控制变量,必须为数值型 初值、终值:数值型,可以是数值表达式。步长:循环变量的增量,是数值表达式。其值为正,初值应小于终值;若为负,初值应大于终值。步长不能是0。如果步长是1,Step 1可略去不写。循环体:在ForFor和和NextNext之间之间的语句序列。Next后面的循环变量与For语句中的循环变量必须相同。4、循环语句一 For循环2022/10/1520
26、22/10/154646注意:For 语句和 Next 语句必须成对出现,缺一不可,且 For 语句必须在 Next 语句之前。循环次数由循环的初值、终值和步长确定,计算公式为:循环次数=Int(终值初值)/步长)+14、循环语句一 For循环2022/10/152022/10/154747【例】求 N N!(N为自然数)。分析:由阶乘的定义N!=1*2*(N-2)*(N-1)*N=(N-1)!*N即自然数的阶乘,等于该自然数与前一个自然数阶乘的乘积。4、循环语句一 For循环2022/10/152022/10/154848程序如下:程序如下:Private Sub cmd1_Click()D
27、im I As Integer Dim f As Long Dim n As Integer n=InputBox(输入一个自然数:输入一个自然数:,输入提示输入提示,10)f=1 For I=1 To n f=f*I Next I label1.Caption=n&的阶乘是的阶乘是&fEnd Sub4、循环语句一 For循环2022/10/152022/10/154949 For循环需要预先知道循环次数。对于不能预先确定循环次数,只知道控制条件的情况,可以使用 Do循环。DoLoop 循环可以根据需要决定是条件满足时执行循环体,还是一直执行循环体直到条件满足,具有很强的灵活性。5、循环语句二
28、 DoLoop循环语句 2022/10/152022/10/155050形式1:Do While|Until 语句块 Exit Do 语句块 Loop2022/10/152022/10/155151形式2:Do 语句块 Exit Do 语句块Loop While|Until 2022/10/152022/10/155252例:例:以下循环的执行次数是以下循环的执行次数是 _。k=0 do while k=2 k=k+1 loop例:例:以下循环的执行次数是以下循环的执行次数是 _。k=0 do until k2例:阅读程序,结果是例:阅读程序,结果是_。n=0 do n=n+1 debug.p
29、rint n loop while n22022/10/152022/10/155454注意:1.Do 循环中,While语句指定循环开始的条件(当)。Until语句指定循环结束的条件(直到)。2.Do循环本身不能修改循环条件,必须在循环体内设置相应语句(如:n=n+1),使得整个循环趋于结束,以避免死循环。3.能用ForNext循环编写的程序,都可以用Do循环来实现。反之,则不尽然。2022/10/152022/10/155555循环的嵌套For循环和Do循环都可以嵌套,且可以互相嵌套。但必须满足以下条件:外循环必须完全包含内循环,不能交叉。外循环变量与内循环变量不能同名。例例:i=1 :j
30、=1 :s=0 :n=0 For i=1 to 3For j=1 to 4 s=i*j :n=n+sNext Next 2022/10/152022/10/155656循环的强制退出在某些情况下,为了减少循环次数或便于程序调试,需要提前强制退出循环。VBA为ForNext和DoLoop循环语句提供了相应的强制退出循环的语句:2022/10/152022/10/1557571Exit For 该语句用于ForNext循环,在循环体中可以出现一次或多次。当系统执行到该语句时,就强制退出当前循环。常用格式是:If 条件 Then Exit For 即当循环执行过程中满足某个条件时,就结束循环。循环的
31、强制退出2022/10/152022/10/1558582Exit Do 该语句用于DoLoop循环,具体用法同Exit For 一样。循环的强制退出2022/10/152022/10/1559597.5 数组 1、数组的定义 数组是一组相同类型变量的集合。必须先声明后使用。在程序中使用数组的好处是用一个数据名代表逻辑上相关的一批数据,用下标表示该数组中的各个元素。数组的形式:数组名(下标1,下标2)例如:name(30)或 A(2,3)2022/10/152022/10/1560607.5 数组 数组分为两类:静态(定长)数组 动态(可变长)数组1.静态数组的声明 Dim 数组名(下标1,下
32、标2)As 数据类型例如:Dim S(10)As SingleDim Su(3,4)As Integer,Sd(1 To 3,3 To 4)As Integer 数组中元素的排列(见P185 表7.5.1)2022/10/152022/10/156161 说明:声明了数组名、维数、大小、类型 维数:几个下标为几维数组。下标:必须为常数。下界 To 上界,省略下界为0。每一维大小:上界下界上界下界+1 数组大小:每一维大小的乘积 例1:Dim mark(1 to 100)As Integer2022/10/152022/10/156262例2:Dim lArray(0 To 3,0 To 4)A
33、s Long 数组 lArray 共有 45个元素等价于:Dim lArray(3,4)As Long 2022/10/152022/10/156363注意:数组声明中的下标说明了数组的整体,即每维的大小;而在程序其他地方出现的下标表示数组中的一个元素。两者写法形式相同,但意义不同。形式相同,但意义不同。例如:Dim x(10)As Integer 声明 x 数组有11个元素 而 x(10)=100 对 x()数组中下标为10的元素赋值2022/10/152022/10/1564642.动态数组的声明 动态数组在声明数组时,不指定数组中的元素个数。使用它时,再按需要用 ReDim 语句指定数组
34、的大小。ReDim语句的格式为:ReDim 数组名(下标1,下标2)As 数据类型 例如:声明数组时,不指定元素个数。Dim S()As SingleDim Score()As Single2022/10/152022/10/156565例7-5-1:使用动态数组。(P185)Option Compare DatabaseDim Stname()As String,Strecord()As IntegerPrivate Sub Command2_Click()n=50i=3ReDim Stname(n)ReDim Strecord(1 To i,n)End Sub 2022/10/152022
35、/10/1566662、数组处理 定义数组时,用数组名表示该数组的整体。例如:Dim A(10)表示数组中有10个元素。在具体操作中,对数组内的每一个元素进行调用和处理。例如:A(6)=23 表示把整数23 赋值给第6个元素。n=A(6)表示把数组中第6个元素的值赋给变量n。2022/10/152022/10/1567672、数组处理 用循环给数组的元素赋初值:For i =1 To 10 A(i)=0 Next i 或 For i =1 To 10 A(i)=i Next i 2022/10/152022/10/156868例7-5-2:从键盘上输入10个任意整数,按由小到大的顺序显示出来。
36、(P186)代码为:Dim A(10)As IntegerFor i=1 To 10 A(i)=InputBox(请输入第请输入第&Str(i)&个数据:个数据:,排序数据排序数据)NextFor i=1 To 9 排序排序 For j=i+1 To 10 If A(i)A(j)Then t=A(i):A(i)=A(j):A(j)=t End If NextNextp=Str(A(1)For i=2 To 10 p=p&,&Str(A(i)NextLabel1.Caption=Ltrim(p)2022/10/152022/10/1569693、自定义数据类型 自定义数据类型是由若干个标准数据类
37、型构造而成的,其定义的方法是:S先定义数据类型:使用Type语句声明自定义类型的框架;S再定义变量:在Dim语句中用声明过的新类型声明变量。2022/10/152022/10/1570703、自定义数据类型 Type 语句的格式为:Type 自定义类型名元素名 As 类型 元素名 As 类型End Type 2022/10/152022/10/1571713、自定义数据类型 例7-5-3:定义一个学生基本情况的自定义数据类型。(P187)Private Type studentNum As Integer 学号学号Nam As String *8 姓名姓名Sex As Boolean 性别性别Bir As Date 出生年月出生年月Gra As String *20 班级班级End Type 2022/10/152022/10/1572723、自定义数据类型 例7-5-3(续):在声明变量 Stu 时,使用该自定义数据类型。(P187)Dim Stu As student 例7-5-3(续):使用该自定义数据类型变量 Stu 中的某个元素。(P187)Stu.Num=0102030405 为学号赋值Stu.Nam=王婉 为姓名赋值2022/10/152022/10/157373
限制150内