1.1 VBA语法基础
分类:ExcelVBA>>VBA语法>>语法框架
数据类型
“数据类型”是指如何将数据存储在内存中。
(1)Boolean
表示逻辑数据,可以是True或False中的任一个值。占用2字节的存储空间,取值范围为True或False,缺省值为False。
(2)Byte
只能表示正数。占用1字节的存储空间,取值范围为0-255,缺省值为0。
(3)Currency
一种保存货币值数据的特殊数字格式。占用8字节的存储空间,取值范围为-922337203685477.5808-922337203685477.5807,缺省值为0。
(4)Date
一种用于表示日期或时间的专用格式。占用8字节的存储空间,取值范围为100年1月1日——9999年12月31日,缺省值为00:00:00。(有关在VBA中使用日期和时
间的详细介绍请见后面的一系列文章。)
(5)Decimal
一种包含以10的幂为刻度的十进制数的变体子类型,只能通过CDec转换函数创建,不是一种独立的数据类型。占用14字节的存储空间,取值范围为±79228162514264337593543950335(
不
带
小
数
点
)
或
±7.9228162514264337593543950335(带28位小数点),缺省值为0。
(Decimal数据类型是在Excel 2000中引入的,在以前的版本中不能使用这种数据类型。该数据类型非常特殊,因为不能实际声明它,它是Variant的子类型,必须使用CDec函数将一个变量转换为Decimal数据类型)
(6)Double
存储双精度浮点数,占用8字节的存储空间,取值范围为负值:-1.79769313486232E308——4.94065645841247E-324
,
正
值
:
1.79769313486232E308——4.94065645841247E-324,缺省值为0。
(7)Integer
表示从-32768-32767之间的整数,其中一位表示符号,占用2字节的存储空间,缺省值为0。
(8)Long
表示存储为4个字节空间的带符号的数,其中一位表示符号,取值范围为-2147483648-2147483647,缺省值为0。
(9)Object
包含对某个对象的引用(地址),占用4字节的存储空间,可对任何对象引用,缺省值为Nothing。
(10)Single
表示分数、带小数位或指数的数值等单精度数,占用4字节的存储空间,取值范围为负值:-3.402823E38——1.401298E-45,正值:1.401298E-45——3.402823E38,缺省值为0。
(11)String
可声明定长和变长的String数据类型。其中,定长的String数据类型占用的存储空间为字符串的长度,取值范围为1——65400个字符,缺省值等于该字符串长度的空格数。变长的String数据类型能动态地加长或缩短以存储要求的字符串数,占用的存储空间为10字节加上字符串的长度,取值范围为0——20亿个字符,缺省值为零长字符串(“”)。(有关String数据类型及处理和操作字符串数据的VBA内置函数的详细介绍请见后面的一系列文章。)
(12)Variant
Variant字符串类型的存储空间为22字节加上字符串的长度,其取值范围与变长字符
串数据类型的取值范围相同,缺省值为Empty。
Variant数字型的存储空间为16字节,其取值范围与Double数据类型的取值范围相同,缺省值为Empty。
(有关Variant数据类型的进一步介绍见后面的一系列文章。)
(13)用户自定义类型
允许用户创建一种特殊的数据类型,这种数据类型由VBA的内部数据类型、数组、对象或其他用户定义类型组成,其存储空间为各个组成部分的存储空间的总和,取值范围与各个组成部分的数据类型的取值范围一致,缺省值为各个组成部分的缺省值。(有关用户自定义类型的进一步介绍请见后面的一系列文章。)
各数据类型之间也可以相互转换。(有关数据类型转换的详细介绍请见后面的一系列文章)
(有关数字数据类型(Byte、Integer、Long、Single、Double、Currency、Decimal、Variant)及相应的VBA内置函数的详细介绍请见后面的一系列文章。)
常量(数)
常量即在程序执行过程中不发生改变的值或字符串。
使用Const语句声明常量。如:
Const Rate=0.25
Const NumMonths As Integer=12
Public Const myName As String=”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关键字还可以用于销毁当前的对象引用。
(关于常量的介绍还可见《ExcelVBA编程系列之数据类型(1):常量》)
变量
变量的主要作用是存取数据、提供了数据存放信息的容器。根据变量的作用域不同,可分为局部变量、全局变量,见后面的变量(常量)作用域和生存期介绍。
变量命名要注意以下几点:
1、有效性。变量以字母开头,中间可以出现数字和一些标点符号,除下划线( _ )作为连字符外,变量名称不能有空格、加号(+)、减号(-)、逗号(,)、句点(.)等符号。
2、VBA不区分大小写。但在变量命名时,最好体现该变量的作用
3、不能使用VBA中的关键字作为变量。
4、变量名称中不能有特殊类型的声明字符(#、$、%、&或!)。
5、变量名称最多可以包含254个字符。
(有关VBA的命名规则的详细介绍请见后面的一系列文章)
声明变量
其语法为:
Dim <变量名> As <数据类型>
或:Private <变量名> As <数据类型>
或:Public <变量名> As <数据类型>
可以在一行中声明多个变量,每个变量之间用逗号分隔开。
还有一种声明变量的方法是,将一个字符加在变量名称后面,从而声明变量的数据类型。如
Dim MyVar%
表示将变量MyVar声明为整型。一些类型声明符为:
数据类型 类型声明字符
Integer %
Long &
Single !
Double #
Currency @
String $
在模块前加入Option Explicit语句,将强制声明所使用的所有变量。
对象变量
在使用对象模型的属性、方法和事件之前,必须创建一个对包含所需属性、方法和事件的类的引用。可以先声明一个局部对象变量以存储该对象引用,然后把对象引用赋给该局部变量。
声明对象变量的方法和声明其他类型的变量基本上一样。有三种声明对象变量的方法:
(1) Dim myObject As <库名>.<类名>
此方法指向类的类型库,但没有给该变量赋予任何类的实例。此时,变量myObject被赋值为Nothing。若要用这种方式引用类,就必须利用“引用”对话框向工程添加一个对类模块的引用。若要将类的实例引用赋予该变量,必须在使用该变量之前用Set语句赋值。如:
Set myObject=<库名>.<类名>
(2) Dim myObject As New <库名>.<类名>
此方法将类的新实例引用赋给Object变量。同样,要用这种方式引用类,必须先利用“引用”对话框向工程添加一个对类模块的引用。
(3) Dim myObject As Object
此方法将myObject变量声明为一般的Object数据类型,这在不能预先知道要创建的对象的数据类型时十分有用。此时,Object变量被赋值为Nothing。若要将对象引用赋值给该变量,必须使用CreateObject函数或GetObject函数。
可以用Private或Public语句替换Dim语句,且对象变量的作用域规则和其他类型的变量一样。
声明对象变量可以显著地简化代码且加快代码的执行速度。
有关对象模型的基础知识见ExcelVBA编程系列之对象模型(2):初步理解和使用Excel
对象模型一文。
集合(Collection)对象
集合对象是其他对象的一个容器。
一般有四个方法:
(1) Add方法
添加一项到集合中。除了可以指定数据外还可以指定键值,通过键值可以访问集合中的成员。
(2) Count方法
返回集合中的项的个数。
(3) Item方法
通过集合中的索引(即集合中项的序号)或键(假设该项添加到集合时指定了)检索集合中的成员。
(4) Remove方法
通过集合中的索引或键删除集合中的成员。
可以使用With…End With构造和For Each … Next构造很方便地处理对象和集合,其介绍可参见ExcelVBA编程系列之对象模型(2):初步理解和使用Excel对象模型一文。
运算符
运算符是用于完成操作的一系列符号,包括算术运算符、比较运算符、逻辑运算符、字符串运算符等。可用于连接一个或多个语言元素,或者完成一些运算以形成一个表达式。
表达式
表达式就是变量、常量、运算符的集合,可分为算术表达式、字符串表达式、赋值表达式、布尔表达式等
详细的内容请见VBA编程系列:运算符和表达式。
数组
数组是一组拥有相同名称同类元素。定义数组后,即创建了数组。数组中单个的数据项称为数组元素,用于访问数组元素的编号称为数组索引号,最小索引号和最大索引号称为边界。
在VBA中,根据数组元素是否变化,分为固定大小的数组和动态数组,根据数组的维数又可分为一维数组和多维数组。
1、创建数组
用Dim语句来定义固定大小的数组,即声明一个数组。如
Dim myArray(9) As Integer
上面的代码创建一个名为myArray含有10个数组元素的一维数组。注意,所有VBA数组的下界均从0开始,因此上面的代码所创建的数组元素从myArray(0)到myArray(9)。
在Dim语句中不指明数组元素的个数来声明动态数组,如
Dim myDynamicArray() As Integer
使用ReDim关键字重新定义数组的大小:
ReDim myDynamicArray(10)
也可以用ReDim关键字同时声明一个动态数组并指定该数组的元素个数:
ReDim myDynamicArray(5) As Integer
VBA没有限制重新定义动态数组大小的次数,但在重新定义数组大小时,原有的数组数据就会丢失。如果需要保留原来的数据,可以使用Preserve关键字:
ReDim Preserve myDynamicArray(5)
需要注意的是,如果重新定义数组时减小了数组的大小,则会丢失被缩减了的那部分元素的数据。
当然,与声明变量一样,也可以用Public语句声明公共数组。
2、确定数组的边界
可以使用UBound函数和LBound函数分别获取数组的最大边界和最小边界。
默认情况下,VBA的数组的下界是从0开始的,可以在模块的声明部分使用Option Base语句来改变模块中数组的起始边界。如
Option Base 1
该语句使数组元素的索引号从1开始。
也可以在定义数组时指定数组的上界和下界,如
Dim <数组名> (<下界> to <上界>) As <数据类型>
3、多维数组
多维数组可以在每个数组元素中存储一组数据,因此,多维数组的每个数组元素都包含一个数组。与一维数组相同,可以使用下面的两种方法创建多维数组:
(1)Dim <数组名> (<数组元素数1>,<数组元素数2>,……) As <数据类型>
(2)Dim <数组名>(<下界> to <上界>,<下界> to <上界>,……) As <数据类型>
与一维数组相似,多维数组也可以是动态的。
4、引用数组中的元素
可以使用数组名称和一个索引号来引用数组中的某个特定的元素。
(有关数组的进一步介绍及其应用请见后面的一系列文章)
内置函数
VBA中包含各种内置函数,可以简化计算和操作。在VBA表达式中使用函数的方式与使用工作表公式中函数的方式相同。
在VBA代码中,也可以使用很多Excel工作表函数,即使用WorksheetFunction对象调用工作表函数。但是不能使用具有与VBA内置函数功能相同的工作表函数。
(有关内置函数的进一步介绍及应用请见后面的一系列文章)
基本语句
1、控制程序流程语句
(1) GoTo语句
该语句将执行的程序转到指定的标签所在的语句指令,但不能转移到过程之外的指令。例如,在进行错误捕捉时,发生错误后,程序转移至标签所在处执行。
(2) If…Then语句
这种类型的语句用于条件判断中,当满足条件时,执行相应的语句;当条件不满足时,执行其它的操作。
基本语法为:
If <条件> Then <条件满足时的执行语句>
If … Then语句有几种形式分别用于不同的情况:
①当只有一个条件时,可使用下面的结构:
If <条件> Then <条件满足时的执行语句> [Else <条件不满足时的执行语句>]
其中,Else子句可选。如果该语句不在同一行中,则应在后面加上End If语句,即:
If <条件> Then
[指令]
End If
或:
If <条件> Then
[指令]
Else
[指令]
End If
当条件为真时,执行Then后面的语句并结束If…Then语句的执行,否则执行Else后面的语句或结束If…Then语句的执行。
②当有两个或多个条件时,可使用嵌套的If … Then 结构:
If <条件> Then
[指令]
ElseIf <条件1> Then
[指令]
[Else]
[指令]
End If
上面只是两层嵌套,可以根据情况使用多层嵌套。当条件为真时,执行Then后面的语句并结束If…Then语句的执行,否则判断条件1,当条件1为真时,执行Then后面的语句并结束If…Then语句的执行,否则执行Else后面的指令。
(3) Select Case语句
当需要作出三种或三种以上的条件判断时,最后使用Select Case语句。其基本语法为:
Select Case <测试表达式>
[Case 条件表达式1]
[指令]
[Case 条件表达式2]
[指令]
……
[Case Else]
[指令]
End Select
当某个条件表达式与测试表达式相匹配时,则执行其后的指令,否则执行Else(如果有的话)后的指令,然后结束Select Case块的执行。
此外,Select Case语句还可以嵌套。
(有关程序控制语句的进一步介绍和示例请见后面的一系列文章)
2、循环语句
循环即重复执行某段代码。在VBA中,有多种可以构成循环的语句结构。
(1) For … Next 循环
其语法如下:
For <计数器=开始数> To <结束数> [step 步长]
[指令]
[Exit For]
[指令]
Next [计数器]
从开始到结束,反复执行For和Next之间的指令块,除非遇到Exit For语句,将提
前跳出循环。其中,步长和Exit For语句以及Next后的计数器均为可选项。
For…Next循环中可以再包含For…Next循环,即For…Next循环可以嵌套使用。
(2) Do While循环
只有在满足指定的条件时才执行Do While循环。有两种形式:
■ 第一种形式
Do [While 条件]
[指令]
[Exit Do]
[指令]
Loop
当条件满足时执行指令。
■ 第二种形式
Do
[指令]
[Exit Do]
[指令]
Loop [While 条件]
先执行指令,然后再判断条件,如果条件满足则再次执行指令。
其中Exit Do语句表示提前退出指令块。
(3) Do Until循环
与Do While循环一样,也有两种形式;
■ 第一种形式
Do [Until 条件]
[指令]
[Exit Do]
[指令]
Loop
■ 第二种形式
Do
[指令]
[Exit Do]
[指令]
Loop [Until 条件]
执行指令,直到条件满足时退出循环。
(4) While … Wend循环
其语法为:
While <条件>
[指令]
Wend
当条件满足时,则执行指令。
(有关循环语句的进一步介绍和示例请见后面的一系列文章)
过程
过程由一组完成所要求操作任务的VBA语句组成。子过程不返回值,因此,不能作为参数的组成部分。
其语法为:
[Private|Public] [Static] Sub <过程名> ([参数])
[指令]
[Exit Sub]
[指令]
End Sub
说明:
(1) Private为可选。如果使用Private声明过程,则该过程只能被同一个模块中的其它过程访问。
(2) Public为可选。如果使用Public声明过程,则表明该过程可以被工作簿中的所有其它过程访问。但是如果用在包含Option Private Module语句的模块中,则该过程只能用于所在工程中的其它过程。
(3) Static为可选。如果使用Static声明过程,则该过程中的所有变量为静态变量,其值将保存。
(4) Sub为必需。表示过程开始。
(5) <过程名>为必需。可以使用任意有效的过程名称,其命名规则通常与变量的命名规则相同。
(6) 参数为可选。代表一系列变量并用逗号分隔,这些变量接受传递到过程中的参数值。如果没有参数,则为空括号。
(7) Exit Sub为可选。表示在过程结束之前,提前退出过程。
(8) End Sub为必需。表示过程结束。
如果在类模块中编写子过程并把它声明为Public,它将成为该类的方法。
(关于过程的详细介绍和示例见后面的一系列文章)
函数
函数(function)是能完成特定任务的相关语句和表达式的集合。当函数执行完毕时,它
会向调用它的语句返回一个值。如果不显示指定函数的返回值类型,就返回缺省的数据类型值。
声明函数的语法为:
[Private|Public] [Static] Function <函数名> ([参数]) [As 类型]
[指令]
[函数名=表达式]
[Exit Function]
[指令]
[函数名=表达式]
End Function
说明:
(1) Private为可选。如果使用Private声明函数,则该函数只能被同一个模块中的其它过程访问。
(2) Public为可选。如果使用Public声明函数,则表明该函数可以被所有Excel VBA工程中的所有其它过程访问。不声明函数过程的作用域时,默认的作用域为Public。
(3) Static为可选。如果使用Static声明函数,则在调用时,该函数过程中的所有变量均保持不变。
(4) Function为必需。表示函数过程开始。
(5) <函数名>为必需。可以使用任意有效的函数名称,其命名规则与变量的命名规则相同。
(6) 参数为可选。代表一系列变量并用逗号分隔,这些变量是传递给函数过程的参数值。参数必须用括号括起来。
(7) 类型为可选。指定函数过程返回的数据类型。
(8) Exit Function为可选。表示在函数过程结束之前,提前退出过程。
(9) End Function为必需。表示函数过程结束。
通常,在函数过程执行结束前给函数名赋值。
函数可以作为参数的组成部分。但是,函数只返回一个值,它不能执行与对象有关的动作。
如果在类模块中编写自定义函数并将该函数的作用域声明为Public,这个函数将成为该类的方法。
(关于Function过程的详细介绍和示例见后面的一系列文章)
事件处理过程
要对一个控件事件编写事件处理程序,应先打开窗体的代码窗口并从可用对象的下拉列表中选择所需的控件。然后,从该控件的可用事件下拉列表中选择所用的事件。此时,对事件处理程序的定义语句就会自动出现在代码窗口中,就可以直接编写事件处理程序了。
在Excel中,有下面几类事件,即Excel应用程序事件、工作簿事件、工作表事件、图表事件、用户窗体事件等。
(关于Excel中事件处理的介绍请见后面的一系列文章)
类模块
类模块是存放共享变量以及共享代码的存储库。创建一个类模块,实际上也是在创建一个COM(组件对象模型)接口。因此,类模块允许通过一个由属性、方法和事件组成的可编程接口向外界描述应用程序,同时保证保留对应用程序的控制权。也就是说,类模块能够让程序实现“封装”,这样,在其它工程中可以直接使用某类模块而不需要访问源代码。此外,可以使用类来创建自已的库,如果要使用的话,只需要在任何新的工程中添加一个对该类的引用就行了。并且,如果要改变程序,只需对类模块改动就行了,而不需要在程序的每个部分都作改动。
(有关类模块知识的详细介绍请见后面的一系列文章)
属性过程
属性过程(property procedure)是特殊的过程,用于赋予和获取自定义属性的值。属
性过程只能在对象模块如窗体或类模块中使用。
有三种属性过程:
Property Let
给属性赋值
Property Get
获取属性的值
Property Set
将对象引用赋给属性引用
调用子过程和函数过程
子过程可以用下面三种方法调用。第一种使用Call语句:
Call DoSomething(参数1,参数2,……)
如果使用Call语句,就必须用小括号将参数列表括起来。
第二种是直接利用过程名:
DoSomething 参数1,参数2,……
此时,不用在参数列表两边加上括号。
如果不想使用函数的返回值,可以用上述任一种方法调用函数。否则,可以用函数名作为表达式的组成部分,如
If GetFunctionResult(parameter)=1 Then
如果用函数调用作为表达式的一部分,参数列表必须放在小括号中。
第三种是使用Run方法。
(关于过程调用更详细的介绍和示例请见后面的一系列文章)
在过程间传递参数
在很多情况下,需要在子过程或函数中调用另一个自定义函数或子过程,这时,在被调用过程中就要用到在调用过程中使用的某个变量。因此,可把该变量作为参数传递给被调用过程。不管被调用过程是在同一模块、同一工程中的过程,还是在远程服务器上的类中的一个方法,从一个过程向另一个过程传递变量的原理都是一样的。
被调用过程(而不是调用过程)决定了变量如何从调用过程传递到被调用过程。
1、VBA允许用两种不同的方式在过程和组件之间传递参数。在子过程或函数的定义部分,可以指定参数列表中的变量的传递方式:ByRef(按引用)或者ByVal(按值)。
(1) ByRef
这是VBA中在过程间传递变量的默认方法。ByRef是指按引用传递变量,即传递给被调用过程的是原变量的引用。因此,如果改变了被调用过程中的变量值,其变化就会反映到调用过程中的那个变量,因为它们实际上是同一个变量。
(2) ByVal
如果使用ByVal关键字传递变量,被调用过程获得的就是该变量的独立副本。因此,改变被庙用过程中该变量的值不会影响调用过程中该变量原来的值。
2、Optional参数
Optional关键字用来指定某个特定的参数并不一定要传递,即为可选参数。但是,该参数必须放在最后。
3、ParamArray
使用ParamArray关键字能够使过程按受一组数目可变的参数。ParamArray参数必须是参数列表中的最后一个参数,而且不能在使用了Optional关键字的参数列表中使用ParamArray参数。
变量(常量)作用域和生存期
有时需要在工程内的所有过程中使用某个变量,而有时某些变量又只需要在某些特定的过程中用到,变量的这种可见性称为变量作用域。
变量存在和作用的时间,称为变量的生存期。
变量或常数在程序中声明的位置决定了变量的作用域和生存期。
总的说来,在模块的声明部分用Private关键字声明的变量可以被模块中的所有过程使用;在模块的声明部分用Public关键字声明的变量可以被整个工程使用;若某个对象引用指向某类模块,则在该类模块的声明部分用Public关键字声明的变量可以被整个工程使用;在子过程或函数中用Dim语句声明的变量只能被声明这些变量的过程使用。
(1) 过程级作用域
在一个过程(即子过程或函数)内声明的变量只能在该过程内使用,其生存期在执行了End Sub或End Function语句后结束。因此,可以在不同的过程中定义具有相同名称的不同变量。声明过程级作用域的变量,在过程中用Dim语句声明变量。
此外,还有一种具有过程级作用域的特殊变量,称为静态变量。静态变量是在过程中定义的,尽管这种变量也具有过程级作用域,但是它具有模块级的生存期。这意味着只能在定义静态变量的过程内使用这些变量,但是变量的值在两次过程调用之间是保持不变的。用Static关键字声明静态变量:
Static lngExcuted As Long
还可以声明一个过程为静态过程,在这种情况下,在过程中声明的所有变量都被认为是静态变量,而且它们的值在两次过程调用之间都会保持不变,如
Static Procedure MyProcedure()
Dim iCtr As Integer
(2) 模块级或私有作用域
具有模块级作用域的变量可以被某个模块内的所有子过程和函数使用,也可以在模块级生存期内保存在内存中。
在模块的声明部分(即任何子过程或函数外),用Dim语句或Private语句声明变量来创建一个具有模块级作用域的变量。
(3) Friend作用域
Friend关键字只能用于在对象模块(如类模块或窗体模块)中的变量和过程的声明。用Friend声明的变量允许工程中的其他对象模块访问原模块中的变量或方法,但是不需要用Public语句声明这些变量或方法。
(4) 公共作用域
在过程外使用Public语句声明的变量可以被当前工程中的所有模块使用。
注释
“注释”就是嵌入在代码中的描述性文本,VBA完全忽略注释中的文本。
要在代码中插入注释,只需在前面加上单引号,即在一行中以单引号(‘)开始。
注释应该表达有用的信息。
1.2 VBA入门之一《与代码亲密接触》
去除粗枝繁叶,留一根主干,作攀天之梯,目标是那金碧辉煌的VBA殿堂。
一路上,两旁都是漂亮的姑娘,不要三心二意,请跟我走。
闲话少说,言归正传。
打开Excel,新建一工作簿。
0如果你的工具栏中找不到“控件工具箱”,请打开它。控件工具箱可悬浮在工作表中,也可停靠在窗口的四周(如4楼图样)。
1点击命令按钮,在工作表中拖动鼠标至适合大小。
与代码亲密接触2
2按钮出来了。通过右键菜单,可以编辑它的文字。
3点击控件工具箱中的“属性”按钮,或如上图所示的右键菜单中点击“属性”。按钮的前景色、背景色、字体等统称为“属性”。
与代码亲密接触3
4设置属性虽然有趣,但总不过瘾,来点刺激的。双击按钮,眼前是另一片天地,它叫做VB编辑器(或称VBE),VBA的一切神奇将从这里诞生。
5依样画葫芦。在光标处输入下面一行代码:
QUOTE:
MsgBox \"哈哈,我会 VBA 啦……\"
msgbox 不拘大小写,后面有一个空格,引号是半角引号。
输入完毕后点击工具按钮返回Excel窗口。
与代码亲密接触4
6点击控件工具箱中的“退出设计模式”按钮。“芝麻开门”按钮周围的小圈圈没了,转换成运行模式。
这一步经常要做的,注意。
7点击按钮“芝麻开门”,这就是代码运行的效果图,一个系统对话框。
重复练习一遍:点击“设计模式”按钮,再点击“芝麻开门”,这时按钮被选择。
点击“退出设计模式”,再点击“芝麻开门”,又进入运行状态。
与代码亲密接触5
8现在,由工作表界面切换到VBE界面,下列方式可任选一种:
按Alt+TAB选择VBE图标,松开复合键。
工作表标签右键菜单-查看代码。
菜单:工具-宏-VB编辑器。
Alt+F11。
双击控件。
与代码亲密接触6
9将代码修改为:
QUOTE:
Private Sub CommandButton1_Click()
ctxt = \"哈哈,我会 VBA 啦……\"
MsgBox ctxt, 64, \"宣告\"
End Sub
实际修改的是中间的黑色字体部分。
代码中,蓝色处是一个空格,粉红色处是一个逗号。
命令后面、命令与命令之间,间隔一个以上的空格。
参数与参数之间,用逗号分开。
运行代码的办法,除了在工作表上点击按钮,还可以在VBE窗口中直接运行,把光标定位到代码首尾之间(从“Private Sub CommandButton1_Click()”到“End Sub”),如下图所示执行菜单命令或按F8,逐行执行代码。
如果执行“运行-运行子过程”命令(按F5),将连续执行过程首尾之间的全部代码。
10代码的解释:
ctxt叫做自定义变量,就像我们代数中常用的x、y、z一样。
ctxt = \"……\" 叫做赋值,跟代数中的赋值是一样的。
11MsgBox是什么东西?我们总是想知道。
请选择MsgBox(实际上,只需把光标定位到命令中的任意位置均可),按F1键,系统将弹出帮助窗口并显示该命令的帮助。
与代码亲密接触7
12在B2:D4单元格输入一些数据备用。为工作表添加第二个按钮。
这个按钮的功能是:用鼠标点击这些单元格,然后点击按钮,像上例一样弹出一个对话框,显示的内容为这个单元格的名称和内容。
13双击按钮。在光标闪烁处,输入代码:
msgbox \"你点击的单元格是:\" &
(蓝色位置表示空格),接下来要输入的代码是“ActiveCell.Address”,输入这些代码可以使用键盘输入,也可以从属性列表中选择。按Ctrl+J,在代码窗口中弹出一个下拉列表,就是属性/方法列表,将光标移动到ActiveCell,然后点击键盘上的小数点“.”,结果ActiveCell连同小数点被输入到代码窗口中。
窗口中继续显示属性列表中,选择属性“Address”,按空格键输入该属性。
接着,输入“& Chr(13) _”,回车换行,继续输入:
& \"该单元格的值等于:\" & ActiveCell.Value, 64, \"神算子\"
完整的代码是:
QUOTE:
Private Sub CommandButton2_Click()
MsgBox \"你点击的单元格是:\" & ActiveCell.Address & Chr(13) _
& \"该单元格的值等于:\" & ActiveCell.Value, 64, \"神算子\"
End Sub
辛苦了。返回Excel,退出设计模式,先看一下运行的效果。
与代码亲密接触8
14切换到Excel,退出设计模式,测试代码:
用鼠标点击单元格D4,然后点击按钮。效果如下所示:
点击确定按钮。
点击其它单元格,再点击按钮,多试几遍。
15代码解释:
ActiveCell表示活动单元格,即光标所在的单元格,Address表示地址,中间的“.”是连接符。
ActiveCell.Address 即是:当前单元格的地址。
ActiveCell.Value 即是:当前单元格的值。
点击D2单元格,因为当前单元格的地址是“$D$2”,即:
ActiveCell.Address = \"$D$2\"
D2单元格的值是“2006-8-10”,即:
ActiveCell.Value = \"2006-8-10\"
所以,点击按钮后,对话框中显示的信息为:
QUOTE:
你点击的单元格是:$D$2
该单元格的值等于:2006-8-10
Chr(13)代表一个回车符(信息分两行显示)。
后面的下划线“_”与显示无关,写代码的时候,如果一行太长,不方便阅读,可使用一个下划线把代码分两行或多行书写,不影响运行。
与代码亲密接触9
建议中间休息一下再继续,这一节任务不轻。
16添加第三个按钮,编辑文字为:“点石成金”。
这里插一下,这些按钮上的文字称为“标签”(标签总是贴在上面的)。
不同的按钮可以使用相同的标签,但每一个按钮有一个独立的名字,看属性框的第一行。
与代码挂钩的正是这些名称。代码Private Sub后面的就是控件的名称。
17“神算子”功能实际是读取单元格属性。我们也可以设置单元格属性:用代码给单元格输入内容,改变单元格的字体、字号、颜色等,把单元格修饰得漂亮一点。
双击按钮,在光标处输入代码:
QUOTE:
Range(\"b8\").Value = Range(\"b2\").Value
退出设计模式,点击按钮运行它,先看看效果如何。
单元格B8被输入了与单元格B2相同的文字。
原来这Range(\"b8\")即表示单元格B8。
代码解释:单元格B8的值=单元格B2的值。
18除了用Range(),单元格还可用以下形式表示:
QUOTE:
[b8].Value = [b2].Value
效果与Range()形式完全相同,可把这一行代码代替原来代码试试。
还可以这样:
QUOTE:
Cells(8, 2).Value = Cells(2, 2).Value
19属性Value可以省略
上面代码一一可以省略为以下形式:
Range(\"b8\") = Range(\"b2\")
[b8] = [b2]
Cells(8, 2) = Cells(2, 2)
在VBE窗口中,绿色(默认)文字表示是注释文字,不被运行的。
前面加一半角的单引号即设置后面的文字为注释文字。删除前面的单引号即是取消注释功能。
20单元格除了“地址”、“值”两个属性以外,还有许多属性,如:宽度、高度、字体、字号等等。
一一把下面代码复制到过程中,运行它,观察单元格的变化。
ActiveCell.ColumnWidth = 20 '设置活动单元格的宽度为20
ActiveCell.RowHeight = 40 '设置活动单元格的高度为40
ActiveCell.Font.Name = \"黑体\" '设置活动单元格的字体的名称为“黑体”
ActiveCell.Font.Size = 20 '设置活动单元格的字体的尺寸为20
也可用指定的单元格代替活动单元格(ActiveCell),如:Range(\"d3\").Font.Size=30。
与代码亲密接触10
21如何读写其它工作表的单元格呢?
把工作表sheet2重命名为VBA2,添加第四个按钮“暗渡陈仓”,事件代码为:
QUOTE:
Sheets(\"VBA2\").Range(\"D5\").Value = \"明修栈道,暗渡陈仓。\"
[attach]169035[/attach]
VBA入门之二《一夜暴富》
经过VBA入门之一《与代码亲密接触》的学习,我们的收获应该是不小的,是吧?
1、能在工作表中使用按钮,能在VBE中创建代码,并运行它。
2、认识了一些对象:按钮、工作表、单元格都是一个对象,初步建立了“对象”这个
概念。
3、掌握了单元格对象的一些属性,如:Value、Address。
4、知道单元格有Range()、Cells()、[]等几种表示方法。
5、接触了按钮的一些属性,如:Left、Caption、Width、Height等等。
6、最值得高兴的是,你能读懂“CommandButton1.Caption”,看似长长的代码,其实就是“按钮1的标签”这意思。我们熟悉的小数点在这里是一个连接符,起承上启下
的作用。
有没有想过?许多事情现在跃跃欲试,但就是不知道该用什么代码,这该死的代码。
别急,今晚,我们就来解决这一问题。
宏是什么东西?
Excel工具菜单下有个“宏”,这宏是什么东西?宏是一段代码。我们点击一个按钮运
行一段代码,这一段代码就是一个宏。
菜单:工具-宏中有个“录制新宏”,这又是什么意思?
录制新宏就是把我们对Excel的键盘和鼠标操作记录为代码。
没有发愣吧?这东西好哩!
VBA入门之二《一夜暴富》2
我们就来试一试这“录制新宏”。
做点什么?把当前工作表隐藏了,看录制的宏是什么东西。
说做就做:
①点击工具-宏-录制新宏:
这时,会显示工具“停止录制”,有两个按钮,一个是停止录制,点击它即停止录制宏。另一个是“相对引用”,如果对单元格进行操作,选择或取消“相对引用”,录制出
的代码是不一样的,你可另找时间研究它。
②操作:格式-工作表-隐藏。
③点击“停止录制”按钮,也可以执行菜单命令“工具-宏-停止录制”。
VBA入门之二《一夜暴富》3
“录制新宏”的工作结束了,按Alt+F11打开VBE窗口:
系统自动增加一个模块“模块1”,刚才录制的宏就在这模块1下,如果看不到代码,
双击“模块1”就是。
Sub Macro1()和End Sub是宏的开始行和结束行。Macro1是宏的名称。
绿色字体部分是注释,如果不喜欢,可以删掉它。
余下的只有一行:ActiveWindow.SelectedSheets.Visible = False
这时,我们该怎么做?
按F1,查帮助。用查户口的方式弄清每一个词的意义。
ActiveWindow:当前窗口。
SelectedSheets:选定的工作表。
Visible:决定对象是否可见。
我们操作的对象是ActiveWindow.SelectedSheets,即当前窗口中的选定的工作表。
让工作表隐藏,即是Visible = False。
VBA入门之二《一夜暴富》4
看出点名堂来没有?
如果不用“ActiveWindow.SelectedSheets”这种方式来指定工作表,还能怎样?回想一下,Sheets(工作表名),还记得吗?我们能用代码隐藏指定的工作表(如sheet2)吗?
能:
QUOTE:
Sheets(\"Sheet2\").Visible = False
当Visible = False时,表示隐藏,不可见,怎样表示可见呢?取值等于False相反的
逻辑值是True:
QUOTE:
Sheets(\"Sheet2\").Visible = True
可以用我们已经熟悉的方式,把代码写在按钮的Click()过程中,点击按钮运行它。
[attach]169461[/attach]
小结:本来我们不知道有Visible这么一个属性,因为需要,我们可以通过录制宏的办法记录对Excel的操作,再对宏代码进行分析,找到我们需要的代码并加以运用。掌握了
录制宏这一技巧,是不是受用无穷呢?
练习1:编写代码,把工作表sheet3更名为“我的工作表”。
练习2:编写代码,取消当前窗口中的滚动条(提示:菜单:工具-选项-视图)。
VBA入门之二《一夜暴富》5
练习还顺畅吗?
工作表具有Visible属性,改变它的值,即是隐藏或显示指定的工作表。
其它对象是否有这属性?打开下面的附件看看:
[attach]169535[/attach]
VBA入门之二《一夜暴富》6
你一定已经知道,录制的宏可以直接运行。运行宏的办法有多种:
①打开“工具-宏-宏”窗口,选择要运行的宏,点击按钮“运行”。
[attach]169520[/attach]
VBA入门之二《一夜暴富》7
录制宏注意事项。
录制宏主要有两个目的。一是为了运用,如,当前工作表从第1行开始,每7行删除
1行,我们可以录制一段宏,操作步骤是:
①将光标定位到要删除的第一行;
②开始录制(设置快捷键Ctrl+X、选择“相对引用”),完成两个动作:
⑴删除整行;
⑵光标下移6行到要删除的第2行,即第原来的第8行(最好用鼠标,可与键盘操作比
较一下代码);
③停止录制。
[attach]169529[/attach]
利用这个实例,可对比领会一下“相对引用”的作用。
第二个目的,就是获取代码,我们不知道对象的属性、方法,通过录制宏来获取,再
用到自己的代码中。
无论哪个目的,都要注意,不要进行不必要的操作,代码太多,不利于修改。如果获
取代码为目的,录制过程更要简洁些,一次录制的动作越少越好,分析的时候才不容易出
差错。
这一讲到这结束。
VBA入门之二《一夜暴富》问题解答
QUOTE:
以下是引用xiaoxun在2006-8-14 13:03:38的发言:
学生愚笨,请老师指点:录制后结果不同,错在哪?
第一步,定位第一行,不是选择第一行,用鼠标点击第一行的某一单元格,如A1。
开始录制后,第一步是选择第一行(你原来录制前的操作)。
VBA入门之二《一夜暴富》问题解答
QUOTE:
以下是引用mannewer123在2006-8-15 16:18:53的发言:
在VBA入门之二《一夜暴富》7中提到:利用这个实例,可对比领会一下“相对引用”
的作用
可是我用了两种方法做了以后,怎么感觉是一样的啊,能不能请山老师具体解释下两
个的区别,谢谢~
不能凭感觉,要用事实说话。
两种模式下录制宏,再分别运行它(多运行几次),看工作表变化。
[此贴子已经被作者于2006-8-14 15:34:59编辑过]
附件
2u96z98j.gif (109.55 KB)
2006-8-14 15:34
VBA入门之二《一夜暴富》问题解答
VBA入门之二《一夜暴富》问题解答
QUOTE:
以下是引用mannewer123在2006-8-15 16:18:53的发言:
在VBA入门之二《一夜暴富》7中提到:利用这个实例,可对比领会一下“相对引用”
的作用
可是我用了两种方法做了以后,怎么感觉是一样的啊,能不能请山老师具体解释下两
个的区别,谢谢~
不能凭感觉,要用事实说话。
两种模式下录制宏,再分别运行它(多运行几次),看工作表变化。
因篇幅问题不能全部显示,请点此查看更多更全内容