370 likes | 558 Views
VBA 程序设计概述. 主讲人 : 何宁. 武汉大学东湖分校. 第八章 宏与模块. 内容提要. 8.1 宏与 VBA 8.2 宏的创建 8.3 模块. 8.4 VBA 程序设计概述. 8 .4 VBA 程序设计概述. VBA 编程环境 VBA 基础知识 程序控制语句. VBA 编程环境. 进入 VBA 编程环境 从数据库窗体对象列表上选择“模块”,单击工具栏上的“新建”按钮 VBE 窗口 在 VBE 环境中编写 VBA 代码. VBA基础知识. 数据类型 常量 变量 数组 表达式. VBA基础知识. 数据类型 标准数据类型
E N D
VBA程序设计概述 主讲人:何宁 武汉大学东湖分校
内容提要 • 8.1 宏与VBA • 8.2 宏的创建 • 8.3 模块 • 8.4 VBA程序设计概述
8.4VBA程序设计概述 • VBA编程环境 • VBA基础知识 • 程序控制语句
VBA编程环境 • 进入VBA编程环境 • 从数据库窗体对象列表上选择“模块”,单击工具栏上的“新建”按钮 • VBE窗口 • 在VBE环境中编写VBA代码
VBA基础知识 • 数据类型 • 常量 • 变量 • 数组 • 表达式
VBA基础知识 • 数据类型 • 标准数据类型 • 用户自定义数据类型 • 对象数据类型
VBA基础知识 • 常量 • VBA在运行时其值始终保持不变的量 • 字符串常量放在一对"内,日期/时间型常量放在一对#内。如"中国" 、#9/1/2005#等。 • 符号常量:用标识符保存一个常量值 • 使用Const语句定义符号常量,如 Const Pai = 3.141569
VBA基础知识 • 变量 • 变量的命名原则 • 第一个字符必须是字母 • 包含的字符数不超过255个 • 不得与VBA的关键字同名,如不能使用Sub、For等 • 不能使用下列字符:! @ & $ # (空格) • 变量的声明 • 变量在使用前应该用Dim语句进行声明 • Dim <变量1> As <类型1>[, <变量2> As <类型2>[,...]] • Dim StudentName As String • Dim Grade As Integer, AvgGrade As Single • Dim Passed As Boolean, ExamDate As Date • 默认情况下,变量可以不经声明即可使用,该变量被自动声明为Variant类型 • 变量的应用范围
Array(0)=17Array(1)=19…… VBA基础知识 • 数组 • 数组是一种数据存储结构,它用一个命名的一个集合体,用不同的下标予以区分 • 数组具有以下特性(数组中的每个数据称为元素): • 每个元素类型相同,占用同样大小的存储空间 • 数组中的元素在内存中连续存放 • 通过下标可访问数组中的每个元素。下标的类型可以是整数,常量、变量或算术表达式。 • 数组分为一维数组、二维数组和多维数组
VBA基础知识 • 数组 • 维数组中的元素呈直线状排列,每个下标对应一个元素。 • 数组在使用前必须先行定义,语法格式是: • Dim <数组名>([<下界>] To 上界) As 数据类型 • 若省略下标下界,则数组的最小下标为0 • 例如: • Dim B(20) As Double • B数组共有21个元素(下标的起止范围是0~20)
VBA基础知识 • 数组 • 二维数组中数据排列呈平面状,可保存一个二维表的信息。 • 数组元素使用行下标和列下标定位,定义格式: • Dim <数组名>([<下界> To] 上界,[<下界> To] 上界) As 数据类型 • 如果省略下标的下界值,则下界值默认为0 • 例如,Dim C(2,3) As Integer ,声明的C数组 • 有2*3=6个元素。 • 二维数组的操作通常需要与双重循环相结合。
VBA基础知识 • 运算符 • 数学运算符 ^、*、/、\、mod、+、- • 关系运算符 =、<>、<、>、<=、>= 返回值为逻辑值:True或False • 逻辑运算符 Not、and、or • 连接运算符 &、+ 连接两个字符串
→ (-b+Sqr(b^2-4*a*c))/(2*a) VBA基础知识 • 表达式 • 表达式:用运算符将常量、变量、函数等连接起来的式子,书写在一行上。 • 表达式可分为: • 算术表达式,如 Count=x+1 • 关系表达式,如 C<>20 • 逻辑表达式,如 Age<=5 Or Age>=60
VBA基础知识 • 函数 • 数学函数:完成数学计算功能。 • 绝对值函数 abs(<表达式>) :返回数值表达式的绝对值 • 取整函数 Int(<数值表达式>) :返回数值表达式的整数部分 • 开平方函数Sqr Int(<数值表达式>) :计算数值表达式的平方根 • 产生随机数函数Rnd (<数值表达式>) :产生一个0-1之间的随机数小数 • 字符函数:完成字符串处理功能 • 日期时间函数:处理日期和时间 • 类型转换函数:将数据类型进行转换
VBA基础知识 • 函数 • 人机交互函数和过程:完成人与机器之间的交互。 • InputBox()函数 • InputBox(提示[,标题][,默认]) • “提示”: 字符表达式,在对话框中作为信息显示 • “标题”:字符表达式,在对话框中的标题区显示 • “默认”:字符表达式,在输入对话框中无输入时,该默认值作为输入的内容 Sub test() Dim strname As String, strs1 As String strs1 = "请输入你的姓名,然后单击确定" strname = InputBox$(strs1, "输入框") End Sub
VBA基础知识 • MsgBox过程 • MsgBox 提示[,按钮][,标题] • “标题”:字符表达式,在对话框中的标题区显示 • “按钮”:整型表达式,决定信息按钮的数目及出现在信息框上的图标类型 Sub test() Dim strname As String, strs1 As String strs1 = "请输入你的姓名,然后单击确定" strname = InputBox$(strs1, "输入框") MsgBox "你的姓名是" & strname End Sub
程序控制语句 • 顺序结构控制 • 选择结构控制 • 循环结构控制
顺序结构控制 1)注释语句 • 注释语句以Rem开头,但一般用撇号“‘”引导注释内容,用撇号引导的注释可以直接出现在语句后面。 2)声明语句 • 声明语句用于命名和定义常量、变量、数组和过程。如: Sub sample() Const PI=3.14159 Dim I as Integer … End Sub
顺序结构控制 3)赋值语句 • 赋值语句是任何程序设计中最基本的语句。赋值语句为变量指定一个值或表达式。赋值语句的形式如下: • 变量名=表达式 Dim I as Integer i=i+1
选择结构控制 • If…Then…语句 • 格式: • If <关系表达式或逻辑表达式> Then <语句> • 关系表达式或逻辑表达式成立时执行Then后的语句,否则直接执行If的下一条语句。 • <语句>可以一条语句,也可以是若干条用冒号“:”隔开的VBA语句组。
选择结构控制 • 随机出一道两位数加法题让小学生回答 Sub test() Dim A As Integer, B As Integer, Sum As Integer Randomize Timer A = 10 + Rnd * 89: B = 10 + Rnd * 89 Sum = InputBox(A & "+" & B & "=?", "两位数加法") If Sum = A + B Then MsgBox "答案正确!" If Sum <> A + B Then MsgBox "答错了!正确答案是" & A + B End Sub
选择结构控制 • If…Then…Else…语句 • 格式: • If <关系或逻辑表达式> Then <语句1> Else <语句2> • If后的表达式成立时执行Then后的语句,不成立时执行Else后的语句;然后程序继续执行If后的其他语句。 • 例: Sub Passed() Dim Grade As Integer Grade = InputBox("请输入考试分数:") If Grade >= 60 Then MsgBox ("合格") Else MsgBox ("不合格") End Sub
选择结构控制 • 选择分之语句 • 格式: If <关系或逻辑表达式> Then <语句组> End If • 或 If <关系或逻辑表达式> Then <语句组1> Else <语句组2> End If If Grade >= 60 Then MsgBox ("合格") Else MsgBox ("不合格") End If
选择结构控制 • 例 Sub Grade() Dim Grade As Integer, Evalu As String Grade = InputBox("请输入考试分数:") If Grade < 60 Then Evalu = "不合格" ElseIf Grade < 90 Then Evalu = "合格" Else Evalu = "优秀" End If MsgBox Grade & "分的等级为" & Evalu End Sub
选择结构控制 • Select Case语句 • 格式 Select Case <测试表达式> Case <表达式1> <语句1> Case <表达式2> <语句2> … [Case Else <语句n+1>] End Select
选择结构控制 • 例 Sub Grade1() Dim Grade As Integer, Evalu As String Grade = InputBox("请输入考试分数:") Select Case Grade Case 100: Evalu = "满分" Case 90 To 99: Evalu = "优秀" Case 80 To 89: Evalu = "良好" Case 70 To 79: Evalu = "中" Case 60 To 69: Evalu = "合格" Case Is < 60: Evalu = "不合格" Case Else: Evalu = "数据错误" End Select MsgBox Grade & "分的等级为" & Evalu End Sub
循环结构控制 • FOR语句 • 语法格式: For <循环变量>=初值 To 终值 [Step <步长值>] [循环体] Next [循环变量] • 步长值为1时可省略Step子句
循环结构控制 • 编写Even()过程,输出10~20的所有偶数之和 Sub Even() Dim I As Integer, S As Integer For I = 10 To 20 Step 2 S = S + I Next I MsgBox S, , "10至20之间的偶数之和" End Sub
循环结构控制 • 编写E2()过程,输出100以内的所有奇数之和 Sub E2() Dim I As Integer, S As Integer For I = 1 To 100 Step 2 S = S + I Next I MsgBox S, , "100以内奇数之和" End Sub
循环结构控制 • 编写E3()过程,输出4! Sub E3() Dim i As Integer, s As Single s = 1 For i = 1 To 4 s = s * i Next i MsgBox s, , "4!" End Sub
循环结构控制 • 编写E4()过程,输出1!+2!+3!+4! Sub E4() Dim i As Integer, s As Single, y As Single s = 1 For i = 1 To 4 s = s * i y = y + s Next i MsgBox y, , "4!" End Sub
循环结构控制 • 循环的嵌套:输出1!+2!+3!+4! Sub E4() Dim i As Integer, j As Integer, s As Single, y As Single For i = 1 To 4 s = 1 For j = 1 To i s = s * j Next j y = y + s Next i MsgBox y, , “4!为" End Sub 注意“s=1”语句的作用和在程序中的位置
循环结构控制 • 编程求水仙花数。所谓“水仙花数”是指一个三位数,其各位数字的立方和等于该数本身(如153=13+53+33)。 Sub E5() Dim a As Integer, b As Integer, c As Integer, y As Single For a = 1 To 9 For b = 0 To 9 For c = 0 To 9 y = a * 100 + b * 10 + c If y = a * a * a + b * b * b + c * c * c Then MsgBox y, , "水仙花数" Next c Next b Next a End Sub
循环结构控制 • Do While...Loop语句 • Do While...Loop通常用于循环次数未知的过程 • 语法格式: Do While <循环条件表达式> [循环体] Loop • 循环体中必须有“破坏”循环条件成立的语句,以免“死循环” • 强制终止循环的语句是Exit Do,跳出循环后执行Loop后的语句。
循环结构控制 • 我国有13亿人口,按人口年增长0.8%计算,多少年后我国人口超过26亿。 Sub Popu() x=13 n=0 Do While x<26 x=x*1.008 n=n+1 Loop MsgBox n End Sub
循环结构控制 • 有一张厚0.5mm面积足够大的纸,将它不断对折。问对折多少次后其厚度超过珠穆朗玛峰的高度(8848000mm)。 Sub zmlm() h = 0.5 n = 0 Do While H < 8848000 h= h * 2 n = n + 1 Loop MsgBox n, , "折叠的次数" End Sub