VBA程序设计基础.ppt
第十章VBA程序设计基础,2,本章要点:熟悉VBA编程环境掌握VBA语法掌握VBA的流程控制结构,3,10.1 VBA编程环境,认识VBAVisual Basic for Application与VB开发工具很相似,包括各种主要的语法结构、函数命令等。与VB的主要区别是VBA主要面向Office办公软件开发工具(增强Word、Excel等软件的自动化能力),提供了很多VB中没有的函数和对象,这些对象都是针对Office应用的。宏的每个基本操作在VBA中都有相应的等效语句。,4,10.1 VBA编程环境,VBA编程环境:VBE窗口,5,10.1 VBA编程环境,Access 2003数据库中包含的程序模块可以分为两种类型:独立程序模块(标准模块)绑定型程序模块(类模块),6,10.1 VBA编程环境,绑定性程序模块是指包含在窗体、报表、页等数据库基本对象之中的事件处理过程,这样的程序模块仅在所属对象处于活动状态下有效。也称类模块。作用范围局限在所属的窗体和报表内部,具有局部特性。,7,10.1 VBA编程环境,绑定模块代码设计步骤:选中控件的对应事件选事件过程:,8,10.1 VBA编程环境,绑定模块代码设计步骤2:选中事件过程后点 按钮。,9,10.1 VBA编程环境,编辑独立的程序模块独立程序模块是指Access2003数据库中的“模块”对象。这些模块对象可以在数据库中被任一个对象所调用。也称为标准模块。一般用于存放公共过程,不如其他任何Access对象相关联。通常为整个应用系统设置全局变量或通用过程,供其他窗体或报表等数据库对象在类模块中使用或调用。标准模块中的公共变量和公共过程具有全局性,其作用范围为整个应用系统。,10,10.1 VBA编程环境,标准模块的创建步骤:1.选择”模块”对象,点“新建”,11,10.1 VBA编程环境,标准模块的创建步骤:2.标准模块界面,12,10.1 VBA编程环境,两种模块:,13,10.1 VBA编程环境,VBE窗口的组成,14,10.1 VBA编程环境,主要按钮介绍:视图切换:从VBE视图切换到Access数据库对象视图。插入模块:用于插入新模块对象,并置新模块对象为操作目标。运行:执行模块程序。中断:中止正在运行的程序,进入设计模式。重新设置:中止程序设计模式:在设计模式和非设计模式之间切换。,15,10.1 VBA编程环境,主要按钮的功能:工程资源管理器:选中当前程序模块。,16,10.1 VBA编程环境,属性窗口:,17,10.1 VBA编程环境,对象浏览器:,18,10.1 VBA编程环境,创建模块添加过程,19,10.2 模块基础,Sub过程Public|Private Static Sub 子过程(形参)As 数据类型子过程语句Exit SubEnd SubPublic可以使该过程能被所有模块的所有其他过程调用。Private可以使该过程只能被同一模块的其他过程调用。在一个过程中也可以调用其他子过程或打开窗体等,20,10.2 模块基础,子过程的定义:Public Sub ccc()DoCmd.OpenForm LoginEnd Sub子过程的调用:Call 子过程(实参)或者子过程(实参)Call ccc()Ccc(),21,10.2 模块基础,Function函数Public|Private Static Function 函数过程名(形参)AS 数据类型函数过程语句函数过程名表达式Exit FunctionEnd Function和Sub过程很类似,但通常都具有返回值。Static定义静态函数,函数中定义的值一直保存。As 数据类型,定义函数返回值类型。,22,10.2 模块基础,函数定义Private Function ddd(r As Double)As Integer Dim pi As Double pi=3.1415926 ddd=pi*r*rEnd Function,23,10.2 模块基础,窗体按钮事件中调用模块过程或函数:用表达式生成器选择,24,10.2 模块基础,表达式生成器选择标准模块函数方法:,25,10.3 VBA面向对象编程基础,属性与方法的引用方式:对象.属性名,对象.方法名这里的对象一般采用:父对象类名!子对象名对于窗体上的控件可以用:me.xx 方式来引用,me代表当前窗体。例如访问窗体上标签:Form_模块应用!Lb1.Caption“你好啊”“你好啊”标准模块只能用:父对象类名!子对象名,而窗体模块两种形式都可以使用,推荐使用me.形式。,26,10.3 VBA面向对象编程基础,访问窗体文本框:访问或设置文本框中的字符串读:msgbox()赋值:“你好啊”设置或者访问文本框被选中内容Me.Text3.SelStart=2Me.Text3.SelLength=2MsgBox(Me.Text3.SelText),27,10.3 VBA面向对象编程基础,设置文本框的输入掩码:Me.Text3.InputMask=Password“设置文本框的可用性:锁定控件,即只读:Me.Text3.Locked=True禁用控件:Me.Text3.Enabled=true设置文本框焦点:DoCmd.GoToControl(Text3),28,10.3 VBA面向对象编程基础,访问切换控件(Toggle)程序判断是否按下读/赋值:值为:true(1),false(0)该控件较少被应用到,29,10.3 VBA面向对象编程基础,单选控件(Option)程序判断选中与否读/赋值:me.Option1.value=true值为:true(1),false(0)复选框(Check)程序判断选中与否读/赋值:值为:true(1),false(0),30,10.3 VBA面向对象编程基础,组合框(Combo)程序访问选中的内容、选中的序号、遍历整个下拉列表,以及增加和删除内容。重要属性:MsgBox(Me.Combo13.ListIndex),返回组合框被选项的序号,从1开始;没有被选择的初值为1。MsgBox(Me.Combo13.Value),返回组合框被选项的值,必须有内容被选择后才能使用。MsgBox(Me.Combo13.ListCount),返回组合框中选项数量,可以用它实现对组合框数据的遍历。,31,10.3 VBA面向对象编程基础,组合框下拉列表值集合:bo13.ItemData(i),返回i序号位置列表项值。组合框特色属性:手动输入的文本:,可以结合按键事件,将手动输入的内容增加到组合框中。这个属性是列表框所没有的。组合框重要方法:Me.Combo13.AddItem(“ccc”),对组合框增加新下拉项,参数是下拉项的值,即显示出的字符串。Me.Combo13.RemoveItem(3),删除组合框中指定序号位置的下拉项。,32,10.3 VBA面向对象编程基础,列表框(List)除了外观形式外,常用属性方法与组合框大体类似。特色属性:多重选择属性:,值是0,1,2,但是运行只读属性,只能在运行之前设置。判断列表项是否被选中属性:Me.List18.Selected(i),返回对应序号的列表值是否被选中。,33,10.3 VBA面向对象编程基础,图片框(image)一般选择链接形式显示图片,图片显示用缩放。动态更改图片:Me.Image22.Picture=“E:教学资源1.jpg”,要给出图片的路径。,34,10.3 VBA面向对象编程基础,分页控件(选项卡控件)重要属性:Pages属性,主要通过它指定新当前页,修改页的标题、隐藏和显示指定页。Me.xxk.Pages.Item(2).SetFocusMe.xxk.Pages.Item(1).Caption=ccMe.xxk.Pages.Item(0).Visible=False,35,10.3 VBA面向对象编程基础,Access应用程序内置对象Application对象,包含大量的属性、方法和子对象,部分全局性操作通过它完成。调用时先输入“Application.”即可显示其包含的各个子内容。Docmd对象,是Application的一个子对象。主要功能是通过调用Access内置的方法,在VBA中实现特定的操作。调用时先输入“Docmd.”即可以选用其下属子属性和方法。该对象后续内容将大量应用。,36,10.4 VBA编程基础,VBA程序书写规范不区分大小写,但是标点符号、括号必须是半角英文格式。一个变量或者函数名第一次定义或者使用后,其后程序将自动依照第一次定义(或使用)除格式显示。语句书写,一般一句一行,如果一行写不下,可以在要续行的行尾用续行符(空格+”_”),然后在下一行续写语句代码。注释语句:用Rem开头或者”“开头一行表示注释。,37,10.4 VBA编程基础,1.VBA中的基本数据类型字节型,关键字Byte,占1个字节,在0255内取值。主要用于存储一些小型整数。Dim i As ByteDim x,y,z As Bytei=100X=I没有表示符号,38,10.4 VBA编程基础,逻辑型,关键字Boolean,占2字节,取True,False。0为false,非0为True,如-1。主要用于存储一些逻辑运算结果Dim x as booleanX=trueX=0X=1000X=-199常量没有特殊表示符号,39,10.4 VBA编程基础,整型,关键字Integer,占2字节,取3276832767之间。最常用的整型。Dim I as integeri=100i=1+1其常量用表示,如99。,40,10.4 VBA编程基础,长整型,关键字Long,占4字节,取值范围在正负20亿之间取值。主要用于存储特别大的整型数值。Dim x as longX=19999其常量用&表示,如99&等。,41,10.4 VBA编程基础,单精度型,关键字Single,占4字节,在正负10-45之间取值。Dim salary as singleSalary=3000保存小数其常量用!表示,如100.89!,42,10.4 VBA编程基础,双精度数,关键字Double,占8个字节,比单精度数更大的表达能力。Dim distance as DoubleDistance=300000最常用的浮点数表示类型。可以兼容所有其他数值类型。其常量用表示,如200.9,43,10.4 VBA编程基础,货币型关键字:Currency,占8字节,15位整数,4位有效小数。Dim money as CurrencyMoney=99999999.9999其常量标志为,如199。,44,10.4 VBA编程基础,日期型(包括时间,实际是日期时间类型)关键字Data,占8字节Dim today as DateToday=Now 得到当前日期和时间Today=Date 得到当前日期TodayTime 得到当前时间日期常量必须用#括起来,如#10-11-2006#,45,10.4 VBA编程基础,对象型关键字:Object,占4个字节,可以指向任何对象。一般不生成这种通用对象类型,而是根据需要生成专用的对象。,46,10.4 VBA编程基础,字符型关键字:String,最多可以存放64K字符。常量表示字符$,如“hello!”$字符和字符串一样表示方式,如”A“,”AB”,只有一个字符的字符串就可以作为字符。这点和C+不同。长度为0的字符串为空串。,47,10.4 VBA编程基础,变长类型类型关键字:Varient,可以存储任何类型。默认情况下,没有定义数据类型的变量都属于Varient类型。函数没有定义返回值类型时,默认也是Varient类型。,48,10.4 VBA编程基础,用户自定义类型如结构Private|Public Type 数据类型名元素1 As 数据类型元素2 As 数据类型End Type然后Dim x as 自定义类型名X.元素1.,49,10.4 VBA编程基础,变量、常量、数组VBA中使用变量可以不需要说明就直接使用。A100也可间接显式定义A100,是整型的标志,所以A为整型。最常用就是dim语句定义。,50,10.4 VBA编程基础,变量、常量、数组值常量100,100,True等等。常值变量Const PI3.1415926固有常量系统已经定义的环境常量,51,10.4 VBA编程基础,数组VBA中不允许隐式说明数组,必须先定义后使用。Dim x(10)as integer,普通1维数组Dim y(-2 to 3)as integer,下标2开始的数组Dim z(3,5)as integer,2维数组Dim w()as integer,动态1维数组。动态数组可以反复使用Redim重新确定大小。如:Redim w(10),重新定义时可以用Preserve标志保存原有值。Redim Preserver W(20),这样前面10个值得以保留,否则原有数据全部丢失。Preserve不能改变维数。默认情况下数组下标从0开始,上标n1。,52,10.4 VBA编程基础,数据库对象变量可以定义变量代表对应数据库对象上各种控件Dim myform as controlSet myform=Forms!Form_登录!txtUsername(VB或VBA中Set的作用就是让变量指定对象),53,10.4 VBA编程基础,运算符与表达式一、算术运算符,54,10.4 VBA编程基础,字符运算符,字符串连接符号,将两个字符串连接成一个新字符串。&,将不同数据类型连接到字符串上。例如:“Access”2003“”Access“&2003“2+3”&“=“&(2+3),55,10.4 VBA编程基础,关系运算符,56,10.4 VBA编程基础,逻辑运算符Not,逻辑非,原来假结果为真。And,逻辑与,两个结果都为真结果为真。Or,逻辑或,两个之一为真结果为真。Xor,异或,两个表达式不相同结果时真。Eqv,等价,两个表达式相同结果时,结果真。Imp,蕴涵,当第一个表达式为真,且第二个表达式为假,则值为假,否则为真。,57,10.4 VBA编程基础,系统内置函数内置函数按功能可以分为:数学函数、字符函数、日期函数和格式输出函数。数学函数Abs(数学表达式),返回数值表达式的绝对值。Fix(数值表达式),返回数值表达式的整数部分,若参数为负值,返回大于参数值的第一个负数。Int(数值表达式),返回数值表达式的整数部分,若参数为负数,返回小于等于参数值的第一个负数。Exp(数值表达式),求数值表达式为底的指数函数。,58,10.4 VBA编程基础,数学函数Log(数值表达式),以e为底的自然对数。Sqr(数值表达式),计算数值表达式的平方根。Sgn(数值表达式),返回一个Variant(Integer),指出参数的正负号。Round(数值表达式),对操作数四舍五入取整。Rnd(产生随机数),产生01之间的数。,59,10.4 VBA编程基础,转换函数Asc(字符表达式),返回字符的Ascii码。Chr(数值),Ascii值转换成对应字符。Lcase(字符串表达式),全部转换为小写。Ucase(字符串表达式),全部转换为大写。Str(数值表达式),将数值表达式转换为字符串。Val(字符串表达式),将数字字符串转为数值型数据DateValue(字符串表达式),将字符串转换为日期Hex(数值表达式),十进制转化成十六进制。Space(数值表达式),返回指定长度空格字符串。VBA中还有一些C开头的类型转换函数,Cint,Csng,Cstr,60,10.4 VBA编程基础,字符串函数Instr(start,str1,str2,compare),字符串检索函数,检索字符串Str2在字符串Str1中最早出现的位置,返回一整数。Start为数值式,可选参数。Compare是比较方式:0作二进制比较,1作不区分大小写的文本比较,2作基于数据库中包含信息的比较。如果Str1串长度为0或Str2检索不到,返回0;如果Str2串长为0,返回Start的值。,61,10.4 VBA编程基础,Left(字符串表达式或变量,N),从字符串左边截取N个字符。如果N为0,返回长度为零长度字符串;如果N大于或等于字符串长度,返回整个字符串。Right(字符串表达式或变量,N),从字符串右边起截取N个字符。Mid(字符串表达式,N1,N2),从字符串左边第N1个字符起截取N2个字符。,62,10.4 VBA编程基础,Ltrim(字符串表达式或变量),删除字符串的开始字符。Rtrim(字符串表达式或变量),删除字符串的尾部空格字符。Trim(字符串表达式或变量),删除字符串的开始和尾部空格。,63,10.4 VBA编程基础,Len(字符串表达式或变量),返回字符串的长度。这里采用Unicode编码处理方式,因此返回的是字符的数量。如“你好123!”返回6。对于数组变量,返回长度是定义长度。LenB(字符串表达式或变量),返回字符串所占字节数。一般是2倍Len结果,64,10.4 VBA编程基础,日期/时间函数Date()或Date,返回当前系统日期Time()或Time,返回当前系统时间Now,返回当前系统的日期和时间Year/Month/Day/Weekday(日期表达式)Hour/Minute/Second(时间表达式),65,10.4 VBA编程基础,日期时间函数DateAdd(间隔目标,间隔值,日期表达式)DateDiff(间隔目标,日期1,日期2)DatePart(间隔目标,日期表达式)间隔目标:“yyyy”表示年,“q”季度,“m”月,“y”一年的天数,“d”天,“w”一周的天数,“ww”周,“h”小时,“n”分钟,“s”秒。DateSerial(表达式1,表达式2,表达式3),组合成一个日期。,66,10.4 VBA编程基础,格式输出函数Format(表达式,格式符)主要完成对数值、日期、字符串表达式按特定的格式输出。,67,10.4 VBA编程基础,其他常用函数InputBox函数格式:InputBox(提示文字,标题,默认值)作用:出现一个输入对话框,能获得用户的输入信息。,68,10.4 VBA编程基础,Msgbox格式:msgbox(提示文字,按钮图标,标题)其中按钮和图标参考教材215页。作用:给用户弹出一个对话框,进行信息提示,能让用户对某些事件进行判断处理,能记录用户点击的对话框按钮。按钮返回值参考216页表格。它是VBA中最常用的系统函数,系统中大量提示信息都是通过msgbox实现。,69,10.4 VBA编程基础,IIF函数格式:IIF(条件表达式,表达式1,表达式2)作用:类似C+中?:运算符,更具条件,在表达式1和表达式2中选择一个作为返回值。条件为真返回前者,价返回后者。是IF。Else的简写函数表现。,70,10.4 VBA编程基础,Switch函数格式:Switch(条件1,表达式1,条件2,表达式2,.)作用:该函数用于多条件选择,是Select多分支结构的函数表现。从左向右判断,直到一个条件成立为止,返回对应条件后的表达式。如果所有条件都不成立,返回null,空值,71,10.4 VBA编程基础,Choose()函数格式:Choose(数值表达式,表达式1,表达式2,)作用:类似Switch函数,不过这里没有条件。数值表达式值充当一个条件,如果它界于1,2间,返回表达式1,界于2,3间返回表达式2,依此类推。,72,10.4 VBA编程基础,Nz()函数格式:Nz(表达式或字段树型值,规定值)作用:如果表达式值为Null,则返回0、“”或者一个自定义的返回值。很有用的函数,特别在数值运算中。字符串运算中,可以用“”拼接来消除null,Null&“”=“”相关函数:IsNull(表达式),73,10.4 VBA编程基础,DCount()函数格式:DCount(表达式,记录集合,条件式)表达式:用户标识要统计其记录数的字段。记录集合:字符串表达式,可以是表的名称或查询的名称条件式:用于限制DCount函数的数据范围,类似Sql语句中的Where条件。作用:返回指定记录集合中的记录数。Me.Text1=Dcount(“xh”,”学生”,”xb=男”)可以在宏、VBA、查询表达式或计算控件中应用。,74,10.4 VBA编程基础,DoAvg()用于计算指定记录集合中某个字段列数据的平均值。Dsum()函数用于汇总指定记录集合中某个字段列数据。Dlookup()函数从指定记录集合检索特定字段的值。非常有用的函数,比如登陆验证等等场合。注意:以上3个函数格式上类似DCount函数,但在记录集合没有记录或者没有符合条件的记录时,返回Null。,75,10.4 VBA编程基础,案例:登陆验证UID=Me.UIDPWD=Me.PWDpwd1=DLookup(口令,UserInfo,用户名=&UID&)If IsNull(PWD)ThenMsgBox(没有这个用户)ElseIf PWD=pwd1 ThenMsgBox 恭喜你登陆成功!ElseMsgBox 口令不正确End IfEnd If,76,10.4 VBA编程基础,常用数据格式判断函数isArray(变量),判断变量是否为一个数组。IsDate(表达式),判断变量是否可以转换为日期型。IsEmpty(变量),判断变量是否是为空值。IsError(表达式),判断表达式是否为一个错误。IsNumeric(表达式),判断表达式是否为数值。IsNull(表达式),判断表达式是否为一个无效值null。IsObject(标志符),判断标识符是否表示对象变量。,77,10.4 VBA编程基础,程序流程控制单分支结构多分支结构For循环Do循环Do while循环,78,10.4 VBA编程基础,单分支结构:IF语句在VBA中if语句有多种书写形式,要求同学统一用标准格式:If 条件 then条件成立执行的语句End if如果要同时处理条件不成立语句,可以加Else分支If 条件 thenElseEnd if,79,10.4 VBA编程基础,If语句的每个执行部分即可以是简单语句序列,也可以是其他流程控制结构,如果是if语句,就是if嵌套。If 条件1 thenIf 条件2 thenElseEnd ifElseIf 条件3 thenElseEnd ifEnd if,80,10.4 VBA编程基础,If语句的灵活应用:案例3个数中选择最大值嵌套应用平行应用结论:尽量使用平行应用,适当使用简单嵌套,避免复杂嵌套。,81,10.4 VBA编程基础,多分支结构:Select Case语句使用Select Case分支结构可以避免使用if语句复杂嵌套,提高程序的可读性。格式:Select Case 变量或者表达式Case 表达式1语句块1Case 表达式2语句块2Case else语句块n1End Select,82,10.4 VBA编程基础,Select case 分支结构说明变量或表达式,可以是数值型或字符串型。Case 表达式与 Select Case 变量或表达式的类型必须相同。Case表达式可以是下列几种格式:单一数值或一行并列数值(用,隔开)用关键字to分割开的两个数值或表达式之间的范围。用is关系运算符表达式可以是上面3个的复合使用,83,10.4 VBA编程基础,For循环,一般用于固定循环次数的循环场合格式:For 循环变量=初值 to 终值 step 步长语句块exit forNext 默认下Step1,如果希望是其他内容,就修改这个步长其他方面类似C+,exit for 是中途结束循环。,84,10.4 VBA编程基础,Doloop循环格式:Do语句块Exit doloop特点是至少运行一次的循环,默认下是无限循环,需要使用exit do 结束循环。可以增加While或者until组成有条件循环。两者差异是while条件是开始条件,until 条件是结束条件。,85,10.4 VBA编程基础,有条件do循环Do 语句块exit doLoop while 条件表达式(until 条件表达式)这种循环也是至少执行一次的循环,一直到条件不成立或者中途exit do 退出为止。,86,10.4 VBA编程基础,While或until条件也可以前置,实现先判断在循环。Do while 条件表达式(until 条件表达式)语句块exit doLoop通常使用do循环都是应用这种类型循环。,87,10.4 VBA编程基础,Until应用sum=0i=1Do Until i 100sum=sum+ii=i+1Loop,While应用sum=0i=1Do Until i=100sum=sum+ii=i+1Loop,88,10.5 过程调用与参数传递,函数调用与调用标准函数格式相同:函数名(实参表)过程调用Call 过程名(实参表)或者:过程名 实参表,这里值得注意的是如果用:过程名(实参表),则会出错,除非用:a=过程名(实参表),也就是说写成函数形式就需要有变量接受结果。通常设计中一般将有返回结果的程序块定义为函数,没有返回要求的程序块定义为过程。,89,10.5 过程调用与参数传递,函数的局限以及弥补方案函数虽然能返回结果,但是只能返回一个值,如果同时要返回多个结果情况:通过自定义结构类型来解决,利用结构可以容纳多个数据的特点。列用参数表,通过实参表返回结果在返回结果不止一个,但不是很复杂情况下,通常采用实参表来解决,如果返回非常复杂则还是需要定义结构来解决,以提高程序的可读性。,90,10.5 过程调用与参数传递,函数或过程如果需要通过参数来返回值,则参数的形参类型要做改动。实参向形参传值有2种方式:ByVal和ByRef。ByVal是值传递方式,这种方式下,形参只是复制实参的内容,形参发生任何变化和实参无关。ByRef是地址传递方式(默认),这种情况下,形参和实参是一个对象,改动了形参就直接改动了实参。要希望实参返回结果,就必须将形参定义为ByRef方式。使用ByRef方式,实参必须是明确定义了的变量,不能是Variant类型的,也不能是常量。,91,10.5 过程调用与参数传递,演示案例:交换值(类似C+)遇见新问题:Dim x,y as integer 作为参数传递,出错改成:dim x as integer dim y as integer,一切OK,92,10.6 变量的作用范围,局部变量用dim 或者Static修饰定义,出现在子过程中,只能被定义它的子过程访问。模块变量用dim或者private修饰定义,出现在窗体模块或者通用模块中,只能被本模块的各个过程访问。全局变量用Public定义的,能被任何位置程序访问。,