VBA语法基础Word下载.docx
《VBA语法基础Word下载.docx》由会员分享,可在线阅读,更多相关《VBA语法基础Word下载.docx(15页珍藏版)》请在冰点文库上搜索。
可声明定长和变长的String数据类型。
其中,定长的String数据类型占用的存储空间为字符串的长度,取值范围为1——65400个字符,缺省值等于该字符串长度的空格数。
变长的String数据类型能动态地加长或缩短以存储要求的字符串数,占用的存储空间为10字节加上字符串的长度,取值范围为0——20亿个字符,缺省值为零长字符串(“”)。
(有关String数据类型及处理和操作字符串数据的VBA内置函数的详细介绍请见后面的一系列文章。
(12)Variant
Variant字符串类型的存储空间为22字节加上字符串的长度,其取值范围与变长字符串数据类型的取值范围相同,缺省值为Empty。
Variant数字型的存储空间为16字节,其取值范围与Double数据类型的取值范围相同,缺省值为Empty。
(有关Variant数据类型的进一步介绍见后面的一系列文章。
(13)用户自定义类型
允许用户创建一种特殊的数据类型,这种数据类型由VBA的内部数据类型、数组、对象或其他用户定义类型组成,其存储空间为各个组成部分的存储空间的总和,取值范围与各个组成部分的数据类型的取值范围一致,缺省值为各个组成部分的缺省值。
(有关用户自定义类型的进一步介绍请见后面的一系列文章。
各数据类型之间也可以相互转换。
(有关数据类型转换的详细介绍请见后面的一系列文章)
常量(数)
常量即在程序执行过程中不发生改变的值或字符串。
使用Const语句声明常量。
如:
ConstRate=0.25
ConstNumMonthsAsInteger=12
PublicConstmyNameAsString=”BabyPig”
而最后一个语句声明了一个公共常量,应放在模块中所有过程之前声明。
VBA自身包含有许多内置常数,它们的值都是VBA预先定义好的,使用内部常数时无需定义这些常数的值。
■几个特殊的常数
由于有好几种不相同的“无效值”常数,VBA语言提供了好几种方法,以检验某个变量是否为empty或null值,或者设置某个变量为empty或null值。
(1)vbNull
和VarType函数一起使用,用于确定变量是否包含null。
(2)vbNullChar
赋值或检测null字符,null字符的值为Chr(0),即vbNullChar常数相当于将变量赋值为Chr(0),可用于检测变量,确定它的值是否是一个null字符。
(3)vbNullString
赋值或检测零长(空)字符串。
(4)Null关键字
将null值赋给variant变量后,可以通过调用IsNull函数来检测变量是否是Null值。
(5)vbEmpty
检测某个variant变量是否初始化。
(6)Nothing关键字
只能和对象变量一起使用,以确定变量是否具有有效的对象引用,此外,Nothing关键字还可以用于销毁当前的对象引用。
变量
变量的主要作用是存取数据、提供了数据存放信息的容器。
根据变量的作用域不同,可分为局部变量、全局变量,见后面的变量(常量)作用域和生存期介绍。
变量命名要注意以下几点:
1、有效性。
变量以字母开头,中间可以出现数字和一些标点符号,除下划线(_)作为连字符外,变量名称不能有空格、加号(+)、减号(-)、逗号(,)、句点(.)等符号。
2、VBA不区分大小写。
但在变量命名时,最好体现该变量的作用
3、不能使用VBA中的关键字作为变量。
4、变量名称中不能有特殊类型的声明字符(#、$、%、&
或!
)。
5、变量名称最多可以包含254个字符。
声明变量
其语法为:
Dim<
变量名>
As<
数据类型>
或:
Private<
Public<
可以在一行中声明多个变量,每个变量之间用逗号分隔开。
还有一种声明变量的方法是,将一个字符加在变量名称后面,从而声明变量的数据类型。
如
DimMyVar%
表示将变量MyVar声明为整型。
一些类型声明符为:
数据类型
类型声明字符
Integer
%
Long
&
Single
!
Double
#
Currency
@
String
$
在模块前加入OptionExplicit语句,将强制声明所使用的所有变量。
对象变量
在使用对象模型的属性、方法和事件之前,必须创建一个对包含所需属性、方法和事件的类的引用。
可以先声明一个局部对象变量以存储该对象引用,然后把对象引用赋给该局部变量。
声明对象变量的方法和声明其他类型的变量基本上一样。
有三种声明对象变量的方法:
(1)DimmyObjectAs<
库名>
.<
类名>
此方法指向类的类型库,但没有给该变量赋予任何类的实例。
此时,变量myObject被赋值为Nothing。
若要用这种方式引用类,就必须利用“引用”对话框向工程添加一个对类模块的引用。
若要将类的实例引用赋予该变量,必须在使用该变量之前用Set语句赋值。
SetmyObject=<
(2)DimmyObjectAsNew<
此方法将类的新实例引用赋给Object变量。
同样,要用这种方式引用类,必须先利用“引用”对话框向工程添加一个对类模块的引用。
(3)DimmyObjectAsObject
此方法将myObject变量声明为一般的Object数据类型,这在不能预先知道要创建的对象的数据类型时十分有用。
此时,Object变量被赋值为Nothing。
若要将对象引用赋值给该变量,必须使用CreateObject函数或GetObject函数。
可以用Private或Public语句替换Dim语句,且对象变量的作用域规则和其他类型的变量一样。
声明对象变量可以显著地简化代码且加快代码的执行速度。
集合(Collection)对象
集合对象是其他对象的一个容器。
一般有四个方法:
(1)Add方法
添加一项到集合中。
除了可以指定数据外还可以指定键值,通过键值可以访问集合中的成员。
(2)Count方法
返回集合中的项的个数。
(3)Item方法
通过集合中的索引(即集合中项的序号)或键(假设该项添加到集合时指定了)检索集合中的成员。
(4)Remove方法
通过集合中的索引或键删除集合中的成员。
可以使用With…EndWith构造和ForEach…Next构造很方便地处理对象和集合,其介绍可参见ExcelVBA编程系列之对象模型
(2):
初步理解和使用Excel对象模型一文。
运算符
运算符是用于完成操作的一系列符号,包括算术运算符、比较运算符、逻辑运算符、字符串运算符等。
可用于连接一个或多个语言元素,或者完成一些运算以形成一个表达式。
表达式
表达式就是变量、常量、运算符的集合,可分为算术表达式、字符串表达式、赋值表达式、布尔表达式等
数组
数组是一组拥有相同名称同类元素。
定义数组后,即创建了数组。
数组中单个的数据项称为数组元素,用于访问数组元素的编号称为数组索引号,最小索引号和最大索引号称为边界。
在VBA中,根据数组元素是否变化,分为固定大小的数组和动态数组,根据数组的维数又可分为一维数组和多维数组。
1、创建数组
用Dim语句来定义固定大小的数组,即声明一个数组。
DimmyArray(9)AsInteger
上面的代码创建一个名为myArray含有10个数组元素的一维数组。
注意,所有VBA数组的下界均从0开始,因此上面的代码所创建的数组元素从myArray(0)到myArray(9)。
在Dim语句中不指明数组元素的个数来声明动态数组,如
DimmyDynamicArray()AsInteger
使用ReDim关键字重新定义数组的大小:
ReDimmyDynamicArray(10)
也可以用ReDim关键字同时声明一个动态数组并指定该数组的元素个数:
ReDimmyDynamicArray(5)AsInteger
VBA没有限制重新定义动态数组大小的次数,但在重新定义数组大小时,原有的数组数据就会丢失。
如果需要保留原来的数据,可以使用Preserve关键字:
ReDimPreservemyDynamicArray(5)
需要注意的是,如果重新定义数组时减小了数组的大小,则会丢失被缩减了的那部分元素的数据。
当然,与声明变量一样,也可以用Public语句声明公共数组。
2、确定数组的边界
可以使用UBound函数和LBound函数分别获取数组的最大边界和最小边界。
默认情况下,VBA的数组的下界是从0开始的,可以在模块的声明部分使用OptionBase语句来改变模块中数组的起始边界。
OptionBase1
该语句使数组元素的索引号从1开始。
也可以在定义数组时指定数组的上界和下界,如
数组名>
(<
下界>
to<
上界>
)As<
3、多维数组
多维数组可以在每个数组元素中存储一组数据,因此,多维数组的每个数组元素都包含一个数组。
与一维数组相同,可以使用下面的两种方法创建多维数组:
(1)Dim<
数组元素数1>
,<
数组元素数2>
,……)As<
(2)Dim<
(<
与一维数组相似,多维数组也可以是动态的。
4、引用数组中的元素
可以使用数组名称和一个索引号来引用数组中的某个特定的元素。
内置函数
VBA中包含各种内置函数,可以简化计算和操作。
在VBA表达式中使用函数的方式与使用工作表公式中函数的方式相同。
在VBA代码中,也可以使用很多Excel工作表函数,即使用WorksheetFunction对象调用工作表函数。
但是不能使用具有与VBA内置函数功能相同的工作表函数。
基本语句
1、控制程序流程语句
(1)GoTo语句
该语句将执行的程序转到指定的标签所在的语句指令,但不能转移到过程之外的指令。
例如,在进行错误捕捉时,发生错误后,程序转移至标签所在处执行。
(2)If…Then语句
这种类型的语句用于条件判断中,当满足条件时,执行相应的语句;
当条件不满足时,执行其它的操作。
基本语法为:
If<
条件>
Then<
条件满足时的执行语句>
If…Then语句有几种形式分别用于不同的情况:
①当只有一个条件时,可使用下面的结构:
[Else<
条件不满足时的执行语句>
]
其中,Else子句可选。
如果该语句不在同一行中,则应在后面加上EndIf语句,即:
Then
[指令]
EndIf
Else
当条件为真时,执行Then后面的语句并结束If…Then语句的执行,否则执行Else后面的语句或结束If…Then语句的执行。
②当有两个或多个条件时,可使用嵌套的If…Then结构:
ElseIf<
条件1>
[Else]
上面只是两层嵌套,可以根据情况使用多层嵌套。
当条件为真时,执行Then后面的语句并结束If…Then语句的执行,否则判断条件1,当条件1为真时,执行Then后面的语句并结束If…Then语句的执行,否则执行Else后面的指令。
(3)SelectCase语句
当需要作出三种或三种以上的条件判断时,最后使用SelectCase语句。
其基本语法为:
SelectCase<
测试表达式>
[Case
条件表达式1]
条件表达式2]
……
[CaseElse]
EndSelect
当某个条件表达式与测试表达式相匹配时,则执行其后的指令,否则执行Else(如果有的话)后的指令,然后结束SelectCase块的执行。
此外,SelectCase语句还可以嵌套。
(有关程序控制语句的进一步介绍和示例请见后面的一系列文章)
2、循环语句
循环即重复执行某段代码。
在VBA中,有多种可以构成循环的语句结构。
(1)For…Next循环
其语法如下:
For<
计数器=开始数>
To<
结束数>
[step
步长]
[ExitFor]
Next[计数器]
从开始到结束,反复执行For和Next之间的指令块,除非遇到ExitFor语句,将提前跳出循环。
其中,步长和ExitFor语句以及Next后的计数器均为可选项。
For…Next循环中可以再包含For…Next循环,即For…Next循环可以嵌套使用。
(2)DoWhile循环
只有在满足指定的条件时才执行DoWhile循环。
有两种形式:
■第一种形式
Do[While
条件]
[ExitDo]
Loop
当条件满足时执行指令。
■第二种形式
Do
Loop[While
先执行指令,然后再判断条件,如果条件满足则再次执行指令。
其中ExitDo语句表示提前退出指令块。
(3)DoUntil循环
与DoWhile循环一样,也有两种形式;
Do[Until
Loop[Until
执行指令,直到条件满足时退出循环。
(4)While…Wend循环
While<
Wend
当条件满足时,则执行指令。
过程
过程由一组完成所要求操作任务的VBA语句组成。
子过程不返回值,因此,不能作为参数的组成部分。
[Private|Public][Static]Sub<
过程名>
([参数])
[ExitSub]
EndSub
说明:
(1)Private为可选。
如果使用Private声明过程,则该过程只能被同一个模块中的其它过程访问。
(2)Public为可选。
如果使用Public声明过程,则表明该过程可以被工作簿中的所有其它过程访问。
但是如果用在包含OptionPrivateModule语句的模块中,则该过程只能用于所在工程中的其它过程。
(3)Static为可选。
如果使用Static声明过程,则该过程中的所有变量为静态变量,其值将保存。
(4)Sub为必需。
表示过程开始。
(5)<
为必需。
可以使用任意有效的过程名称,其命名规则通常与变量的命名规则相同。
(6)
参数为可选。
代表一系列变量并用逗号分隔,这些变量接受传递到过程中的参数值。
如果没有参数,则为空括号。
(7)ExitSub为可选。
表示在过程结束之前,提前退出过程。
(8)EndSub为必需。
表示过程结束。
如果在类模块中编写子过程并把它声明为Public,它将成为该类的方法。
函数
函数(function)是能完成特定任务的相关语句和表达式的集合。
当函数执行完毕时,它会向调用它的语句返回一个值。
如果不显示指定函数的返回值类型,就返回缺省的数据类型值。
声明函数的语法为:
[Private|Public][Static]Function<
函数名>
([参数])[As
类型]
[函数名=表达式]
[ExitFunction]
EndFunction
如果使用Private声明函数,则该函数只能被同一个模块中的其它过程访问。
如果使用Public声明函数,则表明该函数可以被所有ExcelVBA工程中的所有其它过程访问。
不声明函数过程的作用域时,默认的作用域为Public。
如果使用Static声明函数,则在调用时,该函数过程中的所有变量均保持不变。
(4)Function为必需。
表示函数过程开始。
可以使用任意有效的函数名称,其命名规则与变量的命名规则相同。
代表一系列变量并用逗号分隔,这些变量是传递给函数过程的参数值。
参数必须用括号括起来。
(7)
类型为可选。
指定函数过程返回的数据类型。
(8)ExitFunction为可选。
表示在函数过程结束之前,提前退出过程。
(9)EndFunction为必需。
表示函数过程结束。
通常,在函数过程执行结束前给函数名赋值。
函数可以作为参数的组成部分。
但是,函数只返回一个值,它不能执行与对象有关的动作。
如果在类模块中编写自定义函数并将该函数的作用域声明为Public,这个函数将成为该类的方法。
事件处理过程
要对一个控件事件编写事件处理程序,应先打开窗体的代码窗口并从可用对象的下拉列表中选择所需的控件。
然后,从该控件的可用事件下拉列表中选择所用的事件。
此时,对事件处理程序的定义语句就会自动出现在代码窗口中,就可以直接编写事件处理程序了。
在Excel中,有下面几类事件,即Excel应用程序事件、工作簿事件、工作表事件、图表事件、用户窗体事件等。
类模块
类模块是存放共享变量以及共享代码的存储库。
创建一个类模块,实际上也是在创建一个COM(组件对象模型)接口。
因此,类模块允许通过一个由属性、方法和事件组成的可编程接口向外界描述应用程序,同时保证保留对应用程序的控制权。
也就是说,类模块能够让程序实现“封装”,这样,在其它工程中可以直接使用某类模块而不需要访问源代码。
此外,可以使用类来创建自已的库,如果要使用的话,只需要在任何新的工程中添加一个对该类的引用就行了。
并且,如果要改变程序,只需对类模块改动就行了,而不需要在程序的每个部分都作改动。
属性过程
属性过程(propertyprocedure)是特殊的过程,用于赋予和获取自定义属性的值。
属性过程只能在对象模块如窗体或类模块中使用。
有三种属性过程:
PropertyLet
给属性赋值
PropertyGet
获取属性的值
PropertySet
将对象引用赋给属性引用
调用子过程和函数过程
子过程可以用下面三种方法调用。
第一种使用Call语句:
CallDoSomething(参数1,参数2,……)
如果使用Call语句,就必须用小括号将参数列表括起来。
第二种是直接利用过程名:
DoSomething
参数1,参数2,……
此时,不用在参数列表两边加上括号。
如果不想使用函数的返回值,可以用上述任一种方法调用函数。
否则,可以用函数名作为表达式的组成部分,如
IfGetFunctionResult(parameter)=1Then
如果用函数调用作为表达式的一部分,参数列表必须放在小括号中。
第三种是使用Run方法。
在过程间传递参数
在很多情况下,需要在子过程或函数中调用另一个自定义函数或子过程,这时,在被调用过程中就要用到在调用过程中使用的某个变量。
因此,可把该变量作为参数传递给被调用过程。
不管被调用过程是在同一模块、同一工程中的过程,还是在远程服务器上的类中的一个方法,从一个过程向另一个过程传递变量的原理都是一样的。
被调用过程(而不是调用过程)决定了变量如何从调用过程传递到被调用过程。
1、VBA允许用两种不同的方式在过程和组件之间传递参数。
在子过程或函数的定义部分,可以指定参数列表中的变量的传递方式:
ByRef(按引用)或者ByVal(按值)。
(1)ByRef
这是VBA中在过程间传递变量的默认方法。
ByRef是指按引用传递变量,即传递给被调用过程的是原变量的引用。
因此,如果改变了被调用过程中的变量值,其变化就会反映到调用过程中的那个变量,因为它们实际上是同一个变量。
(2)ByVal
如果使用ByVal关键字传递变量,被调用过程获得的就是该变量的独立副本。
因此,改变被庙用过程中该变量的值不会影响调用过程中该变量原来的值。
2、Optional参数
Optional关键字用来指定某个特定的参数并不一定要传递,即为可选参数。
但是,该参数必须放在最后。
3、ParamArray
使用ParamArray关键字能够使过程按受一组数目可变的参数。
ParamAr