Access开发培训
网站公告
·Access专家课堂QQ群号:151711184    ·Access快速开发平台下载地址及教程    ·欢迎加入Access专家课堂微信群!    ·如何快速搜索本站文章|示例|资料    
您的位置: 首页 > 技术文章 > Access数据库-模块/函数/VBA

VBA基础知识(二)

时 间:2012-10-25 14:19:19
作 者:缪炜   ID:24010  城市:江阴
摘 要:2.1程序控制语句
VBA中的程序,按其语句代码执行的先后顺序,可以分为顺序程序结构、条件判断结构和循环程序结构。对于不同的程序结构要采用不同的控制语句方能达到预定的效果。下面介绍VBA中的这些控制语句。
正 文:

1.IF条件句
If语句利用应用程序根据测试条件的结果对不同的情况作出反应。if条件语句有3种语句形式,简单地介绍如下。
(1)If…Then
在程序需要作出“或者”的选择时,应该使用该语句。该语句又有两种形式,分别为单行形式和多行形式。
单行形式的语法为:
If条件Then语句
其中,“条件”是一个数值或一个字符串表达式。若“条件”为True (真),则执行Then后面的语句。“

语句”可以是多个语句,但多个语句要写在一行。例如:
If 1> 10 Then A - A + I 1-0 B-2*A
多行形式的语法为:
If 条件 Then
语句
End If
可以看出,与单行形式相比,要执行的语句是要通过End If来标志结束的。对于执行不方便写在同一行的多条语句时,使用这种形式会使代码整齐美观。例如上面的那个条件语句可以写成:
If 1> 10 Then
B-2*A
(2) If…Then…Else
如果程序必须在两种条件中选择种,则使用If…Then…Else。语法格式为:
If条件Then
语句
Else
语句
End If
若“条件”为True,则执行Then后面的语句:否则,则执行Else后面的语句。例如下面的代码,判断如果UpdateFlag的值为True,则显示一条消息“Update Successfully”,否则显示一条信息“Failed!”。
If UpdateFlag Then
MsgBox "Update Successfully"
Else
MsgBox “Failed”
End If
(3) If…Then…ElseIf…Else
如果要从3种或3种以上的条件中选择1种,则要使用If…They…ElseIf …Else。语法格式为:
IF 条件 1 Then
语句
Elself 条件 2 Then
语句
[Elself 条件 2 Then
语句]…
Else
语句
End If
若“条件1”为True,则执行Then后的语句:否则,再判“条件2”,为Trne时,执行随后的语句,依次类推。当所有的条件都不满足时,执行Else块的语句。例如,下面的语句通过对销售额进行判断,给出雇员的评价和佣金。
If Sales>15000 Then
    Coramission-Sales*0.08
    Rating^Excellent*
    Elself Salses>12000 And Salses<=15000 Then
        Commission-Sales^O.06
        Rating=”Good”
    Elself Sal3es>8000 And Salses<=12000 Then
        Commis3ion-Sales*0.05
        Rating=”Adequate”
Else
    Commission=Sales*0.04
    Rating=”Need Improvement”
End If
2. Select Case 语句
从上面的例子可以看出,如果条件复杂,分支太多,使用If语句就会显得累赘,而且程序变得不易阅读。这时可使用Select Case语句来写出结构清晰的程序。Select Case语句可根据表达式的求值结果,选择执行几个分支中的一个。其语法如下:
Select Case 表达式
Case表达式1
语句 
Case表达式2
语句
Case表达式3
语句
Case Else
End Select
在Select Case语句的语法中,Select Case后的表达式是必要参数,可为任何数值表达式或字符串表达式;在每个Case后出现表达式,是多个“比较元素”的列表,其中可包含“表达式”、“表达式To表达式”、“Is<比较操作符>表达式”等几种形式。每个Case后的语句都可包含一条或多条语句。
在程序执行时,如果有一个以上的Case子句与“检验表达式”匹配,则VBA只执行第1个匹配的Case后面的“语句”。如果前面的Case子句与<验表达式>都不匹配,则执行Case Else子句中的“语句”。例如,下面改写上文If语句的雇员佣金的例子:
Select Case Sales
    Case Is>15000
    Commission=Sales*0.08
    RatingVExcellent"
