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