Technorati 標籤: VBA,命名規範,常量,變數
通常,各種命名規則都用小寫首碼或尾碼來指定變數的類型和作用範圍。變數本身應當用有意義的名稱來說明它是什麼或要做什麼。多字變數名由幾個字串連在一起,每個字的第一個字母大寫,並且不使用底線。如果您用過變數名模板,其格式應當如 prefixNoun 或 prefixNounVerb。
常量名也應當有一定的意義,格式為 NOUN 或 NOUN_VERB。常量名均為大寫,字之間用底線分隔。儘管給常量名添加字元以指定資料類型和作用範圍的做法不存在技術性錯誤,但通常不這麼做。常量與變數都是資料的符號表示,在此意義上,二者完全相同。區別在於變數可以變化,而常量則保持不變。
變數名和常量名最多可以包含 255 個字元,但是,超過 25 到 30 個字元的名稱比較笨拙。此外,要想取一個有實際意義的名稱,清楚地表達變數或常量的用途,25 或 30 個字元應當足夠了。
1 變數名
變數名使用大小寫混合的格式(Noun 或 NounVerb),以此指定變數是什麼以及它要做什麼。大小寫混合格式被用作變數名的說明部分,在這裡每個字的第一個字母大寫而其餘字母小寫。
變數名還有兩個或三個字元的首碼,用來指定變數的資料類型。例如,以下語句聲明的變數都用首碼指定變數的資料類型:
- Dim strRecipientName As String
- Dim intItemsProcessed As Integer
- Dim blnContinueProcessing As Boolean
兩個字元的首碼通常用來指定 Office 應用程式物件類型。例如:
- Dim xlApp As Excel.Application
- Dim olNameSpace As Outlook.NameSpace
- Dim wdNewDoc As Word.Document
在聲明一般變數或物件變數時,要使用 "obj" 首碼。即使要建立代表 Microsoft Office 應用程式的晚期綁定物件變數,也應當使用該首碼。例如:
- Dim objXLApp As Object
- Dim objWDDocument As Object
- Dim objOLMailItem As Object
全域變數和模組層級變數還要再加一個字元首碼來表示它們的作用範圍。變數的作用範圍定義了變數的生存期和可見度。全域變數和模組層級變數都有永久的生存期。就是說,只要應用程式不關閉,變數就一直佔用分配給它的記憶體。過程內聲明的變數只在聲明它們的過程中有效,其生存期為過程代碼的執行時間。但是,用關鍵字 Static 來聲明變數的情況例外。
全域變數有小寫 "g" 作首碼,並在模組的“聲明”部分用 Public 語句聲明。它對應用程式中所有模組內的所有過程可見。例如,Public gstrPathToDataSource As String 是一個全域變數,它包含了一個字串,而該字串是應用程式中所使用的資料來源的路徑。
應當儘可能始終使用最小的作用範圍來定義變數。只有在找不到其他途徑來共用變數所包含的資料時,才應當使用全域變數。全域變數會使代碼難以理解和維護。如果您使用的全域變數過多,且未經過仔細挑選,則可能需要重新設計代碼,以便減少全域變數。
模組層級變數有小寫 "m" 首碼,是在模組的“聲明”部分用 Dim 或 Private 語句聲明的。它們對聲明時所處模組中的所有過程可見。例如,Dim mrstCustomerRecords As ADODB.Recordset 是用於客戶記錄的模組層級物件變數。在類別模組中,用 Private 語句聲明的模組層級變數具有首碼 "p_"。類別模組中公用的模組層級變數作為類屬性出現,不應當有任何首碼表示它們的資料類型或作用範圍。
程序層級變數是在過程內用 Dim 語句建立的。例如,Dim intCurrentMailItem As Integer 是一個用作迴圈計數器的程序層級變數。此外,程序層級變數可以用 Static 關鍵字聲明。即使聲明靜態變數的過程已經結束運行,靜態變數仍然會保留它們的值。靜態程序層級變數具有小寫 "s" 首碼。例如,Static scurTotalSales As Currency 將建立一個過程級靜態變數,用於在一個計算當前銷售額的過程中儲存累加和。
使用者定義型別變數在模組的“聲明”部分中聲明,聲明時名稱全部大寫並且後跟 "_TYPE"。可以按如下方式聲明使用者定義型別:
- Type EMPLOYEEINFO_TYPE
- strFullName As String
- lngEmployeeID As Long
- datStartDate As Date
- strDepartmentCode As String * 4
- curSalary As Currency
- End Type
應當使用 "udt" 首碼來聲明 EMPLOYEEINFO_TYPE 類型的模組層級變數。例如,
- Dim mudtEmployeeRecord As EMPLOYEEINFO_TYPE
陣列變數有小寫 "a" 作首碼,而且,如果不是 Variant 型,則後跟一對圓括弧。數組是可以包含多個值的變數。陣列變數要使用 Dim 語句聲明,例如,Dim alngNum() 是長整型的陣列變數。當需要儲存多個相同類型的值,而又不希望為它們分別建立單個變數的時候,數組會非常有用。
下面是一些使用前述常規命名規範的變數名稱樣本:
2 常量名
常量使用由全部大寫的多個字組成的說明型名稱,每個字之間用底線分隔。聲明常量時,要使用 Const 語句以及常量名、它的資料類型和它的值。例如,如下常量可以在模組的“聲明”部分聲明,以提供應用程式所使用的資料來源的路徑:
- Public Const DATABASE_PATH As String = "C:/Solutions/Source/AppData.mdb"
注意 如果使用 Public 關鍵字來聲明常量,那麼應用程式中任何模組的任何過程都可以使用該常量。如果不使用 Public 關鍵字,那麼常量只有模組層級的作用範圍,這意味著它只能被聲明它的模組所包含的過程使用。如果常量是在過程內聲明的,那麼它只能用於該過程內的代碼,並且生存期僅為過程內代碼的執行期間。
Prefixes like i, s, g, and m can be very useful in understanding the value and the scope of a constant. For example, gsNEW_LINE new line character string (g indicates that it is global to entire application and s indicates that this is a string)
下面是一些使用前述常規命名規範的常量名稱樣本:
- ACCESS_CONNECTSTRING
- API_MAX_STRINGBUFFER
- SQL_STRING
注意 如果在類別模組中建立公用枚舉常量,可以使用不同的命名規則來將它們與其他常量區分開來。Constants should be prefixed by the scope prefixes m or g for module or global, respectively. A constant is indicated by appending the letter c to the end of the data type or it can have the generic tag con. For examples, gintcDiscount. g is the scope, intc indicates the datatype and that it is a constant, with the base name of Discount. conDiscount names the same constant, but conveys less information. mdblcPi indicates module level, double integer constant with the base name Pi.
除了您自己聲明的常量外,Microsoft Visual Basic for Applications (VBA) 以及每個 Microsoft Office 應用程式都包含了有預定義值的內建常量(即內部常量)。應當始終使用內部常量,而不用它們代表的值。同使用者定義的常量一樣,使用內部常量的好處是它們可以使您的代碼更容易被理解。例如,比較下面兩組程式碼範例,一組使用內部常量,另一組則沒有使用內部常量。請判斷內部常量是否可以使代碼更容易理解。
- If MsgBox("Proceed Now?", 48 + 512 + 3 + 16384, "Continue?")= 7 Then
- DoCmd.OpenForm "Customers", 0, , , 1, 3
- End If
- If MsgBox("Proceed Now?", vbExclamation + vbDefaultButton3 + _
- vbYesNoCancel + vbMsgBoxHelpButton, "Continue?")= vbNo Then
- DoCmd.OpenForm "Customers", acNormal, , , acFormEdit, acDialog
- End If
要查看VBA和每個Office應用程式的內部常量的完整列表,請開啟“物件瀏覽器”,然後從“項目/庫”對話方塊中選擇合適的類型庫,再在“搜尋”文字框中鍵入相應的常量首碼,然後在“物件瀏覽器”工具列上單擊“搜尋”。下表是從內部常量的完整列表中提取的部分樣本。
參考文獻:
- http://www.excelpx.com/dispbbs.asp?boardid=118&id=16138
- Patricia Cardoza, Teresa Hennig, Armen Stein, Graham Seach. "Access 2003 VBA Programmer’s Reference", p.809-p.831, Wiley Publishing, Inc. 2004