VBA 命名規則及代碼規範
馬維峰 ([email protected] )
1. VBA 命名規則
一個好的命名規則可以提高程式的可讀性,減少錯誤發生的機率,命名規則不是一定的,不同的人有不同的規則和習慣,但在程式設計過程中,對于個人或工作組,一定要遵守相同的命名規則。
1.1. 變量、常量、自定義類型和枚舉
表 1 ‑1 概括了變量、常量的基本命名規則。
表 1 ‑ 1 變量、常量和枚舉類型的命名規則
元素 | 命名規則 |
變量 | < 範圍 >< 數組 >< 資料類型 > 描述(首字母大寫) |
常量 | < 範圍 >< 資料類型 > 描述(全部大寫) |
使用者自定義類型 | Type 描述名稱 < 資料類型 > 描述 End Type |
枚舉類型 | Enum < 工程字首 > 一般描述 < 工程字首 >< 一般描述 >< 具體名稱 1> < 工程字首 >< 一般描述 >< 具體名稱 2> End Enum |
< 範圍 > 表示了變量的作用域,對于 Private 類型和子產品級變量,一般使用“ m ”字首表示,對于 Public 類型的變量,一般使用“ g ”字首表示,而對于過程内的局部變量,則不使用字首。如果是數組,在範圍字首後增加“ a ”表示變量為數組。
對于資料類型,一般使用 表 1 ‑2 的字首表示。
表 1 ‑ 2 命名規則常用字首
字首 | 資料類型 | 字首 | 資料類型 | 字首 | 資料類型 |
is | Boolean | cm | ADODB.Command | cmb | MSForms.ComboBox |
byt | Byte | cn | ADODB.Connection | chk | MSForms.CheckBox |
cur | Currency | rs | ADODB.Recordset | cmd | MSForms.CommandButton |
dte | Date | fra | MSForms.Frame | ||
dec | Decimal | cht | Excel.Chart | lbl | MSForms.Label |
f | Double , Single | rng | Excel.Range | lst | MSForms.ListBox |
i | Integer , Long | wb | Excel.Workbook | mpg | MSForms.MultiPage |
obj | Object | ws | Excel.Worksheet | opt | MSForms.OptionButton |
str | String | spn | MSForms.SpinButton | ||
u | User-defined type | cbr | Office.CommandBar | txt | MSForms.TextBox |
v | Variant | ctl | Office.CommandBarControl | ref | RefEdit Control |
col | VBA.Collection | cls | 自定義類 | frm | 使用者窗體 |
變量的描述部分最好使用有意義的字元串,使用 1-2 個英文單詞表示,首字母大寫,例如“ strUserName ”、“ iPeopleAge ”。除了循環變量使用 i 、 j ,臨時變量使用 tmp 之類的變量外,不要使用太短的命名,但也不要使用太長不易記憶的名稱。
常量則一般使用全部大寫的方式,以與變量差別。
對于枚舉類型,整個工程一定要使用一緻的規則,每個枚舉常量都包含工程字首,變量字首和本身描述幾部分,例如:
Private Enum schDayType
schDayTypeUnscheduled
schDayTypeProduction
schDayTypeDownTime
schDayTypeHoliday
End Enum
1.2. 過程和函數
過程和函數命名一般使用“名詞 + 動詞”的方式,首字母大寫,也可以使用“動詞 + 名詞”方式,對于過程和函數的參數,命名方式見前,為了和局部變量差別,可以不使用表示參數變量類型的字首。例如,我們可以命名如下的過程:
GetUserName(id as long) As String
1.3. 子產品、類子產品和使用者窗體
子產品使用類似過程的命名,用幾個表示其用途的首字母大寫的短語來表示,例如“ PlotChartTools ”;類子產品增加字首“ C ”,以與标準子產品相差別,例如“ CIniTools ”、“ CEmployee ”等;使用者窗體則以“ frm ”為字首,如“ frmAbout ”、“ frmRegTools ”。這樣,在代碼中我們可以這樣使用類子產品:
Dim clsMyClass As CMyClass
Set clsMyClass = New CMyClass
類子產品與其對象差别一目了然。由于 VBA 對于窗體可以使用預設窗體,不需要建立執行個體,在代碼中可以直接使用,是以,使用了與變量定義一樣的字首。例如:
frmRegTools.Show
1.4. VBA 工程
VBA 工程一般使用與其檔案名同名的名字,一方面,當打開幾個工程的時候可以友善的區分工程,另一方面,在工程之間引用的時候,需要不同的名稱。
2. VBA 代碼規範
代碼規範表示了如何定義變量、過程、函數(見前),如何組織 代碼,控制縮進,添加注釋等内容。代碼規範的目的在于産生一緻的代碼,提高代碼的可讀性,使其易于修改和交流。以下規範并非必須遵守,當使用規範破壞了代 碼的可讀性,那麼就沒有必要遵從代碼規範了,這種情況需要自行判斷。
2.1. 代碼的排版
縮進
一般來說,代碼的縮進應該為 4 個空格,在 VBA IDE 中選中自動縮進,并設定為 4 個字元。一個過程的語句要比過程名稱縮進 4 個空格,在循環,判斷語句、 With 語句之後也要縮進。例如:
If strText = " " Then
NoZeroLengthString = Null
Else
NoZeroLengthString = strText
End If
行的長度
一行代碼盡量不要過長,對于大多數程式設計規範,建議一行代碼的最大長度為 80 個字元,在 VBA 中,可以使用續行賦“ - ”将長的代碼行分為數行,後續行應該縮進以表示與前行的關系。例如:
AverageValue = TotalValue / _
Worksheet(1).Range( ″ A1:A1000 ″ ).Rows.Count
空行
一個子產品内部,過程之間要使用空行隔開,子產品的變量定義和過程之間也應該空 1 行。過程内部,變量定義和代碼應該空 1 行。在一組操作和另一組操作之間也應該空 1 行顯示其邏輯關系。空行可以很好的提高程式的可讀性,但同時,空行沒有必須遵守的規則,其使用的目的就是要顯示程式的邏輯關系。
不要将多個語句放在同一行上
雖然 VBA 允許将多條語句放在一行,但不推薦這麼做。
2.2. 注釋
書寫程式的同時,應該同時對關鍵代碼,子產品,過程增加注釋,更改程式的同時,必須同時更改注釋。必須時刻保證注釋與程式代碼一緻,否則還不如不加注釋。對于簡短的注釋,不需要加句号,否則應該增加句号,組成段落。
如果可能,建議盡量使用英文書寫注釋,因為這樣會帶來交流的便利,特别是在正式的開發中。
區塊注釋
區塊注釋通常描述其下的部分或全部代碼,例如子產品說明或者過程說明。其縮進要和它所描述的代碼一緻。子產品的注釋應該位于子產品的所有代碼之前, Option 語句之後,過程的注釋位于過程定義之後,并保證縮進一緻。對于子產品的注釋,注釋結束後應該有一空行,其前後可以加一些修飾以差別與其他注釋,而過程注釋則不需要。例如:
#001 Option Explicit
#002
#003 '***************************************************
#004 ' 主程式子產品,提供按鈕調用,對話框彈出等服務
#005 '***************************************************
#006
#007 Public Const strVer As String = "0.31"
#008
#009 Public Sub GeoDrawMain()
#010 ' 主程式子產品,單擊按鈕後彈出
#011 frmMain.Show vbModal
#012 End Sub
行内注釋
行内注釋的形式是在語句的同一行中加注釋,行内注釋應該簡單明了,并不要描述顯而易見的事情。行内注釋和語句至少應該有 2 個以上空格。可以在語句和注釋之間使用多個 Tab 使注釋對齊,例如:
Dim iAge As Long ‘ 年齡
Dim strName As String ‘ 姓名
2.3. 程式版本
建議在子產品注釋中包括作者,修改時間,版本等資訊,例如:
' 子產品名稱:氣壓計算子產品
' 描述: …
' 作者: Mars
' 建立時間: 2004 年 4 月 23 日
' 修改時間: 2005 年 7 月 13 日
' 版本: 2.5
此類注釋應該形成自己的風格,在所有的工程中保持一緻。對于團隊工作和正式開發,應該嚴格要求在子產品注釋中包括這些内容。
2.4. 一些基本原則
明确說明作用範圍
在代碼中,對于子產品級的變量,過程,函數,應該總是使用“ Public ”、“ Private ”等關鍵字明确說明其範圍。
使用有意義的名稱
一定要使用有意義的名稱,而不要使用簡單的 A 、 B 、 C 之類的名稱(循環變量約定俗成使用 i 、 j 等名稱除外)。
明确參數和變量的資料類型
在定義過程參數的時候,一定要明确指定其資料類型和傳遞方式( ByRef 或者 ByVal ),這不僅僅是考慮效率,而是為了友善對這些過程的使用。對于變量定義,也應該養成明确說明其資料類型的習慣。
子產品内的過程排序
子產品内部的過程應該按照“ Public ”、“ Private ”的順序排序,公有的過程在前,私有在後;然後再按照過程名稱字母順序排序。
使用常量和枚舉
應該盡量使用常量和枚舉,而不要在程式代碼中使用數字(幻數)。
語句的選擇
對于 True 、 False 的判斷,使用 If 語句,對于多種可能的判斷,使用 Select 語句。對于循環,對于确定循環次數的循環,使用 For 語句,對于不确定循環次數的循環,使用 Do While 語句,盡量對集合使用 For Each 語句。
Goto 語句
除了錯誤處理,不要使用 Goto 語句。