第一篇 Excel VBA基礎(chǔ) 第一章 Excel VBA 基礎(chǔ)知識(shí)
技巧1,、錄制宏并獲取有效的代碼 使用宏錄制器是獲取Excel VBA代碼最簡(jiǎn)單的方式,尤其是對(duì)于沒有任何編程經(jīng)驗(yàn)的VBA學(xué)習(xí)者,。例如希望在VBA中使用的Excel的“高級(jí)篩選”功能從圖1-1所示的Database工作表的數(shù)據(jù)表中獲得在圖1-2所示的Result工作表內(nèi)指定的日期范圍內(nèi)的數(shù)據(jù),,并將數(shù)據(jù)復(fù)制到以單元格B5開始的單元格區(qū)域。
其中“宏名”文本框顯示為默認(rèn)的名稱“Macro1”,,建議修改為有意義的名稱,,在“快捷鍵”文本框中輸入的字母將作為運(yùn)行宏的組合鍵即<Ctrl+Shift+字母>。在“保存在”下拉列表扣列出了保存錄制宏的3個(gè)位置:當(dāng)前工作簿,,新工作簿和個(gè)人宏工作簿,,選擇“當(dāng)前工作簿”將宏保存在活動(dòng)工作簿中,選擇“新工作簿”將宏保存在一個(gè)新的空工作簿,,選擇“個(gè)人宏工作簿”將宏保存在名為Personal.xls的特定文件中,,啟動(dòng)Excel時(shí)會(huì)自動(dòng)地裝載該文件。在“說明”文本框中添加宏的注釋,,即顯示在代碼頂部的文字,,用來提供與該宏相關(guān)的信息。 通常在錄制宏之前,,應(yīng)規(guī)劃好操作步驟,,盡可能少地錄制不必要的操作。 Step2 單擊“確定”按鈕開始錄制宏,。此時(shí)會(huì)出現(xiàn)如圖1-4所示的工具欄,,包含兩個(gè)按鈕:“停止 錄制”按鈕和“相對(duì)引用”按鈕,。單擊“停止錄制”按鈕將停止錄制操作,單擊“相對(duì)引用”按鈕將以相對(duì)于當(dāng)前單元格的方式錄制操作,。默認(rèn)的情況下,,Excel采用絕對(duì)引用的方式錄制宏。 注意:此時(shí)工作簿狀態(tài)欄中會(huì)出現(xiàn)“錄音”的提示,,菜單也由“錄制新宏”變?yōu)椤巴V逛浿啤薄?/SPAN> Step3 在Excel中進(jìn)行操作,。單擊菜單“數(shù)據(jù)”→“篩選”→“高級(jí)篩選”,在打開的“高級(jí)篩選”對(duì)話框中選中“將篩選結(jié)果復(fù)制到其他位置”單選按鈕,,如圖1-5所示,。 Step4 在“高級(jí)篩選”對(duì)話框中單擊“列表區(qū)域”文本框,然后用鼠標(biāo)選定Database工作表中A1:F10單元格區(qū)域,,即原始數(shù)據(jù)列表,。 Step5 在“高級(jí)篩選”對(duì)話框中單擊“條件區(qū)域”文本框,然后用鼠標(biāo)選定Result工作表中的B2:C3單元格區(qū)域,,即指定的日期范圍,。 Step6 在“高級(jí)篩選”對(duì)話框中單擊“復(fù)制到”文本框,然后用鼠標(biāo)選定Result工作表中的B5單元格,,即目標(biāo)數(shù)據(jù)區(qū)域的起始單元格,。完成選擇后的“高級(jí)篩選”對(duì)話框如圖1-6所示。 Step7 單擊“確定”按鈕,,獲取的數(shù)據(jù)將復(fù)制到單元格B5開始的區(qū)域中,,結(jié)果如圖1-7所示。 宏錄制將記錄步驟3至步驟7所進(jìn)行的操作,,并將其轉(zhuǎn)換成相應(yīng)的VBA代碼,。 Step8 關(guān)閉宏錄制,單擊菜單“工具”→“宏”→“Visual Basic編程器”或者<Alt+F11>組合鍵在VBE中查看錄制的代碼,,如圖1-8所示,。 Step9 整理或修改代碼。錄制操作完成,,接下來應(yīng)該在VBE中整理或修改宏錄制器所錄制的宏代碼,,使宏更簡(jiǎn)潔,、更靈活且更有效率,。 通常宏錄制器會(huì)“認(rèn)真地”記錄用戶的每一步操作,應(yīng)用與操作相關(guān)的所有屬性和方法的所有參數(shù),,而實(shí)際進(jìn)行的操作僅僅為其中的一部分,,因此可以刪除代碼中與操作無關(guān)的方法參數(shù)和屬性。比如在大多數(shù)情況下,,有關(guān)選定對(duì)象和激活對(duì)象的代碼并無實(shí)際的用途,,而且會(huì)降低宏代碼的整體效率,所以可以刪除。 此外,,通過錄制而得到的宏代碼不夠靈活,,僅能用于執(zhí)行某項(xiàng)特定的操作任務(wù);不能做出判斷,,不能執(zhí)行循環(huán),,不能提示用戶僌相關(guān)信息,不能使用為題賦值,;只能生成Sub過程,。因此為了創(chuàng)建功能更強(qiáng)大的宏程序,有必要對(duì)錄制宏的代碼進(jìn)行改進(jìn),。 在修改錄制的代碼時(shí),,應(yīng)及時(shí)地調(diào)試代碼,以免誤刪所需要的代碼,。 本例中錄制的代碼很簡(jiǎn)潔,,沒有多余的代碼,因此無須整理,。在進(jìn)一步的應(yīng)用中,,需要獲取AdvancedFilter方法所在的代碼并適當(dāng)?shù)匦薷脑摯a,當(dāng)用戶在Database工作表中增加數(shù)據(jù)時(shí)能查詢最新的數(shù)據(jù),,使代碼更靈活,。修改后的代碼如下: Sub GetDatas() Dim lLastRow As Long lLastRow = Sheets(“Database”).UsedRange.Rows.Count Range(“B5:G Sheets(“Database”).Range(“A1:F” & lLastRow).AdvancedFilter _ Action:=xlFilterCopy, _ CriteriaRange:=Range(“B2:C CopyToRange:=Range(“B Unique:=False End Sub 代碼解析: 第3行中的代碼獲取Database工作表中已使用區(qū)域的行數(shù)并賦值給變量lLastRow。 第4行中的代碼清除了當(dāng)前工作表中上次查詢所獲得的數(shù)據(jù),,以免在本次查詢的結(jié)果中留下不必要的數(shù)據(jù),。 第5行中的代碼修改了宏錄制器生成的代碼,使用變量lLastRow擴(kuò)展數(shù)據(jù)列表,,從而可以獲取最新的數(shù)據(jù),。 修改代碼后可以在Database工作表中添加數(shù)據(jù),重新運(yùn)行GetData過程,。如果新添加的數(shù)據(jù)滿足條件,,就會(huì)自動(dòng)地添加到結(jié)果數(shù)據(jù)表中。 注意:運(yùn)行此段代碼時(shí),,Result工作表應(yīng)該為活動(dòng)工作表,。 可以修改Result工作表單元格區(qū)域B3:C3中的日期范圍,然后再次運(yùn)行GetData過程,,從而獲取滿足該日期范圍的數(shù)據(jù),。 技巧2 執(zhí)行宏(調(diào)用過程)的5種方式 在Excel中執(zhí)行宏,實(shí)際上就是調(diào)用ExcelVBA過程,。Excel提供了多種調(diào)用過程的方式,,以滿足不同的情形和適應(yīng)不同的需求,。下面介紹幾種常用的調(diào)用過程的方法。 2-1 利用“窗體”控件或?qū)ο笳{(diào)用過程 Step1 從“窗體”工具欄中拖放“按鈕”控件到工作表的適當(dāng)位置,,將出現(xiàn)“宏”對(duì)話框,;或者在已經(jīng)存在于工作表中的“按鈕”上單擊右鍵,從彈出的快捷菜單中選擇“指定宏”,,如圖2-1所示,。顯示“窗體”工具欄的方法是單擊菜單“視圖”→“工具欄”→“窗體”。 Step2 在“宏”對(duì)話框中選擇相應(yīng)的“宏名”,,然后單擊“確定”按鈕,,如圖2-2所示。 Step3 單擊工作表中的任意一個(gè)單元格,,取消對(duì)該按鈕的選擇?,F(xiàn)在只要單擊該按鈕就能夠執(zhí)行宏(調(diào)用指定的過程)。Excel工作表中的圖片,、形狀也可以調(diào)用過程,,調(diào)用的方法與上面的步驟相同。 2-2 利用“控件工具箱”控件調(diào)用過程 步驟1 選擇“控件工具箱”工具欄中的“命令按鈕”進(jìn)入設(shè)計(jì)模式,。顯示“控件工具箱”工具欄的方法是單擊菜單“視圖”→“工具欄”→“控件工具箱”,。 步驟2 拖放“命令按鈕”控件到工作表的適當(dāng)位置,雙擊該命令按鈕或者在該命令按鈕上單擊右鍵,,從彈出的快捷菜單中選擇“查看代碼”如圖2-3所示,。 步驟3 在該命令按鈕的單擊事件過程中,輸入調(diào)用過程的代碼如下: Private Sub commandbutton1_click() Call getdatas End Sub 其中Call語句調(diào)用GetDatas過程,。也可以不加Call語句,,而直接輸入要調(diào)用的過程名稱GetDatas。 步驟4 回到Excel界面,,單擊“控件工具箱”工具欄左上角的按鈕退出設(shè)計(jì)模式,,如圖2-4所示。 此時(shí)單擊該命令按鈕即可調(diào)用指定的過程,。 2-3 在菜單或工具欄中調(diào)用過程 在Excel菜單中能夠添加菜單項(xiàng),,然后使用該菜單項(xiàng)調(diào)用過程。 步驟1 單擊菜單“工具”→“自定義”,,在彈出的“自定義”對(duì)話框中選擇“命令”選項(xiàng)卡,。 步驟2 在左側(cè)的“類別”欄中找到“宏”,然后單擊右側(cè)的“命令”欄中的“自定義菜單項(xiàng)”,。 步驟3 拖動(dòng)“自定義菜單項(xiàng)”到菜單欄,,例如將其拖至菜單“文件”中的“文件搜索”的下方,創(chuàng)建一個(gè)自定義菜單項(xiàng),,如圖2-5所示,。 步驟4 在剛創(chuàng)建的自定義菜單項(xiàng)中單擊右鍵。 步驟5 在彈出的右鍵菜單中可以重命名該菜單項(xiàng),,為其命名一個(gè)有意義的名稱,,例如輸入“數(shù)據(jù)搜索”。 步驟6 在右鍵菜單中單擊“指定宏”,。 步驟7 在打開的“指定宏”對(duì)話框中選擇相應(yīng)的宏名,,然后單擊“確定”按鈕。 步驟8 在“自定義”對(duì)話框中單擊“關(guān)閉”按鈕,。 此時(shí)在菜單“文件”下就新增了一個(gè)名為“數(shù)據(jù)搜索”的菜單項(xiàng),,單擊該菜單項(xiàng)即可調(diào)用指定的“自定義按鈕”拖至工具欄相應(yīng)的位置并指定宏。 2-4 在一個(gè)過程中調(diào)用另一個(gè)過程 在使用VBA編寫程序時(shí),,一個(gè)好的習(xí)慣是盡量將實(shí)現(xiàn)單獨(dú)功能的代碼放置在獨(dú)立的過程中,,并在主過程中調(diào)用這些獨(dú)立的過程。這樣不僅便于程序的調(diào)試,,而且程序的結(jié)構(gòu)清晰,,便于理解和維護(hù),取也能夠重復(fù)使用通用的過程代碼,。 下面用一個(gè)示例演示在程序中調(diào)用過程的方法,。如圖2-6所示的工作表,其中“加班費(fèi)基數(shù)”固定,,每個(gè)加班為80元,,“加班數(shù)”由人工輸入,“加班系數(shù)”根據(jù)加班個(gè)數(shù)而不同,,“加班費(fèi)”為“加班費(fèi)基數(shù)”,、“加班數(shù)”和“加班系數(shù)”的乘積。要求自動(dòng)地根據(jù)“加班數(shù)”確定“加班系數(shù)”并得到“加班費(fèi)”數(shù)值,,然后將最大加班費(fèi)數(shù)值所在的單元格的底紋設(shè)置為綠色,。 示例代碼如下: Dim lLastRow As Long Sub myMain() Dim rng As Range lLastRow = Range("A" & Cells.Row.Count).End(xlUp).Row Range("D3:E" & lLastRow).Clear '調(diào)用獲取加班系數(shù)的過程 Call GetExtraNum '調(diào)用計(jì)算加班費(fèi)的過程 Call CalculateExtra Set rng = Range("E3:E" & lLastRow) '調(diào)用設(shè)置加班費(fèi)不夠格式的過程 Call SetFormat(rng) End Sub '獲取加班系數(shù)并輸入工作表 Sub GetExtraNum() Dim i As Long, ExtraNum As Single For i = 3 To lLastRow ExtraNum = Range("C" & i).Value Range("D" & i).Value = GetExtra(ExtraNum) Next i End Sub '計(jì)算加班費(fèi)并輸入工作表 Sub CalculateExtra() Range("E3:E" & lLastRow).FormulaR End Sub '設(shè)置加班費(fèi)列的格式并突出顯示最大值 Sub SetFormat(rngF As Range) With rngF .NumberFormat = "0.00" .HorizontalAlignment = xlCenter .FormatConditions.Delete .FormatConditions.Add Type:=xlExpression, Formulal:="=RC5=max(c5)" .FormatConditions(1).Interior.ColorIndex = 4 End With End Sub '獲取加班系數(shù) Function GetExtra(num As Single) As Single Select Case num Case 1, 2 GetExtra = 1 Case 3 To 5 GetExtra = 1.05 Case Is > 5 GetExtra = 1.1 Case Else GetExtra = 0 End Select End Function 代碼解析: 本示例包括5個(gè)過程,其中myMain過程為主調(diào)過程,,用來調(diào)用另外4個(gè)過程,。 GetExtraNum過程用來獲致“加班系數(shù)”并輸入到工作表相應(yīng)的單元格中。該過程中調(diào)用GetExtra函數(shù)過程根據(jù)“加班數(shù)”來獲取相應(yīng)的“加班系數(shù)”,,其中使用了Select Case結(jié)構(gòu)語句,。 CalculateExtra過程用來計(jì)算“加班費(fèi)”并輸入工作表,代碼中使用R SetFormat過程用來設(shè)置“加班費(fèi)”列的格式,,其中第31行至第33行中的代碼使用條件格式來判斷單元格區(qū)域中的最大值,并對(duì)該值所在的單元格設(shè)置格式,。 第7行,、第9行和第12行中的代碼調(diào)用Sub過程,,第19行中的代碼調(diào)用Function過程。除了本書后面介紹的屬性過程外,,ExcelVBA有兩種類型的過程:Sub過程和Function過程,。 在Sub過程中能夠調(diào)用Function過程和其他的Sub過程。如果從另一個(gè)過程中調(diào)用Sub過程,,那么該Sub過程可以接受輸入?yún)?shù),。 注意:不能運(yùn)行一個(gè)帶有直接輸入?yún)?shù)的Sub過程。 Function過程也可以接受輸入?yún)?shù),,能夠調(diào)用另一個(gè)Function過程,,甚至Sub過程。與Sub過程不同的是:Function過程能夠返回值,。 注意:自定義函數(shù)內(nèi)置的工作表函數(shù)的效率更低,,特別是在工作表中大量地使用自定義函數(shù)時(shí)。此外,,自定義函數(shù)不能操作工作表及其單元格,,不能改變單元格的格式設(shè)置,例如復(fù)制或移動(dòng)單元格,、設(shè)置字體的顏色等,。 在myMain過程中使用Call語句調(diào)用過程,也可以省略Call語句,,直接使用過程的名稱來調(diào)用該過程,。在使用Call語句調(diào)用過程時(shí),如果該過程有參數(shù),,則必須在被調(diào)過程的參數(shù)的周圍加上括號(hào),,如第12行中的代碼。如果省略Call語句,,對(duì)于帶參數(shù)的Sub過程,,參數(shù)的周圍則不應(yīng)該放置括號(hào);對(duì)于Function過程,,如果要使用該函數(shù)過程的返回值,,則應(yīng)該在參數(shù)的周圍放置括號(hào),如果不需要使用帶參數(shù)的Function過程的返回值,,在參數(shù)的周圍則不需要放置括號(hào),。 在定義參數(shù)時(shí),建議同時(shí)聲明參數(shù)的類型,。對(duì)于Function過程,,建議同時(shí)聲明該函數(shù)過程的返回值類型,例如第37行中的代碼。此外在指定參數(shù)的值時(shí),,應(yīng)使用“:=”指定參數(shù)的名稱以便于理解,。 運(yùn)行myMain過程后結(jié)果如圖2-7所示。 2-5 利用Excel事件調(diào)用過程 如果在打開工作簿時(shí),,希望直接運(yùn)行技巧1中的GetDatas過程,,則可在工作簿的Open事件過程中輸入下面的代碼: Private SubWorkbook_Open() GetDatas End Sub 當(dāng)然還可以使用Application對(duì)象的Run方法執(zhí)行過程,。關(guān)于Run方法的具體使用請(qǐng)參閱技巧19.
技巧3 快速輸入代碼的方法 在編寫VBA程序時(shí),,充分地利用VBE的相關(guān)設(shè)置和工具并了解一些技巧。將有助于快速地輸入代碼,,尤其在代碼較多時(shí),。 3-1 進(jìn)行必要的輔助設(shè)置 在VBE的“選項(xiàng)”對(duì)話框中有一些設(shè)置能夠輔助VBA代碼的輸入,或者避免干擾VBA的輸入,,在VBE中單擊菜單“工具”-“選項(xiàng)”,,彈出如圖3-1所示的“選項(xiàng)”對(duì)話框。 建議取消勾選“自動(dòng)語法檢測(cè)”復(fù)選框,。如果勾選該復(fù)選框,,那么每當(dāng)在代碼模塊中新輸入行存在編譯錯(cuò)誤時(shí)都會(huì)彈出一個(gè)錯(cuò)誤消息框,如圖3-2所示,。 此時(shí)用戶需要單擊“確定”按鈕取消消息框,,才能繼續(xù)輸入代碼。如果在“選項(xiàng)”對(duì)話框中取消該復(fù)選框,,則不會(huì)彈出消息框,,但存在錯(cuò)誤的代碼行仍然會(huì)標(biāo)記顏色,提醒該用戶存在錯(cuò)誤,。 建議勾選“自動(dòng)列出成員”,、“自動(dòng)顯示快速信息”以及“自動(dòng)顯示數(shù)據(jù)提示”等復(fù)選框,這樣在輸入VBA代碼時(shí)可以提供輔助輸入提示或者必要的參考信息,,從而有助于代碼的輸入,。 如果勾選“自動(dòng)列出成員”復(fù)選框,那么在輸入代碼時(shí)就會(huì)顯示出對(duì)象的成員列表,,包括該對(duì)象的屬性,,方法和事件,選擇需要的成員后按空格鍵即可完成自動(dòng)輸入,。如果選中“自動(dòng)顯示快速信息”復(fù)選框,,那么輸入函數(shù)、屬性和方法時(shí)就會(huì)顯示出相關(guān)的參數(shù)變量信息,。如果選中“自動(dòng)顯示數(shù)據(jù)提示”復(fù)選框,,在代碼處于高度狀態(tài)時(shí),鼠標(biāo)指針放置在變量上方就會(huì)顯示相應(yīng)的值,。 3-2 使用“編輯”工具欄 在VBE的“編輯”工具欄上(如圖3-3所示),,使用一些按鈕有助于快速地輸入正確的VBA代碼,。 如果在輸入對(duì)象和鐘點(diǎn)并且出現(xiàn)了與該對(duì)象相關(guān)的屬性和方法列表后按<ESC>鍵關(guān)閉了該列表,或者關(guān)閉了函數(shù),,屬性和方法的參數(shù)提示信息,,則能夠使用該工具欄上相應(yīng)的“屬性/方法列表”按鈕和“參數(shù)信息”按鈕再次顯示信息。 同樣,,在使用常數(shù)的語句中按下“常數(shù)列表”按鈕,,則會(huì)出現(xiàn)相關(guān)的常數(shù)列表。選擇了VBA語句,、函數(shù),、方法、過程名稱或者常數(shù)后單擊“快速信息”按鈕,,則會(huì)顯示所選項(xiàng)目的語法和常數(shù)值,。當(dāng)輸入某個(gè)關(guān)鍵字的前幾個(gè)字母后按下<Ctrl+Space>組合鍵或者單擊“自動(dòng)完成關(guān)鍵字”按鈕,則會(huì)自動(dòng)地輸入該關(guān)鍵字,。 在VBE的“編輯”工具欄上(如圖3-3所示),,使用一些按鈕有助于快速地輸入正確的VBA代碼。 如果在輸入對(duì)象和鐘點(diǎn)并且出現(xiàn)了與該對(duì)象相關(guān)的屬性和方法列表后按<ESC>鍵關(guān)閉了該列表,,或者關(guān)閉了函數(shù),,屬性和方法的參數(shù)提示信息,則能夠使用該工具欄上相應(yīng)的“屬性/方法列表”按鈕和“參數(shù)信息”按鈕再次顯示信息。 同樣,在使用常數(shù)的語句中按下“常數(shù)列表”按鈕,,則會(huì)出現(xiàn)相關(guān)的常數(shù)列表。選擇了VBA語句,、函數(shù)、方法,、過程名稱或者常數(shù)后單擊“快速信息”按鈕,,則會(huì)顯示所選項(xiàng)目的語法和常數(shù)值。當(dāng)輸入某個(gè)關(guān)鍵字的前幾個(gè)字母后按下<Ctrl+Space>組合鍵或者單擊“自動(dòng)完成關(guān)鍵字”按鈕,,則會(huì)自動(dòng)地輸入該關(guān)鍵字,。 注意:在中文操作系統(tǒng)中,由于<Ctrl+Space>組合鍵經(jīng)常作為切換中英文輸入法的快捷鍵,,因此此時(shí)無法使用此快捷鍵自動(dòng)地輸入關(guān)鍵字,。 3-3 導(dǎo)入現(xiàn)有的代碼 有許多通用的VBA代碼,或者其他工程中的代碼稍作修改就能運(yùn)用于某工程中,,此時(shí) 可以將這些代碼導(dǎo)入到該工程中重復(fù)使用,,而不必從頭輸入代碼。 當(dāng)然從其他的模塊中復(fù)制所需的代碼塊,然后將這些代碼粘貼到正在編寫的模塊中,,也有助于快速地編寫代碼,。 3-4 使用宏錄制器生成代碼 對(duì)于與Excel內(nèi)置功能有著相同操作的代碼,可以先使用宏錄制器將Excel中的操作轉(zhuǎn)換為相應(yīng)的代碼,,然后在錄制的代碼中復(fù)制需要的部分到所需的代碼模塊中,。特別是需要輸入大量格式設(shè)置的代碼時(shí),宏錄制器能夠幫助快速地生成代碼,。當(dāng)然在應(yīng)用錄制的代碼之前應(yīng)該進(jìn)行必要的修改,。 技巧4 編寫高效的VBA代碼 4-1 善于使用注釋 在編寫代碼的同時(shí)使用注釋,簡(jiǎn)要地說明編寫的每個(gè)過程的目的,,關(guān)鍵語句實(shí)現(xiàn)的操作,,對(duì)過程所做的任何修改,,描述變量等,,可以使代碼更容易閱讀,理解和維護(hù),。 也可以利用注釋標(biāo)記分隔過程,,以區(qū)分不同的過程,使程序結(jié)構(gòu)一目了然,。 此外使用VBE中“編輯”工具欄的“設(shè)置注釋塊/解釋注釋塊”,,也可以將VBA語句暫時(shí)設(shè)置成注釋塊,以便于調(diào)試代碼,。 4-2 合適的命名并使用變量 在代碼中盡量還要使用“硬編碼”,,而使用更為靈活的變量。為變量起一個(gè)合適的名稱并遵守一定的命名規(guī)范,,將有助于理解變量的作用,。 建議在VBE的“選項(xiàng)”對(duì)話框中勾選“要求變量聲明”復(fù)選框,以強(qiáng)制聲明所有的變量,。這樣做有以下的3個(gè)好處,。 1)容易發(fā)現(xiàn)并修改變量名拼寫錯(cuò)誤,否則VBA會(huì)認(rèn)為其錯(cuò)誤的拼寫為一個(gè)新的Variant類型變量,,并賦予其值為0或空(字符),。 2)可以提高程序的執(zhí)行速度,不必每一次在編譯時(shí)都對(duì)變量進(jìn)行檢查,。 3)能為對(duì)象變量自動(dòng)地列出可用的屬性和方法列表,,以防止對(duì)屬性和方法拼寫錯(cuò)誤而出現(xiàn)無效的方法和屬性。 在聲明變量時(shí),,應(yīng)該明確變量的作用域,,避免變量混淆。在使用變量時(shí),要遵守變量的語法規(guī)則,,例如使用Set關(guān)鍵字為對(duì)象變量賦值,,使用New關(guān)鍵字實(shí)例化對(duì)象變量。在對(duì)象變量使用完成后誚及時(shí)地釋放變量,。此外對(duì)于在循環(huán)中使用的計(jì)數(shù)變量,,應(yīng)確保該變量遵循一定的規(guī)律變化,而不會(huì)意外地改變?cè)撟兞康闹怠?/SPAN> 4-3 不要隨便省略 在VBA中大部分對(duì)象都有一個(gè)默認(rèn)的屬性,,例如Range對(duì)象的默認(rèn)屬性Value屬性,。在書寫代碼時(shí)可以省略.Value,其效果與寫上.Value是相同的,。但是建議在編寫代碼時(shí),,即使是默認(rèn)的屬性還是要寫全,以便于閱讀和理解程序,,從而養(yǎng)成良好的程序設(shè)計(jì)習(xí)慣,。 在調(diào)用其他程序時(shí)最好寫上Call關(guān)鍵字。當(dāng)然Call關(guān)鍵字可寫可不寫,,但是加上Call關(guān)鍵字能夠清楚地表明該程序正在調(diào)用另一個(gè)過程,。 4-4 限制GoTo語句的使用 在VBA中已經(jīng)有很多循環(huán)結(jié)構(gòu)可用來實(shí)現(xiàn)循環(huán)功能,而使用GoTo語句進(jìn)行循環(huán)則違背了結(jié)構(gòu)化程序設(shè)計(jì)的原則,,使得程序代碼更難閱讀,,也容易出錯(cuò)。建議盡量不要使用GoTo語句,,除非該語句能夠真正地簡(jiǎn)化代碼,,或者非得使用該語句不可。 4-5 合理使用循環(huán) 在使用循環(huán)結(jié)構(gòu)時(shí),,無論是否滿足循環(huán)結(jié)束的條件,,只要達(dá)到了目的就應(yīng)退出循環(huán),以減少不必要的循環(huán)次數(shù),。 此外循環(huán)的開始和結(jié)束比較特殊,,一般要檢查最開始或最結(jié)尾時(shí)循環(huán)進(jìn)行的操作,以免出現(xiàn)不符合要求的結(jié)果或錯(cuò)誤,。 4-6 聲明函數(shù)類型 在自定義函數(shù)時(shí),,建議用As關(guān)鍵字聲明函數(shù)返回值的數(shù)據(jù)類型,要養(yǎng)成聲明函數(shù)返回值的數(shù)據(jù)類型的習(xí)慣,。 4-7 使用名稱 在程序中對(duì)六里橋區(qū)域引用時(shí),,最好對(duì)該單元格區(qū)域指定名稱。定義名稱后,,無論該單元格區(qū)域添加或刪除行,,都能保證引用的是正確的單元格區(qū)域,,并且還能使用對(duì)象的一些通用的屬性。 4-8 一個(gè)模塊實(shí)現(xiàn)一項(xiàng)任務(wù) 代碼越簡(jiǎn)單,,就越容易維護(hù)和修改,,并且較小的程序也容易理解和調(diào)試。如果過程的代碼很長(zhǎng),,那么既不便于閱讀,,也不便于維護(hù)。 運(yùn)用模塊化的方法,,將過程代碼中具有獨(dú)立功能的過程分離出來,,形成幾個(gè)具有單一功能的過程。然后在一個(gè)主過程中調(diào)用這些過程,,同時(shí)將實(shí)現(xiàn)不相關(guān)功能的代碼放置在不同的模塊中,,而在一個(gè)模塊中包含所有相關(guān)過程的代碼,這位代碼則更容易維護(hù),,也容易閱讀理解,,還可以重復(fù)利用。 4-9 一個(gè)窗體實(shí)現(xiàn)一項(xiàng)功能 應(yīng)該讓一個(gè)窗體只實(shí)現(xiàn)一項(xiàng)功能,,盡量保持窗體簡(jiǎn)單一些,。并且窗體模塊代碼應(yīng)該只包含操作窗體控件的過程,而沒有操作窗體及其中任何控件的過程則應(yīng)該放置在代碼模塊中,。 4-10 為編寫代碼打好基礎(chǔ) 在編寫代碼之前應(yīng)該先設(shè)置好工作簿或工作表,為編寫代碼打好基礎(chǔ),。例如不是必須需要利用代碼實(shí)現(xiàn)的操作,,應(yīng)盡量先使用Excel的內(nèi)置功能操作工作表,然后使用VBA代碼實(shí)現(xiàn)特定的需求,。特別是在處理大量的數(shù)據(jù)時(shí),,應(yīng)先設(shè)計(jì)好數(shù)據(jù)的結(jié)構(gòu),對(duì)數(shù)據(jù)進(jìn)行必要的整理,,使其盡可能地滿足一定的規(guī)律,,這樣往往可以極大地減少代碼量,也能使開發(fā)變得更容易,。 4-11 使用錯(cuò)誤處理技術(shù),,讓代碼更健壯 好的應(yīng)用程序應(yīng)能自己對(duì)可能發(fā)生的錯(cuò)誤進(jìn)行處理。通常運(yùn)行程序時(shí)所發(fā)生的錯(cuò)誤將會(huì)導(dǎo)致VBA停止代碼的運(yùn)行,,用戶將會(huì)看到顯示錯(cuò)誤編號(hào)和錯(cuò)誤說明的對(duì)話框,。好的應(yīng)用程序不會(huì)讓用戶來處理這些錯(cuò)誤,而是在應(yīng)用程序中集成了錯(cuò)誤處理代碼,,然后可以跟蹤并采取相應(yīng)的動(dòng)作,。 技巧5 有效地獲得幫助 大多數(shù)用戶都不太可能準(zhǔn)確地記住ExcelVBA所有的對(duì)象及其屬性,、方法和事件,也難以熟悉所有的VBA函數(shù)的使用方法,,因此能夠獲得有效的幫助將有助于代碼的編寫,。 在VBE的右上角有一個(gè)組合框,在其中輸入需要幫助的問題或關(guān)鍵字將會(huì)出現(xiàn)相關(guān)的信息的列表,。 在該列表中單擊需要幫助的條目,,將出現(xiàn)該條目的幫助信息。 5-2 使用<F1>鍵獲得幫助 在代碼窗口中選擇需要了解信息的對(duì)象,、屬性,、方法、事件或函數(shù)等的名稱,,或者將光標(biāo)置于該名稱內(nèi),,然后按<F1>鍵,將出現(xiàn)幫助信息,。 5-3 使用<F2>鍵獲得幫助 在VBE中按<F2>鍵將出現(xiàn)“對(duì)象瀏覽器”窗口,,如圖5-4所示。 在“對(duì)象瀏覽器”窗口中包括已引用的庫(kù)中所有的對(duì)象及其屬性,、方法和事件,。在“對(duì)象瀏覽器”窗口的左上角選擇類型庫(kù),然后輸入關(guān)鍵字,,單擊“搜索按鈕”,,在“搜索結(jié)果”列表框中就會(huì)列出相應(yīng)的結(jié)果。下方的“類”列表框列出了選擇的庫(kù)中所有的可用的對(duì)象類,,其右側(cè)列出了該類的所有成員,。在“對(duì)象瀏覽器”窗口的底部顯示了所選成員的相關(guān)代碼,如果單擊其中的綠色鏈接文本,,就會(huì)在“對(duì)象瀏覽器”窗口中快速地跑到所選成員的類或庫(kù),。 如果選擇“對(duì)象瀏覽器”窗口中的任一條目,然后按<F1>鍵,,則會(huì)出現(xiàn)與該條目相關(guān)的幫助信息,。 5-4 使用宏錄制器獲得幫助 如果不能確定所需操作使用的對(duì)象、屬性或者方法,,那么可以在Excel中打開宏錄制器錄制相應(yīng)的操作,,然后查看生成的代碼,從中找出所需要的對(duì)象,、屬性或方法,。 5-5 使用立即窗口獲得幫助 在VBE中單擊菜單“視圖”→“立即窗口”或者按<Ctrl+G>組合鍵會(huì)顯示“立即窗口”。在“立即窗口”中可以試驗(yàn)代碼并立即得到結(jié)果(如圖5-5所示),,從而幫助正確地編寫代碼,。 5-6 在Excel論壇中搜索或提問 目前大多數(shù)的Excel論壇都提供了搜索功能,,可以輸入關(guān)鍵字來得到問題的相關(guān)幫助信息。這里以ExcelHome論壇的“搜索”為例,,如圖5-6所示,。 在輸入需要幫助的關(guān)鍵字并選取相應(yīng)的版面后單擊“站內(nèi)搜索”按鈕,將會(huì)出現(xiàn)相關(guān)的結(jié)果,,如圖5-7所示,。此時(shí)能夠從結(jié)果中查找相關(guān)的內(nèi)容,看看需要解決的問題有無現(xiàn)成的答案,。 當(dāng)然也可以在Excel論壇中發(fā)帖提出自己的問題,,往往也會(huì)得到較滿意的答案。 |
|