VBA语言元素
首先是一个简单的VBA Sub过程,包含典型VBA语言元素。
Sub VBA_Demo()
'注释:这是一段VBA代码示例
Dim Total As Long, i As Long
Total = 0
For i = 1 To 100
Total = Total + i
Next i
MsgBox Total
End Sub
以上过程中包含部分常见VBA语言元素:
- 一行注释,注释行使用单引号开头
- 一行变量声明语句,以 Dim 开头
- 两个变量, Total 和 i
- 两条赋值语句,Total = 0 和 Total = Total + i
- 一个循环结构,For-Next 结构
- 一个VBA函数,MsgBox 函数
通常每行写一条指令,但不强制遵守。在一行中可以用冒号隔开多条指令;对于稍长的代码可以使用空格和下划线组成的VBA换行连续序列。例如:
Sub OneLine()
' 使用“:”在一行中分隔多条指令
x = 1: y = 2: z = 3: MsgBox x + y + z
End Sub
Sub LongLine()
' 使用空格加下划线可以实现代码连续换行,便于阅读
SumValue = _
Worksheets("Sheet1").Range("A1").Value + _
Worksheets("Sheet2").Range("A1").Value
End Sub
注释
VBA注释以(英文)单引号开始,“注释”是嵌入代码中的描述性文本。使用注释可以清晰描述编程思路(代码功能),便于修改和阅读代码。注释可以占用整行,也可以在代码后插入注释。为发挥注释作用,以下是一些常规提示:
- 使用注释描述变量的目的
- 使用注释简要描述每个过程的目的。
- 使用注释描述对过程所做的修改。
- 使用注释指出非标准(或常规)方式使用的函数或构件。
- 写完代码后加注释,不如编写代码的同时写注释。
Sub CommentDemo()
'这是一个没有实际作用的过程
x = 0 'x没有任何含义
'显示结果
MsgBox x
End Sub
变量、数据类型和常量
“变量”是一些已命名的位于计算机内存中的存储位置,在程序执行过程中变量的值可能发生变化。“数据类型”指如何把数据存储到内存中, 如作为整数、实数或字符串等等。有时候需要引用不发生变化的值或字符串,即“常量”。
变量
尽可能用描述性的词语定义变量名称,会比较直观。此外,VBA规定了一些变量命名规则:
- 第一个字符必须是字母,可以使用字母,数字和一些标点符号。
- VBA变量名称不区分大小写。建议使用帕斯卡(Pascal)命名法,做法是首字母大写,如:UserName。
- 变量名中不能包括空格和句点。有时为了可读性,可用下划线,如:User_Name。
- 不能在变量名中嵌入特殊类型的声明字符,如#、$、%、&或!。
- 变量名最多可以包含254个字符,但不推荐过长的变量名。
下面是一些赋值表达式,等号左侧是变量名称。每条表达把右边的值赋给左侧的变量:
x = 1
InterestRate = 0.065
DataUpdated = False
x = x + 1
'日期总是使用“月/日/年”格式定义
DateEnd = #12/31/2018#
UserName = "哎喂可乐"
定义数据类型
VBA 内置的数据类型如下:
数据类型 | 所使用的字节 | 数值的范围 |
---|---|---|
Byte | 1个字节 | 0-255 |
Boolean | 2个字节 | True或False |
Integer | 2个字节 | -32 768~32 767 |
Long | 4个字节 | -2 147 483 648~2 147 483 647 |
Single | 4个字节 | 负值:-3.402 823E38~-1.401 298E-45 正值:1.401 298E-45~3.402 823E38 |
Double | 8个字节 | 负值:-1.797 693 134 862 32E308~-4.940 656 458 412 47E-324 正值:4.940 656 458 412 47E-324~1.797 693 134 862 32E308 |
Currency | 8个字节 | -992 337 203 685 477.5808~992 337 203 685 477.5807 |
Decimal | 12个字节 | 不带小数位时+/-79 228 162 514 264 337 593 543 950 335 带28个小数位时+- 7.922 816 251 426 433 759 354 395 033 5 |
Date | 8个字节 | 0100年1月1日~9999年12月31日 |
Object | 4个字节 | 任意对象的引用 |
String(变长) | 10个字节+字符串的长度 | 0~大约20亿个字符 |
String(定长) | 字符串的长度 | 1~大约65400个字符 |
Variant(数字) | 16个字节 | 最大到双精度(Double)数据类型的任意数值。也可以保存诸如Empty、Error、Nothing和Null之类的特殊数值。 |
Variant(字符) | 22个字节+字符串的长度 | 0~大约20亿 |
用户自定义 | 因元素类型而异 | 因元素类型而异 |
如果不为VBA中使用的某个变量声明数据类型,将默认使用Variant类型,存储为Variant类型的数据行根据处理内容不同将改变数据的类型。尽管VBA可以自动维护数据类型,但是会导致执行速度慢以及内存使用效率不高等问题。因此,最好将变量显示的声明为某种特定的数据类型,为了强制声明使用的所有变量,可在VBA模块中使用以下语句作为第一条指令:
Option Explicit
局部变量:在过程中声明的一种变量,只能作用才声明它的过程中。过程结束时,局部变量不复存在。
Sub MySub()
' 使用Dim关键字声明局部变量
Dim TodayDate As Date
Dim UserName As String * 50 '限定字符串最大长度为50
Dim TextData As String '变长字符串
' 可以用一条Dim语句声明多个变量
Dim First As Long, Last As Double
End Sub
模块作用域下的变量:在模块的所有过程中都可以使用的变量,只要在模块的第一个过程之前(在任何过程或函数外)声明变量即可。
Dim UserName As String '模块作用域下,MySub1()和MySub2()过程中都可以使用
Sub MySub1()
' 第一个过程的代码
End Sub
Sub MySub2()
' 第二个过程的代码
End Sub
公共变量:在项目的所有VBA模块的所有过程中都可以使用的变量,需要声明在模块层次上(第一个过程之前),使用Public关键字声明而不是使用Dim声明。例如:
Public FileName as Double '公共变量
静态变量:比较特殊,这些变量在过程层次上进行变量的声明,过程结束时静态变量保持它们的值不变。如果有一条End语句终止了该过程,静态变量将丢失它们的值。注意,End语句与End Sub语句并不相同。使用Static关键字可以声明静态变量:
Sub MySub()
Static Counter As Long '静态变量
' 过程的代码
End Sub
常量
使用Const关键字来声明常量。用常量代替硬编码的值或者字符串是一个非常好的习惯,可以使代码更具可读性且便于修改。比如,PI=3.1415926, 或者多次引用某个利率Rate等。
Const AppName = "哎喂可乐"
Const FirstDay As Date = #1/1/2018#
Const LunchTime = #12:00:00#
Const Rate = 0.065, Period = 12
与变量类似,常量也有作用域。可以在Sub或Function语句后声明局部常量,或使用Public关键字声明公共常量。
Public Const InterestRate As Double = 0.065
赋值语句
“赋值语句”是一条VBA指令,它进行数学(函数)计算并将结果赋给某个变量或对象。VBA使用等号(=)作为赋值运算符。以下为赋值语句示例:
x = 1
x = x+1
x = (y * 3) / (z - 4)
FileClosed = True
FileClosed = Not FileClosed
Range("A1").Value = 2018
使用小括号()可改变运算的优先级,默认运算符的优先级如下:
运算符 | 运算 | 优先级 |
---|---|---|
^ | 幂运算(乘方) | 1 |
*和/ | 乘和除 | 2 |
+和- | 加和减 | 3 |
& | 字符串连接 | 4 |
=、<、>、<=、>=、<> | 比较 | 5 |
此外,VBA提供了逻辑运算符(具体信息及实例可查看VBA帮助系统):
运算符 | 用途 |
---|---|
Not | 执行表达式的逻辑“非”运算 |
And | 执行两个表达式的逻辑“与”运算 |
Or | 执行两个表达式的逻辑“或”运算 |
Xor | 执行两个表达式的逻辑“异或”运算 |
Eqv | 执行两个表达式的逻辑“等价”运算 |
Imp | 执行两个表达式的逻辑“蕴涵”运算 |
'Score同时满足大于等于60且小于80时,MsgBox语句将显示True
'若不满足其中一个条件或两个都不满足,则MsgBox语句将显示False
MsgBox Score >= 60 And Score <80
数组
“数组”是一组拥有相同名称的同类元素,使用数组名称和索引号可以引用数组中的某个特定元素。默认情况下,VBA数组的索引号从0开始。例如包含一周7天名称的字符串数组命名为WeekDays,那么第一个元素为WeekDays(0),第二个元素为WeekDays(1),……,第七个元素为WeekDays(6)。
声明数组:声明数组与声明普通变量类似,需在变量名后加括号。此外可以指定上界索引号,还可以指定第一个索引号、关键字To以及最后一个索引号,在括号中括起来。示例如下:
' 声明一维数组
Dim MyArray(100) As Integer '第一个索引号默认0,上界索引号100,包含101个元素
MyArray(0) = 888 '赋值给数组中的元素
Dim YourArray(1 To 100) As Integer '第一个索引号1,上界索引号100,包含100个元素
' 声明多维数组
Dim MatrixArray(1 To 10, 1 To 10)As Integer '包含100个整数的二维数组,可认为是10*10矩阵
MatrixArray(6, 6) = 666 '赋值给数组中的元素
'声明动态数组
Dim DynamicArray() As Integer
'动态数组使用前,必须使用ReDim语句说明包含多少个元素
'常使用一个变量(例如x)指定动态数组中元素个数,直到某个过程结束才直到个数
ReDim DynamicArray(1 To x)
对象变量
“对象变量”是代表一个完整对象的变量,如单元格区域或工作表。对象变量的作用体现在显著简化代码和提高代码执行速度两个方面。
可以像声明普通变量一样声明对象变量。例如下面代码把变量TargetAera声明为一个Range对象,并使用Set关键字把对象赋值给变量:
Dim TargetAera As Range
Set TargetAera = Range("A1:C10")
以下是没有使用对象变量的一个过程:
Sub NoObjVar()
Worksheets("Sheet1").Range("A1:C10").Value = 666
Worksheets("Sheet1").Range("A1:C10").Font.Bold= True
Worksheets("Sheet1").Range("A1:C10").Font.Italic = True
Worksheets("Sheet1").Range("A1:C10").Font.Size = 16
Worksheets("Sheet1").Range("A1:C10").Font.Name = "微软雅黑"
End Sub
为实现与上述代码相同功能,还可以使用一个对象变量进行简化:
Sub ObjVar()
Dim TargetAera As Range
Set TargetAera = Worksheets("Sheet1").Range("A1:C10")
TargetAera.Value = 666
TargetAera.Font.Bold= True
TargetAera.Font.Italic = True
TargetAera.Font.Size = 16
TargetAera.Font.Name = "微软雅黑"
End Sub
自定义数据类型
VBA允许用户创建自定义数据类型。自定义数据类型要在模块最上端与任何过程之前。例如,程序要处理一组通讯录信息,可能要创建一个名为ContactInfo的联系人信息数据类型,如下所示:
' 自定义“联系人信息”数据类型
Type ContactInfo
Name As String
PhoneNum As String
Email As String
WeChatID As String
Birthday As Date
End Type
' 声明包含100个联系人信息元素的数组,每个元素由5部分组成
Dim MyContacts(1 To 100) as ContactInfo
MyContacts(1).Name = “哎喂可乐”
MyContacts(1).PhoneNum = "12345678"
MyContacts(1).Email ="awkl@awkl.com"
MyContacts(1).WeChatID = “***”
MyContacts(1).Birthday = #11/11/1911#
内置函数
与大多数编程语言一样,VBA包含各种内置函数,可以简化计算和操作。
VBA语句清单和内置函数清单后续补充。