常量,也称常数,在程序过程中其值保持不变。常数可以是字符串、数值、另一常数、任何(除乘幂与Is之外的)算术运算符或逻辑运算符的组合。每个主应用程序都可定义自己的一组常数,也可以用Const语句定义附加常数。定义常量使程序设计变得更简单,可在代码中的任何地方使用常数代替实际的值或字符串,从而提高程序的可读性,并且更容易修改这个值。
1、系统自定义的常量
由应用程序与控件提供(提供对象库的其它的应用程序如 Microsoft Access、Microsoft Project以及Microsoft Word也提供常数列表),这些常数可与它们所属的对象,方法以及属性等一起使用。Visual Basic 的常数都列在 Visual Basic for Applications类型库以及 Data Access Object(DAO)程序库之中。(注:Visual Basic 仍会对之前的 Visual Basic 或 Visual Basic for Applications 所定义的常数做识别。可以将常数提取到对象浏览器之中。在对象浏览器中所列的常数,不用在的应用程序中声明)
在早期版本的VB中,常量的名称都是用大写字符串加上一个下划线组成,例如:TILE_HORIZONTAL。在系统自定义的常量中,由于具有相同名称的常量存在于多个对象库中,而且这些常量可能具有不同的值,因而可能会造成混淆。有两种方法来对常量名进行限定:
(1)用前缀限定常量
所有应用程序与控件对象库提供的自定义常数都以混合大小写格式显示,以两个字符为前缀来指出定义这些常量的对象库。例如,由Visual Basic for Applications 对象库常数以“vb”开头;而由Microsoft Excel对象库提供的常数以“xl”为开头。
(2)用库引用限定常量
可利用下面的语句来限定对常量的引用:
[libname.] [modulename.]constname
说明:
①libname,可选的。定义此常数的类型库。
②modulename,可选的。定义此常数的类型库所包含的模块的名称,可以利用“对象浏览器”来找到模块的名称。
③constname,在类型库中定义的常数名称。
ExcelVBA自定义常量类型,共16种,见下表。
VBA自定义常量类型表
常量类型 |
说明 |
常量类型 |
说明 |
Calendar |
日历常量 |
Keycode |
鼠标、键盘常量 |
CallType |
调用常量 |
Miscellaneous |
控制键常量 |
Color |
颜色常量 |
MsgBox |
消息框常量 |
Compiler |
编译常量 |
QueryClose |
程序控制常量 |
Date |
日期常量 |
Shell |
窗体控制常量 |
Dir、GetAttr和SetAttr |
目录常量 |
StrConv |
字符串转化常量 |
IMEStatus |
区域IME常量 |
系统颜色 |
系统颜色常量 |
Instr、StrComp |
字符比较常量 |
VarType |
数据类型常量 |
ExcelVBA自定义常量,另见VBA自定义常量列表,或查阅VBA帮助系统。
此外,Excel内置常量,另见Excel内置常量列表,或查阅VBA帮助系统。
2、用户自定义的常量
符号或用户自定义的常数都是利用 Const 语句来声明。
语法:
[Public|Private] Const 常量名 [As type] = expression
说明:
(1)[Public|Private],可选的参数,声明常量的作用域。Public关键字定义的常量适用于所有的模块,并在模块的第一个过程前进行声明;Private关键字定义的常量只适用于当前模块,并在该模块的第一个过程前进行声明;若只是在某个过程中使用常量,则在Sub或Function语句之后进行声明。
(2)常量名(constname),必要的参数,为Variant(String)型,名称要遵守变量命名的规定。
(3)expression,必要的参数,为文字、其他的条件编译常数或包含除了 Is 以外的算术或逻辑运算符的任意组合。不能使用变量,用户自定义的函数,或 Visual Basic 的内部函数(如Chr)。
(4)type,可选的参数,若没有声明数据类型,VBA将根据值决定数据的最合适的数据类型。可以是 Byte、 Boolean 、Integer、Long、Currency、Single、Double、Decimal(目前尚不支持)、Date、String 或 Variant。所声明的每个变量都要使用一个单独的 As 类型子句。
(5)若更改VBA过程中的某个常量的值,会出现错误消息。
(6)在默认情况下常数是过程级或单个模块级的。过程中的常数总是过程级的,不能改变。在标准模块中,可以用 Public 关键字来改变模块级常数的作用域。但在类模块中,常数只能是过程级或单个模块级的,用Public关键字也不能改变其作用域。
(7)可在一行中声明多个常数,即用逗号将每个常数赋值分开。用这种方法声明常数时,如果使用了Public或Private关键字,则该关键字对该行中所有常数都有效。
3、条件编译常量
利用#Const语句声明。
语法:
#Const constname = expression
说明:
(1)constname,必要的参数,为Variant(String)型,名称要遵守变量命名的规定。
(2)expression,必要的参数,为文字、其他的条件编译常数或包含除了Is以外的算术或逻辑运算符的任意组合。使用一个用#Const定义的标准常数,或者使用一个未定义的常数,都会导致错误发生。反之,用#Const关键字定义的常数也只能用于条件编译。
(3)条件编译常数在其出现的模块中总是 Private,不可能利用#Const指令建立Public 编译常数,Public 编译常数只能在用户接口中建立。不管条件编译常数在程序中的位置如何,都总是在模块级别中进行计算。