




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1.2 VBA 语法(及 Access 的对象结构)VBA 程序是 VBA 语言语句代码以及注释的集合。一条语句是一个完整的命令,语句之 间用换行符分割,大多数情况下,一条语句就是一行代码。VBA 语句是由规定的保留字(也称为关键字,在本书的范例中,关键字都以大写字母 开头)与其他被赋予意义的单词组合而成,每条语句都具有明确意义,在VBA语句分为三 种类型:声明语句。定义变量、常数,或定义一段程序。赋值语句。为变量或常数指定一个值或表达式。 可执行语句。它可以执行一个方法或是函数。 我们往往把实现特定功能的程序段用特定的方式单独封装起来,以便反复调用运行,或 者提高程序可读性。这种程序段的最小
2、单元我们称之为过程,一个 Access 模块中可包含一 个或者多个过程。过程与函数先看一个简单的过程:Sub subPromptMessage()MsgBox 这是一个最简单的过程。End Sub这是一个Sub过程,把光标定位在过程的任意位置,按下F5即可运行。这个过程的执行结果是弹出一个提示对话框,如图8-2 所示。也可以单击菜单【运行】,选择【运行子过程/用户窗体】 或单击工具栏中【运行子过程用户窗体】按钮回来立即运行 光标位置所在的过程。第一行的“Sub”语句与最后一行的“End Sub”语句标志过程的开始和结束。“Sub”后紧跟的“ subPromptMessage”是这个过程的名字。
3、过程名后面的一对小括号是必须的。“Sub”所在行与“End Sub”行之间所有的行就是这个过程的语句。如果要从一个过程返回结果值,就需要定义为一个 Function 过程,通常称为函数。函 数与 Sub 过程的定义形式稍有不同。Function PI() As Single PI = 3.14159End Function“Function ”与“ End Function ”标志函数的开始和结束。在代码的第一行,定义了函数 的返回值PI的数据类型为Single。在函数过程的代码中有赋值语句来赋予这个函数的返回 值。函数过程定义后,就可以在其他过程或者函数中调用该函数返回的结果。例如:Sub
4、functionReturnTest()MsgBox 函数PI()的运行结果是:& PI()End Sub我们可以把这个过程接着再输入到PI()函数的下方,这个过程调用了函数PI(),我们执 行这样的一个过程,可以在提示对话框中看到函数PI()的值为3.14159。我们也可以在立即窗口中输入然后敲回车键,将在立即窗口的下一行输出函数PI()的返回值“3.14159”,通过这种方 式,我们可以快速地检查函数的结果是否正确。VBA自带了大量的函数过程,这些函数可以直接在VBA程序中使用,不需要自己定义。 它们称为内置函数,比如求绝对值函数Abs()。内置函数非常丰富,它分为数学运算函数、 字符串处
5、理函数、日期函数、类型转换函数等几大类。我们不但可以从函数返回一个值,也可以向过程或者函数传入值,我们把它叫做参数 在定义过程时,需要同时定义传入的参数的名称和类型,例如:Sub procInput(strPromptText As String)MsgBox 参数 strPromptText的值是:& strPromptTextEnd Sub在第一行代码的括号中,定义了传入的参数的名称strPromptText和数据类型String。这 样,在过程中就可以通过这个参数的名称使用这个传入过程的参数值。由于在不同场合调用 这个过程的时候,传入的参数实际值是不同的,本例中参数strPromptTe
6、xt实际上是一个可 变的量,这跟数学方程中定义的变量x、y、z有些类似,变量的值不同,可使同一方程得到 不同的结果。定义了参数的过程或者函数,需要由其他过程调用而不能直接运行,因为它需要传入它 所规定的参数值。当然我们也可以在立即窗口中快速执行:procInput 第一个参数在立即窗口输入上述代码,敲回车。这是典型的过程调用方法,“ProcInput”是调用的 过程名,“第一个参数”是传入的参数,这里用英文双引号表示传入的是一个字符串数据 类型数据,与函数定义的参数数据类型必须相匹配。可以同时向过程传入多个参数。如果要传递多个参数给一个过程或函数,注意在每一个 参数定义之间用英文逗号分隔。常量
7、与变量常量有时候也称为常数,它是一个始终保持不变的量,常量值自始至终不能被修改,例 如数值5。定义和使用常量也非常简单,例如:Function CCL(intR As Integer) as SingleConst PI = 2.14 + 1MsgBox 半径为 & intR & 的圆周长是 & intR * PI * 2CCL = intR * PI * 2End Function本例中定义了一个常量PI,可以在该过程中的任意地方使用,它的值始终为数值3.14。 常量的值当然也可以是字符串、日期等其他类型。本例中,英文双引号括起来的“半径为” 和“的圆周长是”这两个字符串以及数值2 也都是常
8、量。注意定义常量时,其值也可一个表达式。如果常量值是一个字符串或者日期,那么需要 用双引号或#号括起来。Const C =字符Const C = #2003/1/1#变量是其值可以被改变的一组存储单元,我们给这一组存储单元起一个好记的名字,并通过名字即变量名来实现对内存单元的存取。在同一范围内,变量的值是惟一的、确定的。我们通过一个例子,来看看如何定义变量、如何给变量赋值,以及如何使用变量。Sub CCL2()Dim intR As IntegerDim sglL As SingleintR = 2sglL = intR * PI() * 2MsgBox 半径为 & intR & 的圆周长是
9、& sglLintR = 5sglL = CCL(intR)MsgBox 半径为 & intR & 的圆周长是 & sglLEnd Sub本例中过程CCL2()用语句Dim定义了两个变量intR和sglL,其数据类型分别是Integer 和 Single。类似这样的两条语句:intR = 2sglL = intR * PT() *2属于前面提到的赋值语句,就是把语句等号右边的表达式的结果存储到表达式左边的变量名代表的内存单元中。这两条语句执行以后,intR和sglL的值分别是2和12.56636,赋 值语句intR =5执行后intR的值被重新设定为5。赋值语句左边变量的数据类型必须和右边 的
10、表达式结果的数据类型相一致,否则程序将出错而无法运行。过程执行结束以后,过程中为变量指定的值会自动被释放而不再存在。注意 VBA 允许不通过声明语句显式定义变量,而在使用变量时自动定义它,看起来这 使变量定义更加灵活,但实际上这是一个非常糟糕的功能。当一个变量被拼写错误的时候程 序会把它当作一个新的变量。强烈建议在每个模块的开始使用Option Explicit语句来强制显式定义变量。(怎么用啊? 给出请参见*部分吧)PI()和CCL()是我们刚才定义的函数,注意由于函数的定义不同,在过程中调用时格式 也会稍有不同。过程CCL2()中虽然只有两条MsgBox语句,但在执行时我们却看到3次提示,
11、这是因 为CCL()函数中也有一条MsgBox语句,当其被执行时出现了第二次的提示。传入到过程的参数也是变量。变量与常量的声明语句往往放在模块后者过程的最开始。 快捷键F8可一步一步的执行过程,我们可以用此来查看过程中各条语句执行的顺序, 调用函数或者子过程的执行顺序。我们在调试程序的时候经常用到F8。数据类型如同字段的数据类型一样,VBA中也为变量和表达式规定了丰富的数据类型:Byte、Boolean、Integer、Long、Single、Double、Currency、Decimal、Date、Object、 String、Variant以及用户自定义类型。不同的数据类型,所占用的存储空
12、间不同,所表示的数据范围也有些差异,一般来说在 能够表达事务的情况下,采用占用存储空间较少的数据类型会使程序运算速度加快。关于数据类型的详细资料,请参阅【Microsoft Visual Basic帮助】的“数据类型概述”1.2.4 续行与注释编写程序时,有时候一条语句会比较长,以至于超过屏幕的宽度,需要左右滚动编辑区 才能把一条语句看完。这给阅读带来了一定的不便。此时我们可以使用续行符“-”来把较长的语句写在多行上,使得程序看起来更加美观 阅读和调试程序也更加方便。如下例所示:Sub ProcInput2(strPromptText As String)MsgBox 参数strPromptT
13、ext勺值是: & strPromptText & vbNewLine _& 数据类型是: & TypeName(strPromptText), _ vbInformation + vbOKOnly, _ 提示End Sub本例中使用续行符号将一条MsgBox语句分成了 4行书写。 注意使用续行符不能把一个独立勺关键字、变量名等拆分到不同勺行。续行符前必须有至少一个空格。 Rem 语句中 Rem 关键字和注释之间也必须有至少一个 空格。我们还可以为程序加上一些注释,来说明这一条语句勺作用,或者函数勺功能、调用方 法、注意事项等,以提高程序勺可读性,方便自己或第三方阅读程序。写入注释通常以英文单
14、引号开头(),接着写注释勺内容,直到一行结束。也可以用 Rem 语句加入注释,Rem语句和其他语句一样必须独占一行,或在一行的结尾使用续行符“_” 写成多行。一般情况下,在 Microsoft Visual Basic 代码编辑器中注释语句内容显示为绿色。图 8-3 所示的程序片段就使用了注释的这几种形式。图 1-3 程序注释实际上,如同前面第二章所讲到的,虽然有没有注释并不影响程序的运行结果,但注释 是程序不可分割的一部分,好的程序同样应该有好的注释。1.2.5 数组数组是一组具有相同数据类型的元素的集合,数组中各元素的存取不影响其他元素,组 成数组的每个元素都可以通过索引进行访问。当需要使
15、用大量的同类型的变量时,定义和使 用数组比逐个定义变量简便。通常我们这样来定义数组:这条语句定义了一个数组,它包含数据类型为Integer的10个元素,从intArray(0)到 intArray(9)。比如我们写一个过程,实现让用户输入三个数字,最后输出这三个数的平均值:Sub AvgValue()Dim sglNum(2) As Single 定义一个数组包含3 个元素Dim sglAvg As Single定义一个变量用来存储平均值 提示用户输入3 次实验数据sglNum(O) = Val(In put Box请输入第1次实验数据:)sglNum(1) = Val(Inpu tBox请输
16、入第2次实验数据:)sglNum(2) = Val(InputBox请输入第3次实验数据:)求出平均结果,存入变量glAvg中 sglAvg = (sglNum(0) + sglNum(1) + sglNum(2) / 3 显示结果MsgBox 3次实验的平均结果是: & sglAvgEnd Sub数组中的元素是通过数组下标来访问的,数组下标默认从0开始。我们也可以自行定义 它的起始下标数值,如下例:Dim intArrayTest(7 To 10) As Integer那么这条声明语句定义了一个类型为Interger的包含4个元素的数组intArrayTest(),这 4 个元素分别是 in
17、tArrayTest (7), intArrayTest(8),intArrayTest(9)和 intArrayTest (10)。上述定义的数组都属于一维数组, VBA 中也可以定义二维和多维数组。一个二维数组 有点类似于一个二维矩阵。比如:Dim intArray(1, 3) As Integer这条声明语句定义了一个2行4列共8个元素,它们分别是:intArray(0,0),intArray(0,1),intArray(0,2),intArray(0, 3)intArray(1,0)intArray(1,1)intArray(1,2)intArray(1, 3)关于数组的详细知识,会在
18、后续的小节示例中陆续讲解。VBA 控制结构本章前面所讲到的示例都是一条一条语句按照顺序执行的,这是顺序结构的程序。在 VBA中还有条件、分支和循环控制流语句。( 1 )条件结构条件结构使用If . Then .Else条件语句实现。比如我们自己编写一个求取整数绝对值 的函数:Function MyAbs(intValue As Integer) As IntegerIf intValue = 0 Then 条件表达式MyAbs = intValue 语句序列1ElseMyAbs = -intValue 语句序列2End IfEnd Function这是一个典型的条件语句结构,“intValue
19、 = 0”是一个条件表达式,其结果是一个逻辑 值,当这个表达式结果为真时,程序执行语句序列1,然后转到End If后面的语句继续执行, 如果表达式结果为假,则程序执行语句序列2,然后转到End If后面的语句继续执行。If语 句的语句序列1与语句序列2在任何时候都只会执行其中之一。在这里当intValue是一个非 负数的时候,MyAbs直接返回intValue的值,否则MyAbs返回intValue取反以后的值。这个函数我们还可以用If语句的另外一种形式来写:Function MyAbs2(intValue As Integer) As IntegerIf intValue = 0 And i
20、ntScore = 60 And intScore = 70 And intScore = 80 And intScore = 100 ThenGetLevel = 优ElseGetLevel = #错误的分数#End IfEnd Function不过我们使用 Select Case 分支语句可使程序更加简洁,表达也比较灵活,同样可以实 现这个功能:Function GetLevel(intScore As Integer) As StringSelect Case后面的表达式逐个与下面ase语句中表达式的相比较, 一旦相匹配,则执行其后的语句序列,然后继续执行d Select后面的语句 Se
21、lect Case intScoreCase 0 To 59 To 表示范围,包含起始两个数据GetLevel = 不及格 语句序列里可以有多条语句Case 60 To 69GetLevel = 及格Case 70 To 79GetLevel = 良 表达式还可以这样用: 80 to 98,100,9,9 只需要满足其中之一 Case 80 To 100GetLevel = 优Case Else子句不是必须的。上面所有条件都不匹配时进入这余分支Case ElseGetLevel = #错误的分数#End SelectEnd Function因为分数从1-100 是连续分数区段,有时候我们也把它
22、写成这样:Function GetLevel3(intScore As Integer) As String Select Case intScoreCase Is 0Case表达式中的Is代表Select Case后面表达式结果GetLevel3 = #错误的分数#Case Is 60GetLevel3 = 不及格Case Is 70GetLevel3 = 及格Case Is 80GetLevel3 = 良Case Is = 100虽然可能存在一个分数,如 intScore =65 时,不但小于 70,同时小于 80,但程序执行 的时候一旦符合一个条件,便执行这个Case分支的语句序列,然后
23、跳转到End Select语句 后面执行,不再与后面Case语句的条件相比较,也不会执行后面Case分支的语句序列。当 然此时Case语句的顺序是很讲究的,不恰当的顺序将导致错误的结果。也正是这个原因,所以我们通常尽量把条件满足机率大一些的表达式安排在靠前一些 减少程序判断的次数,提高程序的运行效率。(3)循环结构 循环结构是一种有意思的结构,跟以前几种结构不同的是,循环结构中的语句将被反复 执行,直到满足某个特定的条件,这对于需要重复执行某些语句序列十分有用。先来看一个 例子,比如我们需要在VBE立即窗口中把50100的数字依次排列出来:Sub PrintDigit()Dim i As In
24、teger 用来控制循环的次数For i = 50 To 100 从50 开始循环到100,总共循环51次 Debug.Print i 在立即窗口中显示当前的值Next每循环一次,循环变量自动加1 _并与100相比较,看是否是否大于100 _ 如果是,则执行Next后面的语句 否则,继续执行循环体内的语句Debug.Print iEnd Sub我们再来写一个求一个正整数的阶乘的函数:Function FuncDemo(intNum As Integer) As IntegerDim intResult As Integer 定义一个变量,用来存储临时的乘积 Dim i As Integer 用
25、来控制循环的次数intResult = 1 为临时变量赋于一个初始值For i = 1 To intNum每次循环,将上一次的乘积结果与相乘,然后再存入到临时变量中, 以备下一次使用,这样循环1 次,得到1 的阶乘,循环2次就得到2的阶乘,循环1次得到n的阶乘 intResult = intResult * iNextFuncDemo = intResult 循环结束以后返回乘积即阶乘End Function在这个函数中我们用到了 ForNext循环控制语句,它是通过一个循环变量来控制循 环的次数的。多数情况下,我们也不会在循环体中改变循环变量的值,因为那样将影响循环 的次数,同时影响程序段的
26、可读性。For.Next循环默认情况下步长为1,即每次循环结束 循环变量自增1。我们可以用Step子句来改变步长,例如我们在立即窗口中显示50100 的偶数,从大到小排列,则只需要用Step子句稍微改动一下即可实现:Sub PrintDigit()Dim i As Integer 用来控制循环的次数For i = 100 To 50 Step -2 从100开始循环到52,总共循环26次Debug.Print i 在立即窗口中显示当前的值Next每循环一次,循环变量自动减2 _并与50 相比较,看是否是否小于50 _ 如果是,则执行Next后面的语句 否则,继续执行循环体内的语句Debug.P
27、rint iEnd Sub可以看出,For.Next的循环在开始循环之前循环次数是确定的。但有时候我们并不能或者不容易确定循环的次数,而要根据特定的条件来判断是否循 环, Do . Loop 循环控制语句就是这样工作的,它不需要循环变量,举例:Sub PrintDigit() 求能被3 整除的100 个偶数Dim i As Integer 用来控制运算,Dim intCount As Integer 计数, 用来控制循环i = 0intCount = 0Do While intCount 100 当不足100 个时循环i = i + 3 依次产生能被3 整除的数If i Mod 2 = 0 T
28、hen判断i是否为偶数,Mod运算符是取余运算 如果是偶数,则在立即窗口中显示出来,并计数。Debug.Print i, intCount = intCount + 1End IfLoopEnd SubDo While 循环会首先判断循环条件表达式值是否为真,如果为真则进入循环,每一次 循环结束判断条件表达式,当其条件不能满足时,退出循环。虽然我们在本例中的循环条件 表达式“intCount intNum判断i 的阶乘是否大于intNum _表达式为真时退出循环FuncB = i - 1 i的阶乘此时刚好大于intNum _i -1 则是我们需要求得的数End Function使用While子
29、句和Until子句的区别在于:While子句是条件不成立时,退出循环;Until 子句是条件成立时,退出循环。While 子句和 Until 子句既可以放在 Do 关键字一行,也可以放在 Loop 关键字一行,其 区别是后者无论如何都会至少执行一次循环体,因为它是先直接进入循环体再判断条件决定 是否继续循环,而前者是先判断条件决定是否循环。While.Wend 语句也是循环控制语句,但它和 Do While. Loop 形式的 Do. Loop 语句 实际上是一样的。如果我们要对数组或者集合中的每一个元素依次进行处理,可以使用For Each . Next 循环控制语句。 For Each .
30、 Next 语句需要有一个 Variant 类型的变量相配合,每次循环会把 数组或集合中的一个元素值赋值给这个变量,在循环体中我们只需要引用这个变量就可以遍 历完数组或集合的每个元素。比如我们写一个过程求出50次实验结果的平均值:Dim sglNum(50 To 99) Dim sglAvg As Single Dim item As VariantDim sglNum(50 To 99) Dim sglAvg As Single Dim item As VariantDim i As IntegerAs Single 定义一个数组包含50 个元素 定义一个变量用来存储平均值用于For Eac
31、h.Next语句用于For.Next语句控制循环 提示用户输入实验数据For i = LBound(sglNum) To UBound(sglNum)sglNum(i) = Val(InputBox 请输入第& i + (1 - LBound(sglNum) & 次 实验数据:)Next 求出平均结果,存入变量glAvg中For Each item In sglNumsglAvg = sglAvg + itemNextsglAvg = sglAvg / (UBound(sglNum) - LBound(sglNum) + 1) 显示结果MsgBox 实验的平均结果是: & sglAvgEnd
32、Sub注意上面的代码中使用LBound函数求出数组的最小下标值,UBound函数求出数组的 最大下标值,所以表达式“UBound(sglNum) - LBound(sglNum) + 1 ”可得出数组sglNum的需要注意的是:这段程序运行时,如果输入一个非数值的字符,比如Ten”,程序将作 为数值 0 进行处理。当数组的个数或者数组的起始下标发生变化时,只需要改动数组的声明语句,而不需要 改动程序的其他语句,这段程序通用性稍强。可以看出,用循环语句处理数组和集合中的元素,程序更简洁。错误捕捉与错误处理程序中语句的正确执行实际上是隐含着一些必要的前提条件,比如要正确完成打开一个 文件这个操作,
33、必须保证这个文件是已经存在的,如果这个文件不存在,那么程序将产生错 误,无法继续执行。比如一个求两个整数之商的函数:Function funcDiv(intA As Integer, intB As Integer) As Single funcDiv = intA / intBEnd Function当我们调用函数funcDiv的时候给除数intB传入了一个0值,那么程序将产生错误,比 如我们在立即窗口输入“? funcDiv(2,0)”,VBE会弹出错误提示对话框如图8-4所示:图 1-4 错误提示对话框对话框中给出了错误的原因,以及这个错误的代码,单击【结束】可结束程序,单击【调 试】可
34、返回到编辑界面,发生的错误语句会处于黄色背景的高亮状态,以便于修正错误,如 图 8-5 所示。图 1-5 错误处理VBA中为我们提供了一种方法可以让程序知道是否有错误发生,发生了什么样的错误, 然后据此来做一些必要的处理。比如提示用户文件不存在而不是直接结束程序让用户感到不 明白;也可以创建一个文件然后再返回接着执行后面的语句。funcDiv = sglResultExit Function 防止未发生错误时执行错误处理程序代码运,退行出过程 err_funcDiv: 标号,错误处理程序入口If Err.Number = 11 Then 利用 Err 对象的 Number 属性确定错误类型Do
35、intB = Val(InputBox 参数intB错误,请重新输入)Loop While intB = 0 sglResult = intA / intB Resume Next 继续执行产生错误的语句之后的代码End IfEnd Function在程序中使用了 InputBox系统函数,InputBox函数可暂停程序,等待用户的输入完成, 并可返回用户输入的字符串。Vai函数可以将字符形式的数字转换成数值,这样与intB的数 据类型相匹配。使用GoTo语句可无条件地转移到过程中指定的行,其后面可以跟任意的行标签或行号。 GoTo只能在过程内跳转,Goto语句可以单独使用,但是太多的GoTo
36、语句,会使程序代码 不容易阅读及调试,一般不单独使用而尽可能使用前面所讲的结构化控制语句。但在VBA 中进行错误处理往往会使用GoTo语句。如果程序没有执行错误处理语句,仍然在出错的代码处挂起等待修正,请参阅本章第三 节第四小节:自定义VBE环境。Err对象是VBA内置的全局对象,专门用于搜集和处理错误,但Err对象只保留了程序 运行时刻最后一次的错误信息。对于致命性的错误,常常在错误处理以后不会用“ Resume Next”返回到错误语句的后面,而有时候程序比较长用到的对象比较多,多处都可能产生同 样的错误,用类似上述的错误处理方法虽然能够知道出错的类型,却不知道究竟是哪里出错, 这不便于我
37、们正确的做出错误处理。这种情况经常使用On Error处理:Function funcDiv2(intA As Integer, intB As Integer) As SingleOn Error Resume Next 产生错误后继续向后执行Dim sglResult As Single sglResult = intA / intBIf Err.Number = 11 Then 检查错误, 并处理DointB = Val(InputBox 参数intB错误,请重新输入) Loop While intB = 0 sglResult = intA / intBEnd If funcDiv2
38、= sglResultEnd Function这样的方式可以在可能产生错误的语句后面马上检查是否有错误发生,并立即做出处 理。On Error语句可以在一个过程中使用多次,而并不象范例中的那样仅用在过程的开头。 如果要禁止当前过程中任何已启动的错误处理程序,则执行一条这种形式的语句:循环嵌套在循环语句的循环体内再包含循环语句,这就是循环的嵌套。内层循环结构的开始和结 束都嵌套在外层循环的循环体之内,语句的嵌套必须是一层一层的,不可以相互交叉,就是 说外层循环结构不会在内层循环体内结束,内层循环也不可能在外层循环结构结束以后才结 束。在处理多维数组时,往往都会用嵌套的循环语句来处理。下面是一个找
39、出二维数组中最 大数值的例子:Sub SeekMax()Dim intArray(1 To 5, 21 To 3 0) As Integer 数组Dim m As Integer 外层循环控制变量Dim n As Integer 内层循环控制变量Dim intResult As Integer 存储结果 为数组随机生成一些1 0 0以内的数值。For m = 1 To 5For n = 21 To 30 intArray(m, n) = Rnd(m + n) * 1OORnd()函数随机产生一个纯小数 Debug.Print intArray(m, n); 在立即窗口中不换行显示NextDeb
40、ug.Print 在立即窗口中换行NextintResult = 0 初始化结果变量For m = 1 To 5For n = 21 To 30 如果比已知的最大数还大,则把这个数存入结果变量If intArray(m, n) intResult Then intResult = intArray(m, n)NextNextDebug.Print 最大数值是: & intResultEnd Sub下面我们以一个给数组排序的过程,来看看两层循环嵌套的使用,本例稍微比上一例的 算法复杂一点:Sub SortArray()Dim intArray(5) As Integer数组Dim i As In
41、teger 外层循环控制变量Dim j As Integer 内层循环控制变量Dim intSwap As Integer 临时变量 为数组随机生成一些100以内的数值。For i = 0 To 5 intArray(i) = Rnd() * 100 Rnd()函数随机产生一个纯小数 Debug.Print intArray(i);NextDebug.Print 在立即窗口中换行 把数组按升序排列For i = 0 To 4注意循环变量i不是以5结束内循环,把int Array(i + 1 至 int Array(5 中 的最小数存入 int Array(i) For j = i + 1 To
42、 5注意循环变量j不是从0或者1开始If intArray(i) intArray(j) Then把intArray(i)与intArray(j的值相互交换 intSwap = intArray(i) 把 intArray(i) 保存到变量 intArray(i) = intArray(j) intArray(j)的值存入 intArray(i) intArray(j) = intSwap 把 intArray (i的原值保存至到LntArray(j) End IfNext j 此处可以直接写成Next,而默认为Next j, _ 因为按照循环嵌套的原则,这里必然是内循环的结_束 但是不能写成
43、Next i,因为这样违反了循环嵌套原则Next i 同上,此处可以直接写成Jext,而不能为Next j 把排列后的数组在立即窗口中显示出来For i = 0 To 5Debug.Print intArray(i);NextEnd Sub该过程实现的原理是:每次把最小的一个数交换到前面。过程如下:第一次执行外循环的循环体后,内循环将intArray(O)与intArray至intArray(5)中的所 有数比较,实现其中最小的一个数与intArray(O)交换位置,此时intArray( 0)是整个数组中最 小的一个数;第二次执行外循环的循环体后,内循环将intArray与intArray(
44、2)至intArray(5)中的所 有数比较,实现其中最小的一个数与intArra y交换位置,此时intArray(l)是整个数组中第 二个最小数。依次比较,到最后,外循环执行完毕,实现了该数组从小到大的顺序排列。本例中最后一组循环是用来显示出排序以后的结果,也可以直接在语句“Next j”之后 加入一行“Debug.Print intArray(i);”而不用这一组循环语句实现相同的效果。虽然增加一组 循环语句看起来使程序稍微冗长,但这样可增强程序可读性。注意循环的嵌套不仅限于两层,外层循环体中内层循环语句的前后根据实际需要还可以 有其他语句序列。在上面的范例中,我们声明的变量(数组也是变
45、量)使用了整型Interger的数据类型, 这仅仅为了举例的方便,但并不代表只有整型Interger的数据才可适合这些结构控制语句。1.2.9 VBA 命名规则VBA 命名也有一定的规则,但它不同于第二章所讲到的命名规则,那是为提高程序的 可读性便于程序的维护与协作开发而制定的,它们可以根据实际情况自行商定。而VBA命 令却是强制性的,如果违反以下规则,程序将产生错误无法运行。为过程、常数、变量以及 参数命名时,都必须遵循以下的规则:第一个字符必须使用英文字母;不能在名称中使用空格、句点()、惊叹号(!)、或、&、$,#等字符; 名称的长度不可以超过255个字符;使用的名称通常不能与Visua
46、l Basic本身的Function过程、语句以及方法的名称相同。 必须退出使用与程序语言的关键字相同的名称。若所使用的内在语言函数、语句或 方法与所指定的名称相冲突,则必须显式地识别它。常规情况下,会将内建函数、 语句或方法的名称之前加上关联的类型库的名称。例如,如果有一个名为 Left 的变 量,则只能用VBA.Left来调用Left函数;不能重复命名。例如,不能在同一过程中声明两个命名为age的变量。然而,可以在 同一模块中声明一个私有的命名为age的变量和过程的级别的命名为age的变量。注意Visual Basic For Application和Visual Basic 一样,也是不
47、区分大小写,但它会在名 称被声明的语句处保留大写。1.2.10 生命周期、可见性一个变量定义后是有一定的生命周期的。在过程运行时,遇到变量申明语句,程序会自 动在内存中分配一段合适的内存空间来存贮这个变量值。过程结束以后,这个过程申明的变 量一般会自动被释放,不再与任何内存单元相关联。也就是说,过程中的变量在这个过程运 行时刻,一直是有效的,在这个过程之外就是无效的。所以在过程中申明的变量,其生命周 期就是从变量的申明到变量所在过程结束。因此,一个过程定义的变量不能在其他过程中使用,各个过程的变量都属于其自己私有的变量。几个过程即使同时定义了相同名称的变量,也互不影响。因为这些变量在不同的过 程中使用不同的内存空间,这是过程级别的变量。而有时候,我们希望能在几个过程中都使用同一个变量,这个变量值在一个过程中被改 变时,其他过程就自动地使用其新值。我们可以在模块中定义私有模块级别的变量来实现私有模块级别的变量必须在模块中所有过程之前声明,私有模块级别的变量在整个模块 中都是可用的,但是
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 和平与发展 当今时代的主题学习资料
- 北京博士后创新实践基地招收博士后制度
- 2025域名注册合同范本专业版范文
- 2025年度户外大型广告牌租赁合同
- 2025年版权转让、版权授权合同及签订指南相关说明
- 畜牧饲料供应合同
- 2024北京东直门中学高一(下)期中数学试题及答案
- 总经理聘用合同书范本
- 旅游管理服务与规划试题
- 工业自动化控制系统故障排除与维护手册
- 【初中 语文】第9课《木兰诗》课件2024-2025学年统编版语文七年级下册
- 吉林省吉林市2024-2025学年高三下学期3月三模试题 数学 含答案
- 2024年上海静安区教育系统招聘考试真题
- 2025年4月自考15040习概押题及答案
- 园林花卉 课件 第三篇1单元 一二年生花卉
- 【初中生物】植物在自然界中的作用 2024-2025学年七年级生物下学期课件(人教版2024)
- 工艺美术品设计师(漆器设计与制作)赛项实施方案
- 高中主题班会 我命由我少年当燃课件-高一下学期开学第一次班会
- 林海雪原考试题和答案
- 综合与实践 低碳生活 教学设计 2024-2025学年人教版七年级数学下册
- 湖南省2024年对口升学考试计算机综合真题试卷
评论
0/150
提交评论