终于开始盼望已久的VBA中级班!很荣幸地成为中级班的第一批学员,现在就让我们开始VBA新的旅程吧!
1 变量的命名规则
1.1 变量
有些数据是在程序执行中会发生变化的,为此我们分配一个内存中的位置,来存储这些不确定的数据,这就是变量。每一变量都有变量名,在同一范围内必须是唯一的。可以指定数据类型,也可以不这么做。
1.2 变量命名规则
变量名必须以字母开头(中文版可以中文开头),由字母、数字和下划线组成(中文版中可以使用中文),不得超过255个字符(所有版本一致)。要注意的是,变量名不可以是系统的保留名称,如if、else、end等。
- VBA中变量名 不区分大小写
2 声明变量
声明变量是确定变量名并为变量指定数据类型。按其定义方式可分为显式声明和隐式声明。
2.1 显式声明
即先声明变量类型,再引用变量,语法为:
Public | Static | Private | Dim <变量名> [as 数据类型]
变量名:用来引用变量
数据类型:确定变量存储信息的类型和占用内存大小
- [as 数据类型]可以省略,当省略时,VBA自动为变量指定为变体型数据类型(Variant)。
2.1.1 类型声明字符
在VBA中可以使用一些字符来代表数据类型,简化声明变量,这就是类型声明字符,不是所有数据类型都有类型声明字符,下表中给出了所有的类型声明字符:
数据类型 | 类型声明字符 |
字符串型(String) | $ |
整型(Integer) | % |
长整型(Long) | & |
单精度浮点型(Single) | ! |
双精度浮点型(Double) | # |
货币型(Currency) | @ |
举例:
Dim iRow& '声明长整型变量iRow
2.1.2 同时声明多个变量
在声明变量时,如果有多个变量,我们可以用逗号来分隔不同变量:
Dim <变量名1> [as 数据类型], <变量名2> [as 数据类型],………………
- 每个变量都要指定数据类型,省略数据类型相当于指定为变体型。
举例: Dim i, j as long '表示i是Variant型,而j是long型
2.2 隐式声明
即在过程引用变量前不事先声明此变量。在这种情况下,VBA会自动为变量分配成Variant数据类型。因为Variant型范围最广、内存容量最大,所以可以存储除定长字符串型和用户自定义型外的所有数据类型。
- Variant型因其占用内存较大,会拖累程序的运行速度,所以我们应尽量地使用显式声明,为变量指定合适的数据类型,而不要过多的使用Variant型。
- 注意: 只有在过程中引用的局部变量才可以使用隐式声明,公共模块级别、私有模块级别和静态变量没有隐式声明方式。具体内容将在后面的变量作用范围中讲到。
2.3 强制变量声明
两种方法可以强制要求必须显式声明变量
1)在一个模块的第一行写入Option Explicit语句。
2)VBE窗口"工具"选项"要求变量声明
- 当设置了"要求变量声明"后,VBA会 在新模块(包括工作表模块、窗体模块、标准模块和类模块)自动生成Option Explicit语句,却不会在已存在的模块中自动生成。
- Option Explicit语句只 在它所在的模块中起作用!
3 变量的作用域和生存周期
3.1 变量的作用域
变量的作用域也是变量的范围,在声明变量的同时也定义了变量的作用域。
级别 | 关键字 | 声明语句位置 | 变量作用范围 |
过程级别变量 (局部变量) | Dim | 在过程内声明 | 只在此过程内才能访问和改变该变量 |
Static | 在过程内声明静态变量 | ||
私有模块级别变量 (模块级变量) | Private Dim | 在模块顶部声明区内声明 | 在此模块内的所有过程内都可访问和改变该变量 |
公共模块级别变量 (全局变量) | Public | 在模块顶部声明区内声明 | 整个工程任何模块中的任何过程都可访问和改变该变量 |
- 在模块级别中使用 Dim 语句与使用 Private 语句是相同的。不过使用 Private 语句可以更容易的读取和解释代码。
3.2 静态变量
当使用 Static 语句取代 Dim 语句时,所声明的变量称为静态变量。静态变量只能是局部变量,只能在过程内声明。
3.3 变量的生存期
变量除了有范围外,还有生存周期,它的生存周期与它的范围一致,变量值将在范围消失后失去。
Dim 语句声明的局部变量,变量值在过程结束后释放内存,在再次执行此过程前,它将重新被初始化;静态变量在过程结束后,只要整个程序还在运行,都能保留它的值而不被重新初始化。而当所有的代码都运行完成后,静态变量才会失去它的范围和生存期。
模块级变量与公共级变量的生存期与静态变量生存期相同,只有当整个程序结束后才会失去生存期。
3.4 变量的引用
1)不同模块中的公共模块级别变量同名,在过程中调用时,使用
模块名.变量名 方式引用。
2)同模块中公共模块级别变量与过程级别变量同名,在过程中调用公共模块级别变量时使用 模块名.变量名 方式引用;而调用过程级变量则直接调用变量名。
3) 其它模块引用窗体模块、工作表模块和工作簿模块中的公共级别变量时,也使用 模块名.变量名 方式引用
- 小技巧:查看变量或过程
当我们想要查看过程中引用的变量或其它过程,是引用哪个模块中的变量或过程时,可以选中此变量或过程,点击右键,选择"定义",将自动跳到此变量或过程的定义处,这样很方便快捷。再点击右键选择"最后位置"将返回上次光标所在的地方。
4 小结
其实变量很好理解,把它想象成一个容器,声明变量就是确定容器形状和容量大小,变量名就是给这个容器贴个专用的名字,数据类型就是确定这个容器是装液体还是固体或气体,变量的值就是里面放入的东西。所以切记变量就是在内存中占用的存储位置。
本节课的重点是变量的作用域和变量的生存周期。作用域决定了生存期长短。变量的作用域和生存期决定程序对变量值的引用。