Case 12000 To 15000
    Commission=Sales*0.06
    Rating=”Good”
Case 8000 To 12000
    Commission=Sales*0.05
    Rating="Adequate"
Case Else
    Commission=Sales*0.04
    Rating="Need Improvement"
End Select
3. Do…Loop语句
在许多实例中,用户需要重复一个操作直到满足给定条件才终止操作。例如,用户希望检査单词、句子或文档中的每一个字符,或对有许多元素的数组赋值。循环就是用于这种情况下的。一个较为通用的循环结构的形式是Do…Loop语句,它的语法如下:    
Do [{While | Until}条件]
[语句]
[Exit Do]
[语句]
Loop

Do
[语句]
[Exit Do]
[语句]
Loop [{While|Until}条件]
其中,“条件”是可选参数,是数值表达式或字符串表达式,其值为True或False。如果条件为Null (无条件),则被当作False。While子句和Until子句的作用正好相反,如果指定了前者,则当<条件>是真时继续执行:如果指定了后者,则当<条件>为真时循环结束。如果把While或Until子句放在Do子句中,则必须满足条件才执行循环中的语句;如果把While或Until子句放在Loop子句中,则在检测条件前先执行

循环中的语句。在Do…Loop中可以在任何位置放置仟意个数的Exit Do语句,随时跳出Do…Loop循环。Exit Do通常用于条件判断之后,例如If…Then,在这种情况下,Exit Do语句将控制权转移到紧接在Loop命令之后的语句。如果Exit Do使用在嵌套的Do…Loop语句中,则Exit Do会将控制权转移到Exit Do所在位置的外层循环
例如下面的代码,通过循环为一个数组陚值。
Dim MyArray(lO) As Integer
Dim i As Integer
i=0
Do While i<=10
MyArray (i)=i
i=i+1
Loop
4. While…Wend 语句
在VBA中支持While…Wend循环,它与Do While…Loop结构相似,但不能在循环的中途退出。它的语法为:
while条件
语句
Wend
如果条件为True,则所有的语句都会执行,一直执行到Wend语句。然后再回到While语句,并再一次检查条件,如果条件还是为True,则审复执行:如果不为True,则程序会从Wend语句之后的语句继续执行。While…Wend循环也可以是多层的嵌套结构,每个Wend匹配最近的While语句。
例如上面的Do…Loop的代码,可以用While…Wend来实现,语法格式如下:
Dim MyArray(10) As Integer
Dim i As Integer
I=0
While i<=10
MyArray(i)=i
i=i+1
Wend
在VBA中提供While…Wend结构是为了与BASIC的早期版本兼容,用户应该逐渐抛弃这种使用法,而使用Do…Loop语句这种结构化与适应性更强的方法来执行循环。
5. For...Next 语句
For循环可以将一段程序重复执行指定的次数,循环中使用一个计数变虽,每执行一次循环,其值都会增加(或减少)。语法格式如下:
For计数器=初值To末值[步长]
语句
[Exit For]
语句
Next[计数器]
其中,“计数器”是一个数值变最。若未指定“步长”,则默认为1。如果“步长”是正数或0,则“初值”应大于等于“末值”;否则,“初值”应小于等于“末值”。VBA在开始时,将“计数器”的值设为“初值”。在执行到相应的Next语句时,就把步长加(减)到计数器上。在循环中可以在任何位置放置任意个Exit For语句,随时退出循环。Exit For经常在条件判断之后使用(例如If…Then),并将控制权转移到紧接在Next之后的语句。可以将—个For…Next循环放置在另一个

