目录如下:
一、变量的概念 二、变量的命名 三、变量的声明 四、变量的类型 五、变量的作用域 六、变量的赋值 七、变量的存活期 八、正确声明变量类型对运行时间的影响 九、给初学者的建议
变量是用于保存程序运行过程中的临时值。和常量不同的是,变量是一个指定的内存位置,用于保存代码执行过程中可以更改的值。
变量有两种:动态变量和静态变量
静态变量和动态变量的区别:
动态变量:过程每运行一遍,动态变量的值会重置;
静态变量:过程每运行一遍,静态变量的值还是上一次过程运行的结果。
Sub 静态和动态变量() Dim a As Integer '动态变量 Static b As Integer '静态变量 a = a + 1 b = b + 1 Debug.Print a; b End Sub
在VBA中,可以使用名称来表示内存的位置,这个名称就是标识符,可以理解为变量的名字。
变量命名的注意事项:
1、第一个字符必须使用英文字母或中文字符(中文版EXCEL支持中文字符);
2、名称长度不超过255个字符;
3、名称不能与VBA本身的Function过程、语句、即方法的名称相同,避免冲突;
4、不能在同一范围的相同层级中使用重复的名称。
在使用变量时,需要告诉VBA程序,变量的名称和数据类型,即声明变量。
通常用Dim语句来声明动态变量,用Static语句来声明静态变量。
声明数据类型后,可以在计算机内建立一个指定的存储位置,这样在运行代码时程序就会很快,内存利用效率很高,否则,计算机还要耗用很大的内存来判断其数值类型,运行会比较慢。
1、声明变量的写法
声明变量通常都是在程序开始处,可以在同一行声明多个变量,用英文逗号间隔即可。写法如下:
Dim 变量1 As 变量类型,变量2 As 变量类型,…… Static 变量1 As 变量类型,变量2 As 变量类型,……
2、强制声明变量
要强制声明变量,直接在输入代码时最顶头输入【Option Explicit】,就可以,我们看下图的效果:
Option Explicit '强制声明变量设定 Sub test() Dim ss As Integer '如果最前面有Option Explicit,此处没有声明,会报错 Debug.Print ss + 1 End Sub
① 未设置强制声明变量,在未声明变量的状态下,代码可以正常执行;
② 设置了强制声明变量,在未声明变量的状态下,无法执行代码,提醒变量未定义;
③ 设置了强制声明变量,在声明了变量的状态下,代码执行通过。
扩展:如果不会写【Option Explicit】,是否有快捷方法实现强制声明变量呢?当然有
VBE编辑器菜单的工具→选项→编辑器→勾选要求变量声明。确定后,每次插入模块,都会在模块前面增加【Option Explicit】
类型 | 小类 | 关键字 | 类型 声明符 |
储存空间 | 值范围 | detail |
数值型 | 整型 | Integer | % | 2个字节 | -32768〜32767 | 不带小数的数,包括正整数、负整数和零 |
数值型 | 长整型 | Long | & | 4个字节 | -21亿〜21亿 | 不带小数的数,包括正整数、负整数和零 |
数值型 | 单精度型 | Single | ! | 4个字节 | 带有小数的数值,可以表示7位有效数字 | |
数值型 | 双精度型 | Double | # | 8个字节 | 带有小数的数值,可以表示15位有效数字 | |
数值型 | 字节型 | Byte | 1个字节 | 0〜255 | 表示无符号的整数 | |
布尔型 | Boolean | 2个字节 | True 或 False | |||
日期型 | Date | 8个字节 | 1/1/100 〜12/21/9999 | 前后各用一个#号把日期和时间括起来 如:【#2020/3/27 23:09:29#】 | ||
字符串 | String | $ | 字符串长 | 用双引号引起来的一串字符串,在VBA中,一个汉字为1个字符 | ||
小数型 | Decimal | 14个字节 | 用于储存由10次冪换算的有符号整数 | |||
货币型 | Currency | @ | 8个字节 | |||
对象型 | Object | 4个字节 | 表示应用程序中的对象,如单元格、工作表 | |||
变体型 | Variant | 按需分配 | 可变的数据类型,可以存放任何类型的数据,当指定为变体型时,不必在数抿类型间转換,VBA会自动转换。注:在程序中不特别说明,默认为变体型,由于变体型存放空间大,因此不在特殊情况下不适用。 |
VBA中的变量类型及相关参数,详见上表,我们在声明变量时,要选择合适的变量类型。
比如变量的值为整数,就把变量声明为Integer型;
如果变量的值是大于32767的整数,就要把变量声明为Long型;
如果变量是时间,就要把变量声明为Date型(在工作表中,时间是数值的一种;但是在VBA中,要根据情况明确;声明数值时,还要根据数值的形式、范围选择合适的数值类型)
注意:
1、Variant型(变体型)可以存放任何类型的数据,当指定为变体型时,不必在数据类型间转换,VBA会自动转换;
2、在程序中不特别说明时,均默认为变体型;
3、由于变体型存放空间大,因此不在特殊情况下不适用该类型。
作用域就是变量使用范围,VBA中有三种级别的作用域:过程级变量、模块级变量和全局级级变量。
1、过程级变量:过程级变量只在变量所在的过程中有效。
Sub Test() Dim a As Integer Debug.Print a + 1 End Sub
如上面这个Test过程,这里声明的变量a,就只能用于此过程中。
2、模块级变量:在同一个模块内通用的变量。
与过程级变量声明的不同方式在于,写过程前先声明变量,模块级代码的声明方式如下:
方法①:Dim 变量 As变量类型
方法②:Private 变量 As 变量类型
'Option Explicit Dim a As Integer '定义到最前面 Private b As Integer Sub test2() a = 3 b = 4 Debug.Print a + b End Sub
演示过程解析(强制声明变量状态下演示):
① 在模块1中声明了变量a,在模块1中运行通过;
② 切换到模块2,Test2过程中有一个未声明的变量a,直接运行,提示变量未申请;
③ 用Private声明了变量b,然后将模块1和模块2过程中的变量都修改为b,在模块2中运行通过,在模块1中运行错误。
④通过演示得出结论,这两种声明变量的方式生成的都是模块级变量,只能在当前模块中使用,跨模块使用无效。
3、全局级变量:在该工程内通用的变量。
全局变量与过程级变量声明的方式相同,都是写过程前先声明变量,全局变量的声明方式如下:
Public 变量 As 变量类型
Public a As Integer Sub test2() Debug.Print a + 1 End Sub
演示过程解析(强制声明变量状态下演示):
① 在模块1中声明了全局变量a,在模块2中声明了全局变量b;
② 模块1种Test过程中有变量a和b,运行通过;
③ 模块2种Test2过程中有变量a和b,运行通过;
注意:
① 对于不同级的变量使用的原则,尽量使用过程级变量;
② 如果不同过程之间有共享值时,才使用全局级变量;
③ 要控制全局级变量的使用数量。
1、给文本、数值、日期等数据类型变量赋值
语句为: Let 变量名称 = 变量值(这里的Let可以省略,即:变量名称=变量值)
例如:
Sub 变量赋值() Dim str As String Let str = "我是上班下班" End sub
2、给对象变量(Object型,例如单元格)赋值
语句为:Set 变量名称=对象(这里Set千万不能少。)
例如:
Sub 变量赋值() Dim rng = Range Set rng = Worksheets("sheet1").Range("A1") rng.Value= "我是上班下班" End sub
变量的存活期就是指变量在内存中保留的时间,这个与变量的作用域有很大的关系。
1、过程级变量:
出现:当SUB过程开始执行时,过程级代码才储存到内存中;
结束:SUB过程执行完成时,变量占用的内存就会立即释放。
2、模块级变量:
出现:当程序开始运行时,模块级代码就储存到内存中;
结束:当关闭工作薄时,变量占用的内存才会释放。
3、全局级变量:
出现:当程序开始运行时,全局级代码就储存到内存中;
结束:当关闭工作薄时,变量占用的内存才会释放。
4、静态变量:
出现:当程序开始运行时,全局级代码就储存到内存中;
结束:当关闭工作薄时,变量占用的内存才会释放。
Sub 声明变量类型对运行时间的影响() '测试时可以注销或不注销下面的变量声明 Dim t As Long, a As Integer, b As Integer, c As Integer t = Timer For a = 1 To 20000 For b = 1 To 20000 c = a - b Next b Next a Debug.Print "共耗时:" & VBA.Format(Timer - t, "0.00") End Sub '共耗时:13.81 '共耗时:8.13
解析:
1、当不声明变量类型时,运行完成需要9.17秒;
2、当正确声明变量类型时,运行完成需要5..61秒;
3、如果换成更大量的数据、更复杂的运算,运行时间上的差距还会更大;
4、所以大家可以看到正确声明变量的总要性。
1、学习VBA是否一定要先学习变量?
① 初学者不必马上去学习定义变量的各种知识,直接写代码照样可以入门;
② 入门以后再学习定义变量的方法,并根据自己的认识取舍即可;
2、是否必须在程序开头加上Option Explicit?
在电脑286、386时代,在DOS程序代码时代,在内存仅16M,32M时代,你必须定义好每一个变量的数据类型,以便最高效地进行内存使用。即,一个口袋里只有10元钱的人,要生活一周,于是你必须精打细算好每一分钱,否则就会饿死。
Option Explicit 的作用,就在于:如果你的程序没有做到精确定义每一个变量的数据类型,编译程序就会拒绝执行,它认为你太奢侈了,不懂得节约使用每一分钱。
而现在的电脑硬件环境,已经是过去的几千倍了。每一个人口袋里都有几百万的钱,还有必要去考虑一分钱、一元钱的用法么?
3、是否需要dim 所有变量?
好处:不同的数据类型,占用大小不同的字节,因此计算时对内存的占用和运算效率有所不同。因此,定义变量数据类型以后,可能的好处是少占用一些内存以及大量重复运算是提高计算速度。
坏处:由于各种类型占用字节的限制,它所能代表的数值范围受到了限制!如果初学者试图去使用定义变量类型的方法时,往往尚未得到实际好处,即【运算速度提高】的好处(但实际运算量小时速度的差别很小、很小可以完全忽略不计)却首先受到了因为不能恰如其份地定义好变量类型,而造成了变量溢出或冲突导致代码无法运行的严重后果。
比如:如果你不了解Integer的范围,在超出变量范围的情况下使用就会提示出错。比如“溢出“
Sub demo() Dim i As Integer i = Cells(Rows.Count, 1).End(3).Row Debug.Print i i = Rows.Count '会溢出 End Sub
4、动态数组是否必须定义?
Dim arr、Dim txt、Dim Num全部无意义,因为:
Dim arr 等价于 Dim arr As Variant
Dim txt 等价于 Dim txt As Variant
Dim Num 等价于 Dim Num As Variant
5、学习VBA,完全可以先实战后深入,不必花费太多时间再如何声明好变量类型上,能事半功倍。抛开一些没必要的东西先让程序跑起来的确更重要。
本页共198段,5535个字符,11602 Byte(字节)