null8.4 VBA程序设计概述8.4 VBA程序设计概述面向对象程序设计的基本概念
VBA编程环境
VBA基础知识
程序控制语句面向对象程序设计的基本概念面向对象程序设计的基本概念VBA (Visual Basic for Application)是微软OFFICE系列软件的内置编程语言,它是一种面向对象程序设计语言。
VBA从VB中继承了主要的语法结构,用户界面也大同小异。
但VBA不能用它创建独立的应用程序,只能在Access、Excel等应用程序的支持下使用。
利用VBA语言编写代码,可以完成特殊的、复杂的操作。程序设计基本知识程序设计基本知识VBA语法:
常用语句:赋值语句、条件语句、循环语句、输入输出语句等;
语句的基本成分:常量、变量、函数、表达式;
程序的控制结构:VBA程序由一个或多个模块组成,每个模块包含一个或多个过程;每个过程包含若干语句;
程序设计基本知识程序设计基本知识
类、对象:
类是描述对象的特征、外观、行为的模板。
对象是类的实例。
Access中,窗体、报表、标签、文本框、命令按钮……都是对象面向对象程序设计的基本概念面向对象程序设计的基本概念属性和方法
属性是对象特征的描述;
方法是对象可以执行的动作;
事件和事件过程
事件是对象发生的事情;
事件过程是响应某个事件所执行的程序代码;事件过程是计算机要执行的一系列操作。面向对象程序设计的基本概念面向对象程序设计的基本概念属性和方法
属性是对象特征的描述;
对象.属性 label1.capition
方法是对象可以执行的动作;
面向对象程序设计的基本概念面向对象程序设计的基本概念 Docmd对象的方法:
窗体最大化 Docmd.maximize
运行窗体 “学生信息浏览”
Docmd.openform “学生信息浏览”
运行查询“asd”
Docmd.openquery “asd”
运行表“学生” Docmd.opentable “学生”
运行宏“123” Docmd.Runmacro “123”
面向对象程序设计的基本概念面向对象程序设计的基本概念 事件及事件响应代码:
事件是一个对象可以辨别的操作,如单击鼠标,鼠标的移动,按下某个键……;
为事件编写代码,以便时间发生的时执行用户期望的动作。这样的代码称为事件响应代码。VBE窗口VBE窗口主窗口、工程窗口、属性窗口、代码窗口nullnullVBA语句书写规则:
不区分大小写,标点符号必须是英文符号;
一条语句一行,语句过长时,可以用 _ 将一个语句分成多行;
一行些多个语句时,语句间用 :隔开;
VBA基础知识VBA基础知识数据类型
标准数据类型
VBA基础知识VBA基础知识VBA使用常量、变量来存储值。用来保存在程序运行期间的数据。
常量
VBA在运行时其值始终保持不变的量
字符串常量放在一对 “ 内,日期/时间型常量放在一对#内。如”中国“ 、#9/1/2005#、true、false等。
符号常量:用标识符保存一个常量值,提高程序的可读性和可维护性
使用Const语句定义符号常量,如
Const PI #= 3.141569
Const TermBeginDate = #3/1/2007# VBA基础知识VBA基础知识变量
变量的命名原则
第一个字符必须是字母
包含的字符数不超过255个
不得与VBA的关键字同名,如不能使用Sub、For if 等
变量名不区分大小写;abc,Abc,ABC被视为同一个变量
不能使用下列字符:! @ & $ # (空格)- * 小数点
null判断下列变量是否合法?
aa x x3 student_1 sum1
3s if q*t -3x whf-99
nullVBA基础知识VBA基础知识变量
Dim StudentName As String
Dim Grade As Integer, AvgGrade As Single
Dim Passed As Boolean, ExamDate As Date
dim A% ,sum!
nullnullnullnullVBA基础知识VBA基础知识数组
数组是一种数据存储结构,它是用一个命名的一个集合体,用不同的下标予以区分
数组具有以下特性(数组中的每个数据称为元素):
每个元素类型相同,占用同样大小的存储空间
数组中的元素在内存中连续存放
通过下标可访问数组中的每个元素。下标的类型可以是整数,常量、变量或算术表达式。
数组分为一维数组、二维数组和多维数组 VBA基础知识VBA基础知识数组
一维数组中的元素呈直线状排列,每个下标对应一个元素。
数组在使用前必须先行定义,语法格式是:
Dim <数组名>([<下界>] To 上界) As 数据类型
若省略下标下界,则数组的最小下标为0
Dim a(20) As Double
a数组共有21个元素(下标的起止范围是0~20)
Dim B(1 to 5) As integer
B数组共有5个元素: b(1) b(2) b(3) b(4) b(5) VBA基础知识VBA基础知识数组
二维数组中数据排列呈平面状,可保存一个二维表的信息。
数组元素使用行下标和列下标定位,定义格式:
Dim <数组名>([<下界> To] 上界,[<下界> To] 上界) As 数据类型
如果省略下标的下界值,则下界值默认为0
VBA基础知识VBA基础知识数组
数组元素使用行下标和列下标定位,定义格式:
Dim <数组名>([<下界> To] 上界,[<下界> To] 上界) As 数据类型
例如,Dim C( 1 to 3, 2 to 5) As Integer
VBA基础知识VBA基础知识数组的赋值
Dim C( 1 to 3, 2 to 5) As Integer
Dim a(5) as boolean
C(1,3)=76
C(3,5)=80
A(0)=true
a(3)=false
利用循环语句赋值VBA基础知识VBA基础知识对象变量
Access建立的数据库对象及其属性,均可被看成VBA程序中的变量加以引用。
例如,Access中窗体与报表对象的引用格式为:
Forms(或Reports)!窗体( 或报表)名称!控件名称[.属性名称]
关键字formsReports分别表示窗体或报表对象集合。
感叹号“!”分割开对象名称和控件名称。
VBA基础知识VBA基础知识运算符和表达式
表达式:用运算符将常量、变量、函数等连接起来的式子,书写在一行上。
表达式可分为:
算术表达式,如 Count=Count+1
关系表达式,如 C<>20
逻辑表达式,如 Age<=5 Or Age>=60
nullmod \
20 mod 3 25\6.6
true ( -1) False (0)
8-true false+5
nullnullVBA基础知识VBA基础知识
函数:是系统事先定义好的内部程序,用来完成特定的功能。
分类:
数学函数、字符串函数、日期时间函数、类型转换函数
Int() ABS( ) Log( )……
Len( ) left( ) right( ) space( ) ……
Date( ) year( ) month( ) day( ) ……
*可以在立即窗口中学习使用函数。
null转换函数
ASC( ) asc(“A”) =65
chr( ) chr(90+7)=“a”
str( ) str(1234)=“1234”
val( ) val(“123.56”)=123.56
Ucase( ) ucase(“abcDE”)=“ABCDE”
Lcase( ) lcase(“cDE”)=“cde”
程序控制语句程序控制语句执行语句的基本结构:
顺序结构、选择结构、循环结构VBA语句按功能分:
声明语句:用于变量、常量过过程定义命名;
执行语句:用于赋值操作,调用过程、流程控制顺序结构控制顺序结构控制1)注释语句
注释语句以Rem开头,但一般用撇号“‘”引导注释内容,用撇号引导的注释可以直接出现在语句后面。
2)声明语句
声明语句用于命名和定义常量、变量、数组和过程。
3)赋值语句
赋值语句是任何程序设计中最基本的语句。赋值语句为变量指定一个值或表达式。赋值语句的形式如下:
变量名=表达式顺序结构控制顺序结构控制3)赋值语句
dim a%,sum!,ch1$
a=123
sum = 65.32
sum=sum+a
ch1=“Li Ming”
command1.caption=“退出”
? x=y=z 的结果是什么
顺序结构控制顺序结构控制输入语句 inputbox
作用:显示一个输入框,并提示用户在文本框中输入文本、数字或选中某个单元格区域,当按下确定按钮后返回包含文本框内容的字符串。
InputBox(Prompt[,Title][,Default][,Xpos][,Ypos])
例:private sub form_click()
dim a%
dim str as string*30
a =inputbox(“请输入一个整数:”)
str=inputbox(“请输入姓名:”,”姓名输入框”)
end sub null消息框(MsgBox)
消息框用于在对话框中显示消息,等待用户单击按钮,并返回一个整形值告诉用户单击哪一个按钮。其使用格式如下:
MsgBox(prompt[,buttons][,title][,helpfile][,context])
MsgBox “处理数据结束!”,VbInformation,“消息”nullMsgBox(prompt[,buttons][,title][,helpfile][,context])
buttons 参数有下列设置值:
vbOKOnly 0 只显示 OK 按钮。 VbOKCancel 1 显示 OK 及 Cancel 按钮。 VbAbortRetryIgnore 2 显示 Abort、Retry 及 Ignore 按钮。 VbYesNoCancel 3 显示 Yes、No 及 Cancel 按钮 VbYesNo 4 显示 Yes 及 No 按钮。 VbRetryCancel 5 显示 Retry 及 Cancel 按钮。 VbQuestion 32 显示 Warning Query 图标。
MsgBox ( “退出本系统?”,33,“消息”)
MsgBox ( “退出本系统?”, VbOKCancel + VbQuestion ,“消息”)选择结构控制选择结构控制If…Then…语句
格式:
If <关系表达式或逻辑表达式> Then <语句>
关系表达式或逻辑表达式成立时执行Then后的语句,否则直接执行If的下一条语句。
<语句>可以一条语句,也可以是若干条用冒号“:”隔开的VBA语句组。
null选择结构控制选择结构控制随机出一道两位数加法题让小学生回答
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
2 If…Then…Else…语句 2 If…Then…Else…语句 格式:
If <关系或逻辑表达式> Then <语句1> Else <语句2>
If后的表达式成立时执行Then后的语句,不成立时执行Else后的语句;然后程序继续执行If后的其他语句。 2 If…Then…Else…语句 2 If…Then…Else…语句 格式:
If <关系或逻辑表达式> Then <语句1> Else <语句2>
2 If…Then…Else…语句 2 If…Then…Else…语句 [例10] Sub Passed()
Dim Grade As Integer
Grade = InputBox("请输入考试分数:")
If Grade >= 60 Then MsgBox ("合格") Else MsgBox ("不合格")
End Sub本例的If语句也可改写成:
If Grade < 60 Then MsgBox ("不合格") Else MsgBox ("合格") 3 块状选择语句 3 块状选择语句 格式:
If <关系或逻辑表达式> Then
<语句组>
End If
或
If <关系或逻辑表达式> Then
<语句组1>
Else
<语句组2>
End IfIf Grade >= 60 Then
MsgBox ("合格")
Else
MsgBox ("不合格")
End If注意:Then后不能有其他语句(单引号引导的注释语句除外) nullDim x as integer,y as integer
X=inputbox(“请输入x的值:”)
y=inputbox(“请输入y的值:”)
If x>y then
Debug.print x
Else
Debug.print y
End if
null4 选择语句嵌套 4 选择语句嵌套 [例] null5 Select Case语句5 Select Case语句Select Case语句是多分支选择语句,格式:
Select Case <测试表达式>
Case <表达式1>
<语句1>
Case <表达式2>
<语句2>
…
[Case Else
<语句n+1>]
End Select 当测试表达式的值满足某个表达式时,程序就执行该语句。
如果没有一个表达式的值能满足测试表达式,则执行Case Else后的语句。 null5 Select Case语句5 Select Case语句[例] 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 Sub5 Select Case语句5 Select Case语句说明:
测试表达式不一定是关系表达式或逻辑表达式,可以是任意类型,但Case子句中的表达式类型必须与之相一致。
如果Case子句中的表达式是一个常量,则该常量直接写在Case之后,如Case 100。
如果Case子句后的表达式是一个范围,可用To从小到大指定,如Case 90 To 99、Case “A” To “Z”;或者使用Is <关系运算符> <表达式>
如,Case Is > 3 And <8nullnull条件函数条件函数IIf 函数
IIf (条件表达式,表达式1,表达式2)
根据条件表达式的值,决定函数的返回值。条件表达式为真,函数返回“表达式1”的值,否则返回“表达式2”的值
例:IIf(3<5, x=5,x=3)
IIf(3>5, x=0,y=1)
4 循环语句 4 循环语句 VBA提供了4类循环语句: For...Next循环、Do While...Loop循环、 For Each...Next循环、While...End循环
最常用的是For...Next和Do While...Loop循环
1 For...Next循环
2 Do While...Loop循环
3 双重循环和多重循环循环结构控制循环结构控制FOR语句
语法格式:
For <循环变量>=初值 To 终值 [Step <步长>]
[循环体]
Next [循环变量]
步长值为1时可省略Step子句
将初值赋给循环变量
判断循环变量是否在初值 和 终值之间
如果是,则继续执行循环体,否则终止循环;
执行一次循环体里的语句后,循环变量加上一个步长。返回第2步
null1 For...Next循环 1 For...Next循环 [例] 求1+2+3+4+……50的和:
dim s as integer ,I as integer
s=0
for I=1 to 50
s=s+i
Next I
debug.print s *在立即窗口中输出s的值
nullnull改变循环变量对循环的影响改变循环变量对循环的影响Private Sub Command0_Click()
j = 0
For I = 1 To 20 Step 2
I = 3 + I
j = j + 1
Debug.Print "第"; j; "次循环i="; I
Next I
Debug.Print "退出循环后i="; I
End Sub
For...Next循环给数组赋值 For...Next循环给数组赋值 [例]
dim s(1 to 10) as integer ,I(3,4) as integer
for m=1 to 10
s(m)=m
debug.print s(m)
Next m
for m=0 to 3
for n=0 to 4
i(m,n)=m*n
Next m
Next m1 For...Next循环 1 For...Next循环 [例]通过键盘输入一个自然数X,判断它是否为质数
质数:除1以外,只能被1和自己所整除的自然数练习 运行下面程序,其输出结果(str2的值)为[ ] .练习 运行下面程序,其输出结果(str2的值)为[ ] . Dim str1 As String, str2 As String
Dim i As Integer
str1 = "abcdef"
For i = 1 To Len(str1) Step 2
str2 = UCase(Mid(str1, i, 1)) + str2
Next
MsgBox str2
循环结构控制循环结构控制编写Even()过程,输出10~20的所有偶数
Sub Event()
Dim I As Integer,S As String
For I=10 To 20 Step 2
S=S&""$I
Next I
MsgBox S,,"10至20之间的偶数"
End Sub2 Do While...Loop循环 2 Do While...Loop循环 Do While...Loop通常用于循环次数未知的过程
语法格式:
Do While <循环条件表达式>
[循环体]
Loop
循环体中必须有“破坏”循环条件成立的语句,以免“死循环”
强制终止循环的语句是Exit Do,跳出循环后执行Loop后的语句。 nullnull[例] 我国有13亿人口,按人口年增长8%计算,多少年后我国人口超过26亿?
Sub abc()
X=13
N=0
Do while x<26
X=x*1.008
N=n+1
Loop
MsgBox n & "年后,我国人口将达到" & X & "亿 "
End sub循环结构控制循环结构控制Do Until...Loop语句
语法格式:
Do until <循环条件表达式>
[循环体]
Loop
在循环开始时测试条件,如果条件不成立,则执行循环体,单号返回到Do until 处,
如果条件成立,则退出循环nullnullnullnullnull练习 运行下面程序代码后,变量J的值为_____。练习 运行下面程序代码后,变量J的值为_____。
Private Sub Fun()
Dim J as Integer
J=10
DO
J=J+3
Loop While J<19
End Sub
A)10 B)13 C)19 D)21
3 双重循环和多重循环 3 双重循环和多重循环 双重循环:循环语句的循环体本身也是一个循环
对于一个m行n列的表格来说,常常需要用双重循环才能访问到表中的每一个数据。
对于一个外层循环有m次、内层循环有n次的双重循环,其核心循环体将重复执行m×n次。
多重循环指三重循环或更多层次嵌套的循环1 For...Next循环 1 For...Next循环 [例] 阅读下面的程序段:
K=0
for I=1 to 3
for J=1 to I
K=K+J
Next J
Next I
执行上面的语句后,K的值为______。
A)8 B)10 C)14 D)21
nullPrivate sub command1_click( )
Dim a(6,6)
For i=2 to 4
For n=4 to 5
a(I,n) =i*n
Next j
Next I
Msgbox a(2,5)+a(3,4)+a(4,5)
End sub
3 双重循环和多重循环 3 双重循环和多重循环 [例]在立即窗口中输出10以内的平方根表 Format()函数是打印项的格式函数,"0.00"表示小数保留两位,同时在没有整数部分、小数部分时用0填补。 过程 过程 1 Sub过程
2 Function过程
3 过程调用中的参数传递方式
4 数组参数的传递方法 Sub过程 Sub过程VBA模块的过程可分为Sub过程和Function过程两大类。区别在于前者没有返回值而后者有。
Sub过程的语法格式
[Private][Public][Static]Sub <过程名> (参数表)
语句
End Sub
Private表示本过程为模块级过程
Public表示本过程是全局过程,在整个应用程序的各个模块中均有效。默认值是Public过程。
Static表示本过程中声明的局部变量均为静态变量,变量的值在整个程序运行期间予以保留。 Sub过程 Sub过程被另一个过程调用时,参数表用于接纳所需的数据;如果没有参数可传递,被调用过程就是无参过程。
过程的调用
过程在执行中可以调用另外一个过程,同时将参数传递过去;调用完毕再回到本过程继续执行。
过程的调用方法:
Call <过程名>(参数表)
或
<过程名> 参数表 Sub过程 Sub过程[例] 计算n的阶乘
Sub ab( )
Dim n As Integer, x As Single
n = InputBox("请输入一个任意数")
x = 1
CALL FACT(N,X)
MsgBox n & "的阶乘是:" & fact(n, x)
End Sub
SUB fact(m As Integer, p As Single)
Dim i As Integer
For i = 1 To m
p = p * i
Next i
End SUB Sub过程 Sub过程[例] Sub过程 Sub过程[例] 调用DataPlus过程时,X、Y是实参,A、B是形参调用DataSub过程时,形参与实参的名称一样,都是X和Y实参:主调过程的参数 形参,被调过程的参数 Function过程 Function过程Function过程是用户自定义函数,语法格式:
[Private][Public][Static]Function <过程名> (参数表) As [类型]
语句
End Function
Function过程亦称函数过程,与Sub过程的区别在于具有返回值。
Function过程的返回值通过过程名带回。 Function过程Function过程[例] 计算n的阶乘
Sub ab()
Dim n As Integer, x As Single
n = InputBox("请输入一个任意数")
x = 1
MsgBox n & "的阶乘是:" & fact(n, x)
End Sub
Function fact(m As Integer, p As Single) As Single
Dim i As Integer
For i = 1 To m
p = p * i
Next i
fact = p
End FunctionFunction过程Function过程
过程之间参数的传递过程之间参数的传递在调用过程时,一般主调过程与被调过程之间有数据传递,即将主调过程的实参传递给被调过程的形参,完成实参与形参的结合,然后执行被调过程体。在VBA中,实参与形参的结合有两种方法:传地址和传值。传地址是默认的方法。形式参数与实际参数形式参数与实际参数一、形式参数
形式参数简称形参,是出现在Sub或Function过程定义的形参表中的变量名、数组名,即在被调过程中的参数是形参,是用来接收传送给过程的数据。在过程被调用之前,形参未被分配内存,只是说明形参的类型和在过程中的作用。形参列表中的各参数之间用逗号分隔,形参可以是除了定义字符串变量之外的合法变量名,也可以是后面跟有()的数组名。形参的形式为:
[Optional][ByVal] [ByRef] 变量名[()] [As 数据类型]形式参数与实际参数形式参数与实际参数例 求两个数中的大数中被调用的函数和调用过程如下:
Private Function max(x As Integer, y As Integer) As Integer
If x > y Then
max = x
Else
max = y
End If
End Function
Private Sub Form_ Click()
Dim a As Integer, b As Integer, c As Integer
a = InputBox("请输入a的值:")
b = InputBox("请输入b的值:")
c = max(a, b)
Print "最大的数为:"; c
End Sub形式参数与实际参数形式参数与实际参数二、实际参数
实际参数简称实参,是在主调过程中的参数,在过程调用时实参将数据传递给形参,形实结合。
形实结合是按位置结合的,即第一个实参与第一个形参结合,第二个实参与第二形参结合,依此类推,而不是按“名字”结合的。因此,形参列表和实参列表中的对应变量名可以不同,但实参和形参的个数、顺序以及数据类型必须相同。形式参数与实际参数形式参数与实际参数例 求两个数中的大数中被调用的函数和调用过程如下:
Private Function max(x As Integer, y As Integer) As Integer
If x > y Then
max = x
Else
max = y
End If
End Function
Private Sub Form_ Click()
Dim a As Integer, b As Integer, c As Integer
a = InputBox("请输入a的值:")
b = InputBox("请输入b的值:")
c = max(a, b)
Print "最大的数为:"; c
End Subnull三、形参的数据类型
在创建过程时,如果没有声明形参的数据类型,则缺省为Variant型。
例如,将上例函数过程中的参数定义如下:
Private Function max(ByVal x , y As Integer)
…
End Function
x为Variant型,y为Integer型
对于实参数据类型与形参定义的数据类型不一致时,VB会按要求对实参进行数据类型转换,然后将转换值传递给形参。 null总之,在调用过程时,将实参传递给形参,在“形实结合”时,要注意以下两点:
(1)当实参表中的参数是变量或数组元素、对象时,形参和实参对应的名字可以不同,但如果是按传地址方式传递时,要做到在参数的个数、顺序上以及对应位置的参数数据类型完全相同;如果是按传值方式传递时,在参数的个数、顺序上要做到完全相同,而对应位置的参数数据类型则遵循赋值语句中不同类型数据赋值的原则。
(2)当实参表中的参数是常数、表达式时,也要做到在参数的个数、顺序上要完全相同;若发现实参与对应的形参的类型不同,则遵循赋值语句中不同类型数据赋值的原则,强制转换为与形参相同的类型,再传递给形参;若无法实现强制转换,则报错。nullPrivate Sub Form_ Click()
Dim a As Single, b As Integer, c As Integer
a = InputBox("请输入a的值:")
b = InputBox("请输入b的值:")
c = max(a, b)
Print "最大的数为:"; c
End Sub
Private Function max(ByVal x As Integer, ByVal y As Integer) As Integer
If x > y Then
max = x
Else
max = y
End If
End Function传地址与传值传地址与传值在VBA中有两种传递参数的方式:按值传递(Passed by Value)和按地址传递(Passed by Reference)。其中按地址传递,习惯上称为“引用”。传地址与传值传地址与传值一、按值传递
在定义过程时,若形参前面有关键字ByVal,则其对应的实参是按值传递的。
形参得到的是实参的值,形参值的改变不会影响实参的值。
传地址与传值传地址与传值例 按值传递
Private Sub value(ByVal m As Integer, ByVal n As Integer)
m = 5 * m + 2: n = n - 6
Textm.Text = m : Textn.Text = n
End Sub
Private Sub cmdjs_Click()
Dim x As Integer, y As Integer
x = Val(Textx.Text) : y = Val(Texty.Text)
Call value(x, y)
resultx.Text = x : resulty.Text = y
End Sub
Private Sub cmdend_Click()
End
End Sub传地址与传值传地址与传值二、按地址传递
在定义过程时,若形参前面有没关键字ByVal(即缺省关键字)或有ByRef关键字时,则这个形参是按地址传递的参数。
按地址传递参数时,把实参变量的内存地址传递给被调过程。形参和实参具有相同的地址,即形实参数共享同一段存储单元。因此,在被调过程中任何参形参的操作都变成了对相应的实参的操作,形参改变,相应的实参也随之改变。也就是说按地址传递参数可在被调过程中改变实参的值。
传地址与传值传地址与传值例6.7按地址传递,主调函数不变。
Private Sub value(m As Integer, n As Integer)
m = 5 * m + 2 : n = n - 6
Textm.Text = m : Textn.Text = n
End Sub
Private Sub cmdjs_Click()
Dim x As Integer, y As Integer
x = Val(Textx.Text) : y = Val(Texty.Text)
Call value(x, y)
resultx.Text = x : resulty.Text = y
End Sub
Private Sub cmdend_Click()
End
End Subnull通过上面的例子,我们可以这样简单地理解按地址传递:当调用一个过程时,系统将实参与对应的形参相结合,在调用过程中形参与实参共用同一段存储单元。当调用结束时,这些形参才与实参解除共用存储单元的关系,因此过程内形参的改变会影响到实参,它们之间是一种实时的数据双向传递关系。null当实参是常量、表达式形式,则不论其对应形参前定义成什么方式,系统都强制按值传递参数;当实参是数组、对象形式,则不论其对应形参前定义成什么方式,系统都强制按地址传递参数。null例6.8 计算4!+3!+2!+1!,按照按地址参数传递的方法编写程序,代码如下:
Private Function fact(n As Integer) As Integer
fact = 1
Do While n > 0
fact = fact * n
n = n - 1
Loop
End Function
Private Sub Form_Click()
Dim sum As Integer, i As Integer
For i = 4 To 1 Step -1
sum = sum + fact(i)
Next
Print "Sum="; sum
End Sub运行结果为:Sum=24
结果是24而不是希望的33,
怎样才能求出正确的解?有以下两种方法:
(1)将函数定义为按值传递:Private Function fact(ByVal n As Integer) As Integer。
(2)将实参i改为表达式,因为表达式是按值传递的。把变量变为表达式的最简单的方法是用“( ) ”将变量用括号括起来。调用语句为:sum=sum+fact((i))过程调用中的参数传递方式 过程调用中的参数传递方式 [例] 分析输出结果 过程调用中的参数传递方式 过程调用中的参数传递方式 [例] 分析输出结果 练习练习1.在过程调用中有语句:
private sub getdata( byVal data as integer)
其中,"ByVal"的含义是
A. 传值调用 B. 传址调用
C. 形式参数 D. 实际参数
2. 在窗体中有一个命令按钮(run34),对应的时间代码如下:
Private sub run34_Click()
sum=0
for i=10 to 1 step -2
sum=sum+i
next i
msgbox sum
end sub
运行以上事件,程序的输出结果是
A. 10 B. 30 C. 55 D. 其他结果练习练习3. 在窗体中有一个名称为run35的命令按钮,单击该按钮从键盘接受学生成绩,如果输入的成绩不在0到100分之间,则要重新输入;如果输入的成绩正确,则进入后续程序处理. run35命令按牛的click事件代码如下:
Private sub run35_click()
dim flag as boolean
result=0
flag=true
do while flag
result=val(inputbox("请输入学生成绩:","输入"))
if result>=0 and result<=100 then
__________
else
msgbox "成绩输入错误,请重新输入"
end if
loop
rem 成绩输入正确后的程序代码略
end sub
程序中有一空白处,需要填入一条语句使程序完成其功能.下列选项中错误的语句是
A. flag=false B. flag=not flag
C. flag=true D. exit do练习练习4. 在窗体中添加一个名称为command1的命令按钮,然后编写如下事件代码:
Private sub command1_click()
Dim x as integer, y as integer
x=12:y=32
call p(x,y)
msgbox x*y
end sub
sub p(n as integer,byval m as integer)
n=n mod 10: m=m mod 10
End sub
窗体打开运行后,单击命令按钮,则消息框的输出结果为_____. 练习练习5. 已知数列的递推公式如下:
f(n)=1 当n=0,1时
f(n)=f(n-1)+f(n-2) 当n>1时
则按照递推公式,可以得到数列1,1,2,3,5,8,13,21,34,55....,先要求从键盘输入n值,输出对应项的值.例如,当输入n为8时,应该输出34.程序如下,请补充完整.
Private sub run11_click()
f0=1
f1=1
num=val(inputbox("请输入一个大于2的整数:"))
for n=2 to ______
f2=______
f0=f1
f1=f2
next n
msgbox f2
end sub null运行下列程序,窗体中的显示结果是:x= 【11】 。
Option Compare Database
Dim x As Integer
Private Sub Form_Load()
x=3
End Sub
Private Sub Command11_Click()
Static a As Integer
Dim b As Integer
b=x^2
fun1 x,b
fun1 x,b
MsgBox ”x=“&x
End Sub
Sub fun1(ByRef y As Integer,ByVal z As Integer)
y=y+z
z=y-z
End SubVBA常见操作 VBA常见操作 一、打开和关闭操作
1.打开窗体操作
一个程序中往往包含多个窗体,可以用代码的形式关联这些窗体,从而形成完整的程序结构。
命令格式为:
DoCmd.OpenForm formname[,view][,filtername][,wherecondition][,datamode][,windowmode]
其中filtername与wherecondition两个参数用于对窗体的数据源数据进行过滤和筛选;windowmode参数则规定窗体的打开形式。
例9.1 以对话框形式打开名为“学生信息登录”窗体。
Docmd.OpenForm“学生信息登录”,,,,acDialog
注意,参数可以省略,取缺省值,但分隔符“,”不能省略。null2.打开报表操作
命令格式为:
Docmd.OpenReport reportname[,view][,filtername][,wherecondition]
例如,预览名为“学生信息表”报表的语句为:
Docmd.OpenReport“学生信息表”,acViewPreView
注意,参数可以省略,取缺省值,但分隔符“,”不能省略。null3.关闭操作
命令格式为:
Docmd.Close[,objecttype][,objectname][,save]
实际上,由DoCmd.Close命令参数看到,该命令可以广泛用于关闭Access各种对象。省略所有参数的命令(DoCmd.Close)可以关闭当前窗体。
例9.2 关闭名为“学生信息登陆”窗体。
DoCmd.Close acForm,“学生信息登录”
如果“学生信息登录”窗体就是当前窗体,则可以使用语句:DoCmd.Close。数据库访问接口数据库访问接口VBA中提供了ODBC、DAO、ADO数据库访问接口数据库访问接口数据访问对象DAO(Data Access Object),也称DAO数据访问接口,通过该接口可以访问本地和远程数据库的数据和对象。
使用DAO访问数据库的步骤:
1 声明DAO对象
dim 变量名 as dao对象类型
dao对象类型主要有 WorkSpace(工作区)、DataBase(数据库对象)、Recordset(记录集)、fields(字段信息)、Querydef(查询信息)等数据库访问接口数据库访问接口例:
dim wo as WorkSpace
dim da as DataBase
dim re as Recordset
2 通过set语句引用DAO对象
Set wo=Dbengine.WorkSpace
Set da=wo.openDataBase(教学管理系统)
Set re=da.openRecordset(学生选课)
数据库访问接口数据库访问接口3 关闭数据库及回收变量的内存单元
关闭数据库
da.close
回收变量的内存单元
Set re=nothingnull数据库中有“学生成绩表”,包括“姓名”、“平时成绩”、“考试成绩”和“期末总评”等字段。现要根据“平时成绩”和“考试成绩”对学生进行“期末总评”。规定:
“平时成绩”加“考试成绩”大于等于85分,则期末总评为“优”,“平时成绩”加“考试成绩”小于60分,则期末总评为“不及格”,其他情况期末总评为“合格”。
下面的程序按照上述要求计算每名学生的期末总评。请在空白处填入适当的语句,使程序可以完成指定的功能。
Private Sub Command0_Click()
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim pscj,kscj,qmzp As DAO.Field
Dim count As Integer
Set db=CurrentDb()
Set rs=db.OpenRecordset(”学生成绩表“)
Set pscj=rs.Fields(”平时成绩“)
Set kscj=rs.Fields(”考试成绩“)
Set qmzp=rs.Fields(”期末总评“)
count=0
Do While Not rs.EOFnull【14】
If pscj+kscj》=85 Then
qmzp=”优“
ElseIf pscj+kscj《60 Then
qmzp=”不及格“
Else
qmzp=”合格“
End If
rs.Update
count=count+1
【15】
Loop
rs.Close
db.Close
Set rs=Nothing
Set db=Nothing
MsgBox ”学生人数:“&count
End Sub
本文档为【VBA程序设计】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。