1. VBA命名規(guī)則
一個(gè)好的命名規(guī)則可以提高程序的可讀性,減少錯(cuò)誤發(fā)生的概率,命名規(guī)則不是一定的,不同的人有不同的規(guī)則和習(xí)慣,但在編程過程中,對于個(gè)人或工作組,一定要遵守相同的命名規(guī)則。
表 1?1概括了變量、常量的基本命名規(guī)則。
表 1?1 變量、常量和枚舉類型的命名規(guī)則
元素 | 命名規(guī)則 |
變量 | <范圍><數(shù)組><數(shù)據(jù)類型>描述(首字母大寫) |
常量 | <范圍><數(shù)據(jù)類型>描述(全部大寫) |
用戶自定義類型 | Type 描述名稱 <數(shù)據(jù)類型>描述 End Type |
枚舉類型 | Enum <工程前綴>一般描述 <工程前綴><一般描述><具體名稱1> <工程前綴><一般描述><具體名稱2> End Enum |
<范圍>表示了變量的作用域,對于Private類型和模塊級變量,一般使用“m”前綴表示,對于Public類型的變量,一般使用“g”前綴表示,而對于過程內(nèi)的局部變量,則不使用前綴。如果是數(shù)組,在范圍前綴后增加“a”表示變量為數(shù)組。
對于數(shù)據(jù)類型,一般使用表 1?2的前綴表示。
表 1?2 命名規(guī)則常用前綴
數(shù)據(jù)類型 | 前綴 | 數(shù)據(jù)類型 | 前綴 | 數(shù)據(jù)類型 | |
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個(gè)英文單詞表示,首字母大寫,例如“strUserName”、“iPeopleAge”。除了循環(huán)變量使用i、j,臨時(shí)變量使用tmp之類的變量外,不要使用太短的命名,但也不要使用太長不易記憶的名稱。
常量則一般使用全部大寫的方式,以與變量區(qū)別。
對于枚舉類型,整個(gè)工程一定要使用一致的規(guī)則,每個(gè)枚舉常量都包含工程前綴,變量前綴和本身描述幾部分,例如:
Private Enum schDayType
schDayTypeUnscheduled
schDayTypeProduction
schDayTypeDownTime
schDayTypeHoliday
End Enum
過程和函數(shù)命名一般使用“名詞 + 動(dòng)詞”的方式,首字母大寫,也可以使用“動(dòng)詞 + 名詞”方式,對于過程和函數(shù)的參數(shù),命名方式見前,為了和局部變量區(qū)別,可以不使用表示參數(shù)變量類型的前綴。例如,我們可以命名如下的過程:
GetUserName(id as long) As String
模塊使用類似過程的命名,用幾個(gè)表示其用途的首字母大寫的短語來表示,例如“PlotChartTools”;類模塊增加前綴“C”,以與標(biāo)準(zhǔn)模塊相區(qū)別,例如“CIniTools”、“CEmployee”等;用戶窗體則以“frm”為前綴,如“frmAbout”、“frmRegTools”。這樣,在代碼中我們可以這樣使用類模塊:
類模塊與其對象差別一目了然。由于VBA對于窗體可以使用缺省窗體,不需要?jiǎng)?chuàng)建實(shí)例,在代碼中可以直接使用,因此,使用了與變量定義一樣的前綴。例如:
frmRegTools.Show
VBA工程一般使用與其文件名同名的名字,一方面,當(dāng)打開幾個(gè)工程的時(shí)候可以方便的區(qū)分工程,另一方面,在工程之間引用的時(shí)候,需要不同的名稱。
代碼規(guī)范表示了如何定義變量、過程、函數(shù)(見前),如何組織代碼,控制縮進(jìn),添加注釋等內(nèi)容。代碼規(guī)范的目的在于產(chǎn)生一致的代碼,提高代碼的可讀性,使其易于修改和交流。以下規(guī)范并非必須遵守,當(dāng)使用規(guī)范破壞了代碼的可讀性,那么就沒有必要遵從代碼規(guī)范了,這種情況需要自行判斷。
縮進(jìn)
一般來說,代碼的縮進(jìn)應(yīng)該為4個(gè)空格,在VBA IDE中選中自動(dòng)縮進(jìn),并設(shè)置為4個(gè)字符。一個(gè)過程的語句要比過程名稱縮進(jìn)4個(gè)空格,在循環(huán),判斷語句、With語句之后也要縮進(jìn)。例如:
If strText = " " Then
NoZeroLengthString = Null
Else
NoZeroLengthString = strText
End If
行的長度
一行代碼盡量不要過長,對于大多數(shù)編程規(guī)范,建議一行代碼的最大長度為80個(gè)字符,在VBA中,可以使用續(xù)行賦“-”將長的代碼行分為數(shù)行,后續(xù)行應(yīng)該縮進(jìn)以表示與前行的關(guān)系。例如:
AverageValue = TotalValue / _
Worksheet(1).Range(″A1:A1000″).Rows.Count
空行
一個(gè)模塊內(nèi)部,過程之間要使用空行隔開,模塊的變量定義和過程之間也應(yīng)該空1行。過程內(nèi)部,變量定義和代碼應(yīng)該空1行。在一組操作和另一組操作之間也應(yīng)該空1行顯示其邏輯關(guān)系??招锌梢院芎玫奶岣叱绦虻目勺x性,但同時(shí),空行沒有必須遵守的規(guī)則,其使用的目的就是要顯示程序的邏輯關(guān)系。
不要將多個(gè)語句放在同一行上
雖然VBA允許將多條語句放在一行,但不推薦這么做。
書寫程序的同時(shí),應(yīng)該同時(shí)對關(guān)鍵代碼,模塊,過程增加注釋,更改程序的同時(shí),必須同時(shí)更改注釋。必須時(shí)刻保證注釋與程序代碼一致,否則還不如不加注釋。對于簡短的注釋,不需要加句號,否則應(yīng)該增加句號,組成段落。
如果可能,建議盡量使用英文書寫注釋,因?yàn)檫@樣會(huì)帶來交流的便利,特別是在正式的開發(fā)中。
區(qū)塊注釋
區(qū)塊注釋通常描述其下的部分或全部代碼,例如模塊說明或者過程說明。其縮進(jìn)要和它所描述的代碼一致。模塊的注釋應(yīng)該位于模塊的所有代碼之前,Option語句之后,過程的注釋位于過程定義之后,并保證縮進(jìn)一致。對于模塊的注釋,注釋結(jié)束后應(yīng)該有一空行,其前后可以加一些修飾以區(qū)別與其他注釋,而過程注釋則不需要。例如:
#001 Option Explicit
#002
#003 '***************************************************
#004 '主程序模塊,提供按鈕調(diào)用,對話框彈出等服務(wù)
#005 '***************************************************
#006
#007 Public Const strVer As String = "0.31"
#008
#009 Public Sub GeoDrawMain()
#010 '主程序模塊,單擊按鈕后彈出
#011 frmMain.Show vbModal
#012 End Sub
行內(nèi)注釋
行內(nèi)注釋的形式是在語句的同一行中加注釋,行內(nèi)注釋應(yīng)該簡單明了,并不要描述顯而易見的事情。行內(nèi)注釋和語句至少應(yīng)該有2個(gè)以上空格??梢栽谡Z句和注釋之間使用多個(gè)Tab使注釋對齊,例如:
Dim iAge As Long ‘年齡
Dim strName As String ‘姓名
建議在模塊注釋中包括作者,修改時(shí)間,版本等信息,例如:
' 模塊名稱:氣壓計(jì)算模塊
' 描述:…
' 作者:Mars
' 創(chuàng)建時(shí)間:2004年4月23日
' 修改時(shí)間:2005年7月13日
' 版本:2.5
此類注釋應(yīng)該形成自己的風(fēng)格,在所有的工程中保持一致。對于團(tuán)隊(duì)工作和正式開發(fā),應(yīng)該嚴(yán)格要求在模塊注釋中包括這些內(nèi)容。
明確說明作用范圍
在代碼中,對于模塊級的變量,過程,函數(shù),應(yīng)該總是使用“Public”、“Private”等關(guān)鍵字明確說明其范圍。
使用有意義的名稱
一定要使用有意義的名稱,而不要使用簡單的A、B、C之類的名稱(循環(huán)變量約定俗成使用i、j等名稱除外)。
明確參數(shù)和變量的數(shù)據(jù)類型
在定義過程參數(shù)的時(shí)候,一定要明確指定其數(shù)據(jù)類型和傳遞方式(ByRef或者ByVal),這不僅僅是考慮效率,而是為了方便對這些過程的使用。對于變量定義,也應(yīng)該養(yǎng)成明確說明其數(shù)據(jù)類型的習(xí)慣。
模塊內(nèi)的過程排序
模塊內(nèi)部的過程應(yīng)該按照“Public”、“Private”的順序排序,公有的過程在前,私有在后;然后再按照過程名稱字母順序排序。
使用常量和枚舉
應(yīng)該盡量使用常量和枚舉,而不要在程序代碼中使用數(shù)字(幻數(shù))。
語句的選擇
對于True、False的判斷,使用If語句,對于多種可能的判斷,使用Select語句。對于循環(huán),對于確定循環(huán)次數(shù)的循環(huán),使用For語句,對于不確定循環(huán)次數(shù)的循環(huán),使用Do While語句,盡量對集合使用For Each語句。
Goto語句
除了錯(cuò)誤處理,不要使用Goto語句。