For…Next循环中,组成嵌套循环。不过在每个循环中的计数器要使用不同的变量名。
下面的代码使用For..Next循环为MyArray数组斌值。
Dim MyArray(10) As Integer
Dim i As Integer
For i=0 To 10
MyArray(i)=i
Next i
6. For Each…Next 语句
For Each…Next语句针对一个数组或集合中的每个元素,重复执行一组语句。语法格式为:
For Each元素In组或集合
语句
[Exit For]
语句_
Next元素
For…Each…Next语句中的元素用来遍历集合或数组中所有元素的变量。对于集合来说,这个元素可能是一个Variant变量、一个通用对象变量或任何特殊对象变量。对于数组而言,这个元素只能是一个Variant变量。组或集合是数组或对象集合的名称。如果集合中至少有一个元素,就会进入For…Each块执行。一旦进入循环,便先针对组或集合中第一个元素执行循环中的所有语句。如果在该组中还有其他的元素,则会针对它们执行循环中的语句,当组中的所有元素都执行完了,便会退出循环,然后从Next语句之后的语句继续执行。可以在循环中的任何位置放置任意个Exit For语句,以便随时退出循环。Exit For经常在条件判断之后使用(例如If…Then),并将控制权转移到紧接在Next之后的语句。可以将一个For…Each…Next循环放在另一个之中来组成嵌套式For…Each…Next循环,但是每个循环的元素必须是惟一的。下面的代码,定义一个数组并陚值,然后使用For…Each…Next循环在Debug窗口中打印数组中每一项的值。
Sub demo()
Dim MyArray (10) As Integer
Dim i As Integer
Dim x As Variant
For i - 0 To 10 ‘数组賦值
MyArray(i)=i
Next i
For Each x In MyArray For…Each…Next 循环
Debug.Print x ‘打印数组中的每一项
Next x 
End Sub 
运行时在Debug窗口中的输出结果为:

7.With…End With 语句
With语句可以对某个对象执行一系列的语句,而不用重复指出对象的名称。例如,要改变一个对象的多个属性,可以在With控制结构中加上属性的陚值语句,这时候只是引用对象一次而不是在每个域性陚值时都要引用它。它的语法格式如下:
With对象
语句
End with
下面的例子显示了如何使用With语句来给同一个对象的几个属性賦值。
With MyLabel
.Height = 2000
.Width - 2000
.Caption = "This is MyLabel"
End With
当程序一旦进入With块,对象就不能改变。因此不能用一个With语句来设置多个不同的对象。可以将一个With块放在另一个之中,而产生嵌套的With语句。但是,由于外层With块成员会在内层的With块中被屏蔽掉,所以必须在内层的With块中,使用完整的对象引用來指出在外层的With块中的对象成员。
8. Exit语句
Exit语句用于退出Do…Loop、For…Next、Function、Sub或Property代码块。它包含Exit Do、Exit For、Exit Function、Exit Property 和 Exit Sub 几个语句。
下面的示例使用Exit语句退出For…Next循环、Do…Loop循环及子过程
Sub ExitStatementDemo()
Dim I, MyNum
Do’建立无穷循环
For I = 1 To 1000'循环1000次
MyNum = Int(Rnd * 1000)'生成一随机数
Select Case MyNum’检査随机数
Case 7: Exit For'如果是7退出For…Next循环.
Case 29: Exit Do'如果是29,退出DO…Loop循环.
Case 54: Exit Sub'如果是54,退出子过程
End Select
Next I
Loop
End Sub

9. GoTo语句
无条件地转移到过程中指定的行,它的语法为:GoTo行标签其中行标签用来指示一行代码。行标签可以是任何字符的组合,以字母开头,以冒号 (:)结尾。行标签与大小写无关,必须从第1列开始标注行标签。GoTo语句将用户代码转移到行标签的位置,并从该点继续执行。下面的示例使用GoTo语句在个过程内的不同程序段间作流程控制,不同程序段用不同的行标签来区分。
Sub GotoStatementDeino ()
Dim Number, MyString
Number = 1 '设置变量初始值
'判断Number的值以决定要完成那一个裎序区段(以”行标签"来表式),
If Number =1 Then GoTo Linel Else GoTo Line2
Linel: '行标签
MyString = "Number equals 1"
GoTo LastLine '完成最后一行.
Line2: '行标签
'下列的语句根本不会被完成.
MyString = "Number equals 2"
LastLine: '行标签
Debug.Print MyString  '将""Number equals 1”"显示在"立即"窗口.
End Sub
太多的GoTo语句,会使程序代码不容易阅读及调试。在VBA中使用GoTo语句只有一个目的,就是用On Error GoTo Label语句处埋错误。

上一节      下一节



Access软件网QQ交流群 (群号:483923997)       Access源码网店

常见问答:

技术分类:

相关资源:

专栏作家

关于我们 | 服务条款 | 在线投稿 | 友情链接 | 网站统计 | 网站帮助