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語句