變數名稱

變數儲存資料。使用名詞命名它們,而不是在它們的資料型別或範圍之後。如果你覺得有必要為變數編號 (例如 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