《最新VBA程序设计基础.doc》由会员分享,可在线阅读,更多相关《最新VBA程序设计基础.doc(64页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Four short words sum up what has lifted most successful individuals above the crowd: a little bit more.-author-dateVBA程序设计基础程序设计基础VBA程序设计基础一、算法的概念算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。算法可以使用自然语言、伪代码、流程图等多种不同的方法来描述。(一)算法的特征1、有穷性(Finiteness)算法
2、的有穷性是指算法必须能在执行有限个步骤之后终止2、确切性(Definiteness)算法的每一步骤必须有确切的定义;3、输入项(Input)一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件;4、输出项(Output)一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的;5、可行性(Effectiveness)算法中执行的任何计算步都是可以被分解为基本的可执行的操作步,即每个计算步都可以在有限时间内完成;(也称之为有效性)6、 高效性(High efficiency)执行速度快,占用资源少;7、 健壮性(Robustness
3、)对数据响应正确。(二)算法设计与分析的基本方法1.递推法递推算法是一种用若干步可重复的简运算(规律)来描述复杂问题的方法。2.递归法程序调用自身的编程技巧称为递归( recursion)。3.穷举法穷举法,或称为暴力破解法,是一种针对于密码的破译方法,即将密码进行逐个推算直到找出真正的密码为止。4.贪心算法贪婪算法是一种对某些求最优解问题的更简单、更迅速的设计技术。用贪婪法设计算法的特点是一步一步地进行,常以当前情况为基础根据某个优化测度作最优选择,而不考虑各种可能的整体情况。5.分治法分治法是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题直到最后子问题可以简
4、单的直接求解,原问题的解即子问题的解的合并。6.动态规划法动态规划是一种在数学和计算机科学中使用的,用于求解包含重叠子问题的最优化问题的方法。7.迭代法迭代法也称辗转法,是一种不断用变量的旧值递推新值的过程,跟迭代法相对应的是直接法(或者称为一次解法),即一次性解决问题。8.分枝界限法分支定界法的基本思想是对有约束条件的最优化问题的所有可行解(数目有限)空间进行搜索。(三)典型算法举例求最大公约数的欧几里得辗转相除法1、自然语言描述(1)a b,令r为所得余数(0rb)若 r = 0,算法结束;b 即为答案。(2)互换:置 ab,br,并返回第一步。2、流程图3、程序示例INPUT m,nDO
5、r=m MOD nm=nn=rLOOP UNTIL r=0PRINT mEND二、程序的三种基本结构(一)顺序结构程序语句按照编写的顺序自顶向下逐句执行,称为顺序结构,这是程序最基本的结构。常见的顺序结构语句如赋值语句。示例:A=5B=10(二)选择结构选择结构也叫分支结构,选择结构根据某个条件是否成立决定下一步执行的语句或语句块。常见的选择语句有IfThenEnd If和Select CaseEnd Select两组。1、IfThenEnd If语句格式:If Then语句块 1Else语句块 2End If举例:If ZongFen=60 ThenMsgBox “及格”ElseMsgBox
6、 “不及格”End If2、Select CaseEnd Select语句格式:Select Case Case 语句块 1Case 语句块 2Case Else语句块 nEnd Select举例:M=Month(Date()Select Case MCase 3 To 5MsgBox “春季”Case 6 To 8MsgBox “夏季”Case 9 To 11MsgBox “秋季”Case 12 To 2MsgBox “冬季”End Select(三)循环结构循环结构分为“当型循环”和“直到型循环”两种。前者是当条件满足时执行循环体内的语句,后者是进入循环体直到条件不满足时退出。VBA提供三
7、类循环结构,即Do WhileLoop、ForNext和WhileWend。1、Do WhileLoop循环这是VBA中最基本的循环语句,当条件表达式为真时,重复执行循环体内的语句。格式:Do While 语句序列1Exit Do语句序列 2Loop举例:I=0N=10S=0Do While I=NS=S+II=I+1Loop2、DoLoop While循环当要求循环体至少执行一次才能结束循环,此时,可以使用DoLoop While循环。格式:Do语句序列 1Exit Do语句序列 2Loop While 举例:S=0N=me.text1.valueIf N0 thenEndEnd IfDoS
8、=S+NLoop While S=10003、Do UntilLoop循环当条件表达式不满足时,重复执行循环体内的语句。与Do WhileLoop意义相反。格式:Do Until 语句序列 1Exit Do语句序列 2Loop4、DoLoop Until循环执行一次循环体内的语句,然后判断条件是否成立,当条件不成立时继续执行循环体,条件满足则退出。格式:Do语句序列 1Exit Do语句序列 2Loop Until (四)程序实例1、编程:任意输入两个数据,判断较大数,并显示出来。2、编程:计算水费,如果用户月用水量在7方以下,则按每方1.4元计算,否则,超出部分按每方1.9元计算。3、编程:
9、输入一个年份,判断它是平年还是闰年。4、编程:输入三个数,找出它们中的最大数和最小数。(或者按序排列输出)5、编程:输入10个同学的成绩,判断他们成绩的等级。(及格:60-70,中等:71-80,良好:81-95,优秀:95以上)6、编程:计算1+2+3+100的和。7、编程:计算1+3+5+99的和。8、编程:计算1-2+3-4+5-+99-100的结果。9、编程:求一元二次方程ax2+bx+c=0的根。10、编程:找出1000以内的“水仙花数”。(水仙花数是一个三位数,它的各位上的数字的立方和,恰好等于它本身。如153,13+53+33=1+125+27=153)11、编程:找出1000以
10、内的“同构数”。(同构数的特点是平方后得到的数的末尾和自身相同。如25,252=625)12、编程:找出1000以内的素数。13、编程:用辗转相除法求任意两个数的最大公约数和最小公倍数。14、编程:求6!15、编程:求1!+2!+3!+6!16、编程:找出10000以内的“四朵金花”。四朵金花是一个四位数,它没一位的四次方和等于它本身,如1634。三、常量、变量的声明和作用域1、常量常量是指在程序运行的过程中,其值不能被改变的量。如12,-5,3+2,2.1E+5,等。常量有直接常量、符号常量(用Const语句声明)、固有常量、系统定义常量(如True、vbRed)等。声明常量可以使用Cons
11、t语句,其语法如下:Public | Private Const constname As type = expression如:Const PI as Single=3.1415926参数说明如下:Public可选的。该关键字用于在模块级别中声明在所有模块中对所有过程都可以使用的常数。在过程中不能使用。Private可选的。该关键字用于在模块级声明只能在包含该声明的模块中使用的常数。不能在过程中使用。constname必需的。常数的名称;遵循标准的变量命名约定type可选的。常数的数据类型;可以是 Byte、 Boolean 、Integer、Long、Currency、Single、Dou
12、ble、Date、String 或 Variantexpression必需的。文字,其它常数,或由除 Is 之外的任意的算术操作符和逻辑操作符所构成的任意组合。2、变量和数组变量是指在程序运行的过程中,其值会因程序的需要而改变的量。变量实际上是一个符号地址,它代表了命名的存储位置,包含在程序执行阶段修改的数据。每个变量都有变量名,在其作用域范围内可唯一识别。使用前可以指定数据类型(即采用显式声明),也可以不指定(即采用隐式声明)。变量命名规则:变量名必须以字母字符开头,在同一范围内必须是唯一的,不能超过255个字符,而且中间不能包含句点或类型声明字符。不要与关键字同名。声明变量:虽然在程序设计
13、中,允许使用隐式声明,但是良好的编程习惯要求在程序的前几行对所有的变量进行声明。声明变量常用的语句是Dim和DefType(模块级)语句。强制变量声明可以使用Option Explicit语句。1、Dim语句格式如下:Dim 变量名As 数据类型2、可以使用Dim语句在一行声明多个变量。如:Dim IntX,IntY,StrA as String变量的数据类型:数据类型说明Boolean布尔型Byte字节Integer整型Long长整型Currency货币Single单精度Double双精度Data日期/时间String字符串Object对象Variant变体型VBA中的类型说明符号有%(In
14、teger)、&(Long)、!(Single)、#(Double)、$(String)和(Currency)。类型说明符号使用时是作为变量名的一部分,放在变量名的最后一个字符。用户自定义类型的声明:用户自定义类型的声明使用TypeEnd Type语句,其格式如下:Type As As End Type举例:Type StuType StuName As String*l0 定义字符串变量存储一个名字。 StuBirthDate As Date 定义日期变量存储一个生日。 StuSex As Integer 定义整型变量存储性别End Type (0 为女,1 为男)使用:Dim Ud as
15、StuTypeUd. StuName =XyzUd. StuBirthDate =75/12/17Ud. StuSex = 1变量的作用域:变量常用的作用域有Local(局部级)、Private(私有,窗体级,模块级)或Public(全局级)。本地变量:仅在声明变量的过程中有效。在过程和函数内部所声明的变量,不管是否使用Dim语句,都是本地变量。本地变量具有在本地使用的最高优先级,即当存在与本地变量同名的模块级的私有或公共变量时,模块级的变量则被屏蔽;私有变量:在所声明的模块中的所有函数和过程都有效。私有变量必须在模块的通用声明部分使用“Private变量名As数据类型”进行声明;公共变量:在
16、所有模块的所有过程和函数都可以使用。在模块通用声明中使用“Public变量名As数据类型”声明公共变量。数组变量:数组是由一组具有相同数据类型的变量(称为数组元素)构成的集合。(1)数组的声明在VBA中不允许隐式说明数组,用户可用Dim语句来声明数组,声明方式为:Dim 数组名(数组下标上界) As 数据类型如:Dim intArray(l0) As Integer这条语句声明了一个有11个元素的数组,每个数组元素为一个整型变量。这是只指定数组元素下标上界来定义数组。可以使用Option Base来指定数组的默认下标下界是0或l。默认情况下,数组下标下界为0。(2)数组的使用数组声明后,数组中
17、的每个元素都可以当作单个的变量来使用,其使用方法同相同类型的普通变量。其元素引用格式为:数组名(下标值表)其中:如果该数组为一维数组,则下标值表为一个范围为数组下标下界,数组下标上界的整数;如果该数组为多维数组,则下标值表为一个由多个(不大于数组维数)用逗号分开的整数序列,每个整数(范围为数组该维下标下界,数组该维下标上界)表示对应的下标值。例如可以如下引用前面定义的数组:intAma(2) 引用一数组intAma的第3个元素。intArray (0,0) 引用二数组intArray的第1行第1个元素。例如,若要存储一年中每天的支出,可以声明一个具有365个元素的数组变量,而不是365个变量。
18、数组中的每一个元素都包含一个值。下列的语句声明数组curExpense具有365个元素。按照缺省规定,数组的索引是从零开始,所以此数组的上标界是364而不是365。Dim curExpense(364) As Currency若要设置某个元素的值,必须指定该元素的索引(即下标值表)。下面的示例对于数组中的每个元素都赋予一个初始值20。Sub F () Dim C(364) As Currency Dim I As Integer For I = 0 to 364 C(intI) = 20 NextEnd Sub四、运算符和表达式1、算术运算符与算术表达式算术运算符是常用的运算符,用来执行简单的
19、算术运算。VBA提供了8个算术运算符,表6-7列出了这些算术运算符。运算符含义举例+加法运算3+2,结果为5-减法运算15-2,结果为13*乘法运算2*3,结果为6/浮点除运算5/2,结果为2.5整除运算52,结果为2指数运算32,结果为9Mod取模运算5 Mod 2,结果为1-取负运算-(5 Mod 2),结果为-1在8个算术运算符中,除取负(-)是单目运算符外,其它均为双目运算符。单目运算符只需要一个运算数,双目运算符需要两个运算数。2、字符表达式和连接符在VBA中,字符采用英文半角的双引号或单引号作定界符,如“123”,此处的“123”不能参与数学运算。字符连接符有两个,+和号&号,用&
20、比用+号安全。举例如下:A$=“My”B$=“Home”C$=A$+B$变量C$的结果为“MyHome”。3、关系运算符、逻辑运算符和逻辑表达式关系运算符也称比较运算符,用来对两个表达式的值进行比较,比较的结果是一个逻辑值,即真(True)或假(False)。用关系运算符连接两个算术表达式所组成的表达式叫做关系表达式。VBA提供了6个关系运算符,如下:运算符作用举例结果=相等3=2False或不相等3+24True小于10大于23False=小于或等于3=大于或等于2=5False逻辑运算也称布尔运算,由逻辑运算符连接两个或多个关系式,组成一个布尔表达式。常用的逻辑运算符有4个,如下:运算符含
21、义举例Not取反,由真变假,或由假变真And与运算,两个表达式为真,则结果为真,否则为假Or或运算,两个表达式中有一个为真,则结果为真,否则为假Xor异或运算,两个表达式4、对象运算符与对象运算表达式对象运算表达式中使用 ! 和. 两种运算符,使用对象运算符指示随后将出现的项目类型。!运算符!运算符的作用是指出随后为用户定义的内容。使用 ! 运算符可以引用一个开启的窗体、报表或开启窗体或报表上的控件。表9-7列出了3种引用方式。. (点) 运算符. (点) 运算符通常指出随后为 Microsoft Access 定义的内容。例如,使用 . (点)运算符可引用窗体、报表或控件等对象的属性。举例:
22、Reports!发货单!货主.Visible5、运算符的优先级(1)=、或的优先级别相同,、=、=优先级别也相同,前两种关系运算符的优先级别低于后四种关系运算符。(2)关系运算符的优先级低于算术运算符。(3)关系运算符的优先级高于赋值运算符(=)。五、函数1、数学函数函数功能举例函数值Abs(N)求N的绝对值Abs(-3)3Cos(N)求N的余弦Cos(45*3.14/180)0.707Exp(N)E指数Exp(2)7.389Int(N)返回参数的整数部分Int(123.456)123Log(N)自然对数Log(2.732)1Rnd(N)返回一个01之间的随机数Rnd()01之间的随机数Sgn
23、(N)返回一个数的性质符号或0Sgn(-5)-1Sin(N)求N的正弦Sin(45*3.14/180)0.7068Sqr(N)求N的算术平方根Sqr(25)5Tan(N)求N的正切Tan(45*3.14/180)0.99922、字符函数函数功能举例函数值InStr(C1,C2)返回C2在C1中的位置InStr(“ABCDE”,“DE”)4LCase$(C)将C中的字母转换成小写LCase$(“ABcdE”)“abcde”Left($C,N)返回C中左边的N个字符Left(“ABCDE”,3)“ABC”Len($C)返回字符C的长度Len(“ABCDE”)5LTrim$(C)去掉前导空格LTri
24、m$(“A”+“A”)“AA”Mid$($C,M,N)从第M个字符起,取出C中的N个字符Mid$(“ABCDE”,2,2)“BC”Right$($C,N)返回C中右边的N个字符Right$(“ABCDE”,3)“CDE”RTrim$(C)去掉后置空格RTrim$(“A”+“A”)“AA”Space$(N)产生N个空格字符Space$(3)Trim$()去掉前导和后置空格Trim$(“A”+“A”)“AA”UCase$(C)将C中字母转换为大写UCase$(“ABcde”)“ABCDE”3、日期时间函数函数功能Date或Date()返回当前系统日期(包含年月日),日期型Year(Date)返回指
25、定日期的年份部分,数值型Month(Date)返回指定日期的月份部分,数值型Day(Date)返回指定日期的天数部分,数值型Hours(Time)返回指定时间的小时部分,数值型Minutes(Time)返回指定时间的分钟部分,数值型Second(Time)返回指定时间的秒数部分,数值型Time或Time()返回当前时间(包含时分秒)Now返回当前的日期和时间WeekDay()返回当前的星期4、转换函数函数功能例子函数Asc(C)返回C中第一个字符的ASCII码,数值型Asc(“ABC”)65Chr(N)返回ASCII码对应的字符Chr(97)“a”Str(N)将N转成C类型Str(1000)“
26、1000”Val(C)将C转成N类型Val(“123.5”)123.5六、数据类型数据类型类型符号占用字节取值范围整型(Integer)%2-3276832767长整型(Long)&4(不要求)单精度型(Single)!4(不要求)双精度型(Double)#8(不要求)字符型(String)$不定065400货币型(Currency)8(不要求)日期型(Date)无8100-01-019999-12-31布尔型(Boolean)无2True或False对象型(Object)无4任何引用的对象变体型(Variant)无不定由最终的数据类型而定字节型(Byte)无10255七、常用关键字举例关键字
27、,又称为保留字,是指VBA中具有特殊意义的符号。这些关键字具有固定的含义,用户不能更改其拼写方式,在对过程、变量等命名时,不允许使用与关键字相同的拼写。VBA中有许多关键字,可以分为数组、编译命令、控制流、变换、数据类型、日期与时间、目录和文件、错误信息等多种。常见关键字举例如下:AbsArrayAscBooleanBytesCallCaseChrConstDateDayDirDoDoubleElseEndExitForFunctionIfLoopMeNotPrivateRandomizeSelectSpaceThenWhileXor*八、MsgBox()函数常量的对应值和返回值1、作用:在对
28、话框中显示消息,等待用户单击按钮,并返回一个Integer值,告诉用户单击哪一个按钮。2、语法:Msgbox(Prompt,Buttons,Title,HelpFile,Context)3、参数说明:Prompt必需的。字符串表达式,作为对话框中的消息,最大长度1024个字符。内容超过一行,可以用回车符Chr(13)和换行符Chr(10)实现分行显示。Buttons可选的。缺省为0,数值表达式是值的总和,包含按钮的数目和形式,图标样式,缺省按钮等。Title可选的。指定对话框的标题栏文字。HelpFile可选的。指定向对话框提供上下文相关帮助的帮助文件。提供了HelpFile则必须使用Cont
29、ext。Context可选的。数值表达式,指定帮助主题的上下文编号。常见Buttons参数的常量和对应值常量对应值说明vbOKOnly0只显示“确定”按钮vbOKCancel1显示“确定”和“取消”按钮vbAbortRetryIgnore2显示“终止”、“重试”和“忽略”按钮vbYesNoCancel3显示“是”、“否”和“取消”按钮vbYesNo4显示“是”和“否”按钮vbRetryCancel5显示“重试”和“取消”按钮vbCritical16显示警告图标vbQuestion32显示问号图标vbInformation64显示感叹号图标vbDefaultButton10第一个按钮是默认按钮(缺省设置)vbDefaultButton2256第二个按钮是默认按钮(其余自学)MsgBox函数返回值的常量常数值说明vbOK1确定vbCancel2取消vbAbort3终止vbRetry4重试vbIgnore5忽略vbYes6是vbNo7否举例:(1)m=MsgBox(“是否保存对本文档的修改?”,vbQuestion+vbYesNoCancel,”询问”)(2)等效于:m=MsgBox(“是否保存对本文档的修改?”,35,”询问”)(3)If MsgBox(“继续吗?”,vbYesNo,”询问”)vbYes Then Exit Sub-
限制150内