VBA 变量名
示例
变量保存数据。使用名词为它们命名,而不是根据其数据类型或作用域命名。如果您不得不对变量进行编号(例如),则可以考虑使用适当的数据结构(例如数组,a或a)。thing1,thing2,thing3CollectionDictionary
表示一组可迭代值的变量的名称(例如,数组,aCollection,aDictionary或aRange的单元格)应为复数形式。
因此,一些常见的VBA命名约定如下:
对于过程级变量:
camelCase
Public Sub ExampleNaming(ByVal inputValue As Long, ByRef inputVariable As Long) Dim procedureVariable As Long Dim someOtherVariable As String End Sub
对于模块级变量:
PascalCase
Public GlobalVariable As Long Private ModuleVariable As String
对于常量:
SHOUTY_SNAKE_CASE通常用于区分常量和变量:
Public Const GLOBAL_CONSTANT As String = "Project Version #1.000.000.001" Private Const MODULE_CONSTANT As String = "Something relevant to this Module" Public Sub SomeProcedure() Const PROCEDURE_CONSTANT As Long = 10 End Sub
但是PascalCase,鉴于IntelliSense对变量和常量使用不同的图标,因此名称使代码看起来更简洁并且也一样好:
匈牙利文符号
以它们的用途命名,而不是以其数据类型或范围命名。
“匈牙利表示法使查看变量的类型更加容易”
如果您编写诸如遵循单一职责原则的程序之类的代码(应该如此),则永远不要在任何程序的顶部查看一系列变量声明;声明变量时应尽可能接近其首次使用,如果使用显式类型声明变量,则数据类型将始终清晰可见。VBE的Ctrl+i快捷方式也可以用于在工具提示中显示变量的类型。
变量所用的信息比其数据类型有用的信息多得多,尤其是在VBA之类的语言中,它可以根据需要将一种类型愉快地和隐式地转换为另一种类型。
考虑iFile并strFile在此示例中:
Function bReadFile(ByVal strFile As String, ByRef strData As String) As Boolean Dim bRetVal As Boolean Dim iFile As Integer On Error GoTo CleanFail iFile = FreeFile Open strFile For Input As #iFile Input #iFile, strData bRetVal = True CleanExit: Close #iFile bReadFile = bRetVal Exit Function CleanFail: bRetVal = False Resume CleanExit End Function
相比于:
Function CanReadFile(ByVal path As String, ByRef outContent As String) As Boolean On Error GoTo CleanFail Dim handle As Integer handle = FreeFile Open path For Input As #handle Input #handle, outContent Dim result As Boolean result = True CleanExit: Close #handle CanReadFile = result Exit Function CleanFail: result = False Resume CleanExit End Function
strDataByRef在最上面的示例中被传递,但是除了我们很幸运地看到它被这样显式传递的事实之外,没有迹象表明该函数strData实际上返回了。
最下面的例子将其命名outContent;此out前缀是匈牙利符号的发明目的:为了帮助弄清变量的用途,在这种情况下,可以清楚地将其标识为“输出”参数。
这很有用,因为ByRef即使参数通过引用显式传递,IntelliSense本身也不会显示:
这导致...
匈牙利语正确完成
匈牙利表示法最初与变量类型没有任何关系。实际上,正确的匈牙利表示法实际上是有用的。考虑这个小例子(为简洁起见ByVal,AsInteger将其删除):
Public Sub Copy(iX1, iY1, iX2, iY2) End Sub
相比于:
Public Sub Copy(srcColumn, srcRow, dstColumn, dstRow) End Sub
src并且dst是匈牙利命名法前缀在这里,他们传达有用的,可以没有其他已经从参数名称或智能感知显示我们声明的类型推断的信息。
当然,有一个更好的方式来传达这一切,使用适当的抽象和可以大声说出并有意义的真实词-例如一个人为的例子:
Type Coordinate RowIndex As Long ColumnIndex As Long End Type Sub Copy(source As Coordinate, destination As Coordinate) End Sub