Variable Naming Conventions
You can call your variables and user-defined functions anything you want, except where there is a clash
with VBA keywords and function names. However, many programmers adopt a system whereby the
variable or object type is included, in abbreviated form, in the variable name, usually as a prefix, so
instead of declaring:
Dim SalesData As Double
you can use:
Dim dSalesData As Double
Wherever dSalesData appears in your code, you will be reminded that the variable is of type Double.
Alternatively, you could use this line of code:
Dim dblSalesData As Double
For the sake of simplicity, this approach has not been used so far in this chapter, but from here onward,
the examples will use a system to create variable names. This is the convention used in this book:
❑ One-letter prefixes for the common data types:
Dim iColumn As Integer
Dim lRow As Long
Dim dProduct As Double
Dim sName As String
Dim vValue As Variant
Dim bChoice As Boolean
❑ Two- or three-letter prefixes for object types:
Dim objExcel As Object
Dim rngData As Range
Dim wkbSales As Workbook
In addition to these characters, a lowercase a will be inserted in front of array variables, which are discussed
later in this chapter. If the variable is a module-level variable, it will also have a lowercase m
placed in front of it. If it is a public variable, it will have a lowercase g (for global) placed in front of it.
For example, malEffect would be a module-level array variable containing long integer values.
通常,各种命名规则都用小写的前缀或后缀来指定变量的类型和作用范围。变量本身应当用有意义的名称来说明它是什么或要做什么。多字变量名由几个字连接在一起,每个字的第一个字母大写,并且不使用下划线。如果您用过变量名模板,其格式应当如 prefixNoun 或 prefixNounVerb。
常量名也应当有一定的意义,格式为 NOUN 或 NOUN_VERB。常量名均为大写,字之间用下划线分隔。尽管给常量名添加字符以指定数据类型和作用范围的做法不存在技术性错误,但通常不这么做。常量与变量都是数据的符号表示,在此意义上,二者完全相同。区别在于变量可以变化,而常量则保持不变。
变量名和常量名最多可以包含 255 个字符,但是,超过 25 到 30 个字符的名称比较笨拙。此外,要想取一个有实际意义的名称,清楚地表达变量或常量的用途,25 或 30 个字符应当足够了。
1 变量名
变量名使用大小写混合的格式(Noun 或 NounVerb),以此指定变量是什么以及它要做什么。大小写混合格式被用作变量名的说明部分,在这里每个字的第一个字母大写而其余字母小写。
变量名还有两个或三个字符的前缀,用来指定变量的数据类型。例如,以下语句声明的变量都用前缀指定变量的数据类型:
- Dim strRecipientName As String
- Dim intItemsProcessed As Integer
- Dim blnContinueProcessing As Boolean
两个字符的前缀通常用来指定 Office 应用程序对象类型。例如:
- Dim xlApp As Excel.Application
- Dim olNameSpace As Outlook.NameSpace
- Dim wdNewDoc As Word.Document
在声明一般变量或对象变量时,要使用 "obj" 前缀。即使要创建代表 Microsoft® Office 应用程序的晚期绑定对象变量,也应当使用该前缀。例如:
- Dim objXLApp As Object
- Dim objWDDocument As Object
- Dim objOLMailItem As Object
全局变量和模块级变量还要再加一个字符前缀来表示它们的作用范围。变量的作用范围定义了变量的生存期和可见性。全局变量和模块级变量都有永久的生存期。就是说,只要应用程序不关闭,变量就一直占用分配给它的内存。过程内声明的变量只在声明它们的过程中有效,其生存期为过程代码的执行时间。但是,用关键字 Static 来声明变量的情况例外。
全局变量有小写的 "g" 作前缀,并在模块的“声明”部分用 Public 语句声明。它对应用程序中所有模块内的所有过程可见。例如,Public gstrPathToDataSource As String 是一个全局变量,它包含了一个字符串,而该字符串是应用程序中所使用的数据源的路径。
应当尽可能始终使用最小的作用范围来定义变量。只有在找不到其他途径来共享变量所包含的数据时,才应当使用全局变量。全局变量会使代码难以理解和维护。如果您使用的全局变量过多,且未经过仔细挑选,则可能需要重新设计代码,以便减少全局变量。
模块级变量有小写的 "m" 前缀,是在模块的“声明”部分用 Dim 或 Private 语句声明的。它们对声明时所处模块中的所有过程可见。例如,Dim mrstCustomerRecords As ADODB.Recordset 是用于客户记录的模块级对象变量。在类模块中,用 Private 语句声明的模块级变量具有前缀 "p_"。类模块中公共的模块级变量作为类属性出现,不应当有任何前缀表示它们的数据类型或作用范围。
过程级变量是在过程内用 Dim 语句创建的。例如,Dim intCurrentMailItem As Integer 是一个用作循环计数器的过程级变量。此外,过程级变量可以用 Static 关键字声明。即使声明静态变量的过程已经结束运行,静态变量仍然会保留它们的值。静态的过程级变量具有小写的 "s" 前缀。例如,Static scurTotalSales As Currency 将创建一个过程级静态变量,用于在一个计算当前销售额的过程中保存累加和。
用户定义类型变量在模块的“声明”部分中声明,声明时名称全部大写并且后跟 "_TYPE"。可以按如下方式声明用户定义类型:
- Type EMPLOYEEINFO_TYPE
- strFullName As String
- lngEmployeeID As Long
- datStartDate As Date
- strDepartmentCode As String * 4
- curSalary As Currency
- End Type
应当使用 "udt" 前缀来声明 EMPLOYEEINFO_TYPE 类型的模块级变量。例如,
- Dim mudtEmployeeRecord As EMPLOYEEINFO_TYPE
数组变量有小写 "a" 作前缀,而且,如果不是 Variant 型,则后跟一对圆括号。数组是可以包含多个值的变量。数组变量要使用 Dim 语句声明,例如,Dim alngNum() 是长整型的数组变量。当需要存储多个相同类型的值,而又不希望为它们分别创建单个变量的时候,数组会非常有用。
下面是一些使用前述常规命名规范的变量名称示例:
2 常量名
常量使用由全部大写的多个字组成的说明型名称,每个字之间用下划线分隔。声明常量时,要使用 Const 语句以及常量名、它的数据类型和它的值。例如,如下常量可以在模块的“声明”部分声明,以提供应用程序所使用的数据源的路径:
- Public Const DATABASE_PATH As String = "C:/Solutions/Source/AppData.mdb"
注意 如果使用 Public 关键字来声明常量,那么应用程序中任何模块的任何过程都可以使用该常量。如果不使用 Public 关键字,那么常量只有模块级的作用范围,这意味着它只能被声明它的模块所包含的过程使用。如果常量是在过程内声明的,那么它只能用于该过程内的代码,并且生存期仅为过程内代码的执行期间。
Prefixes like i, s, g, and m can be very useful in understanding the value and the scope of a constant. For example, gsNEW_LINE new line character string (g indicates that it is global to entire application and s indicates that this is a string)
下面是一些使用前述常规命名规范的常量名称示例:
- ACCESS_CONNECTSTRING
- API_MAX_STRINGBUFFER
- SQL_STRING
注意 如果在类模块中创建公共枚举常量,可以使用不同的命名规则来将它们与其他常量区分开来。Constants should be prefixed by the scope prefixes m or g for module or global, respectively. A constant is indicated by appending the letter c to the end of the data type or it can have the generic tag con. For examples, gintcDiscount. g is the scope, intc indicates the datatype and that it is a constant, with the base name of Discount. conDiscount names the same constant, but conveys less information. mdblcPi indicates module level, double integer constant with the base name Pi.
除了您自己声明的常量外,Microsoft® Visual Basic® for Applications (VBA) 以及每个 Microsoft® Office 应用程序都包含了有预定义值的内置常量(即内部常量)。应当始终使用内部常量,而不用它们代表的值。同用户定义的常量一样,使用内部常量的好处是它们可以使您的代码更容易被理解。例如,比较下面两组代码示例,一组使用内部常量,另一组则没有使用内部常量。请判断内部常量是否可以使代码更容易理解。
- If MsgBox("Proceed Now?", 48 + 512 + 3 + 16384, "Continue?")= 7 Then
- DoCmd.OpenForm "Customers", 0, , , 1, 3
- End If
- If MsgBox("Proceed Now?", vbExclamation + vbDefaultButton3 + _
- vbYesNoCancel + vbMsgBoxHelpButton, "Continue?")= vbNo Then
- DoCmd.OpenForm "Customers", acNormal, , , acFormEdit, acDialog
- End If
要查看VBA和每个Office应用程序的内部常量的完整列表,请打开“对象浏览器”,然后从“项目/库”对话框中选择合适的类型库,再在“搜索”文本框中键入相应的常量前缀,然后在“对象浏览器”工具栏上单击“搜索”。下表是从内部常量的完整列表中提取的部分示例。