变量名称

变量保存数据。使用名词命名它们,而不是在它们的数据类型或范围之后。如果你觉得有必要为变量编号 (例如 thing1, thing2, thing3),那么请考虑使用适当的数据结构(例如数组,CollectionDictionary)。 **

表示可迭代值的变量的名称 - 例如,数组,CollectionDictionaryRange 的单元格应该是复数。

因此,一些常见的 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

但是,鉴于 IntelliSense 对变量和常量使用不同的图标,PascalCase 名称会使代码看起来更清晰,同样好。

IntelliSense 使用不同的图标用于常量 Foo 和变量 Bar

匈牙利表示法

在它们用于它们之后命名它们,而不是在它们的数据类型或范围之后。

匈牙利表示法可以更容易地看到变量的类型是什么

如果你编写的代码如程序遵循单一责任原则 (应该如此),那么你永远不应该在任何程序的顶部查看一系列变量声明; 声明变量尽可能接近它们的第一次使用,如果用明确的类型声明变量,它们的数据类型总是很明显。VBE 的 Ctrl + i 快捷键也可用于在工具提示中显示变量的类型。

使用什么变量比它的数据类型更有用的信息,特别是在诸如 VBA 之类的语言中,根据需要愉快地和隐式地将类型转换为另一种类型。

在这个例子中考虑 iFilestrFile

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

strData 在顶部示例中通过了 ByRef,但除了我们很幸运地看到它已经明确地传递之外,没有迹象表明 strData 实际上是由函数返回的。

底部的例子命名为 outContent; 这个 out 前缀是匈牙利表示法的发明:帮助澄清变量的用途,在这种情况下,将其清楚地标识为 out 参数。

这很有用,因为即使通过引用显式传递参数,IntelliSense 本身也不会显示 ByRef

IntelliSense 显示“CanReadFile(ByVal path As String,outComment As String)As Boolean”当实际签名指定 outComment 显式通过引用传递时(ByRef)

这导致…

匈牙利完成的权利

Hungarian Notation 最初与变量类型没有任何关系 。事实上,正确的匈牙利表示法实际上是有用的。考虑这个小例子(ByValAs Integer 为 brevety 删除):

Public Sub Copy(iX1, iY1, iX2, iY2)
End Sub

相比于:

Public Sub Copy(srcColumn, srcRow, dstColumn, dstRow)
End Sub

srcdst 是这里的匈牙利表示法前缀,它们传达了有用的信息,这些信息无法从参数名称或 IntelliSense 中推断出来,向我们显示声明的类型。

当然,有一种更好的方式来传达这一切,使用适当的抽象和真实的单词,可以大声发出并有意义 - 作为一个人为的例子:

Type Coordinate
    RowIndex As Long
    ColumnIndex As Long
End Type

Sub Copy(source As Coordinate, destination As Coordinate)
End Sub