使用宏錄制器是獲取ExcelVBA代碼最簡(jiǎn)單的方式,尤其是對(duì)于沒(méi)有任何編程經(jīng)驗(yàn)的VBA學(xué)習(xí)者。例如希望在VBA中使用Excel的“高級(jí)篩選”功能從圖1所示的Database工作表的數(shù)據(jù)表中獲得在圖2所示的Result工作表內(nèi)指定的日期范圍內(nèi)的數(shù)據(jù),并將數(shù)據(jù)復(fù)制到以單元格B5開(kāi)始的單元格區(qū)域。
圖1從中獲取數(shù)據(jù)的數(shù)據(jù)表圖
圖1要使用的日期范圍
Step1:?jiǎn)螕暨x項(xiàng)卡【視圖】【宏】【錄制新宏】,將顯示如圖3所示的【錄制新宏】對(duì)話框。
圖3“錄制新宏”對(duì)話框
其中“宏名”文本框顯示為默認(rèn)的名稱(chēng)“宏1”,建議修改為有意義的名稱(chēng)。在【快捷鍵】文本框中輸入的字母將作為運(yùn)行宏的組合鍵即<Ctrl 字母>,如果在輸入字母的同時(shí)按下<Shift>鍵,運(yùn)行宏的組合鍵則為<Ctrl Shift 字母>。在【保存在】下拉列表中列出了保存錄制宏的3個(gè)位置:當(dāng)前工作簿,新工作簿和個(gè)人宏工作簿,選擇【當(dāng)前工作簿】將宏保存在活動(dòng)工作簿中,選擇【新工作簿】將宏保存在一個(gè)新的空工作簿中,選擇【個(gè)人宏工作簿】將宏保存在名為Personal.xls的特定文件中,啟動(dòng)Excel時(shí)會(huì)自動(dòng)地裝載該文件。在【說(shuō)明】文本框中添加宏的注釋?zhuān)达@示在代碼頂部的文字,用來(lái)提供與該宏相關(guān)的信息。
通常在錄制宏之前,應(yīng)規(guī)劃好操作步驟,盡可能少地錄制不必要的操作。
Step2:?jiǎn)螕簟敬_定】按鈕開(kāi)始錄制宏。(2003版本:此時(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逛浿啤薄?/p>
Step3:在Excel中進(jìn)行操作。單擊選項(xiàng)卡【數(shù)據(jù)】【排序和篩選】【高級(jí)】,在打開(kāi)的【高級(jí)篩選】對(duì)話框中選中【將篩選結(jié)果復(fù)制到其他位置】單選按鈕。
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ì)話框如圖4所示。
圖4完成選擇后的【高級(jí)篩選】對(duì)話框
Step7:?jiǎn)螕簟敬_定】按鈕,獲取的數(shù)據(jù)將復(fù)制到單元格B5開(kāi)始的區(qū)域中,結(jié)果如圖5所示。
圖5利用“高級(jí)篩選”獲取數(shù)據(jù)
Step8:關(guān)閉宏錄制,單擊選項(xiàng)卡【開(kāi)發(fā)工具】【代碼】【Visual Basic】或者按<Alt F11>組合鍵在VBE中查看錄制的代碼,如圖6所示。
圖6錄制的代碼
Step9:整理或修改代碼。錄制操作完成,接下來(lái)應(yīng)該在VBE中整理或修改宏錄制器所錄制的宏代碼,使宏更簡(jiǎn)潔、更靈活且更有效率。
宏錄制器將記錄步驟3至步驟7所進(jìn)行的操作,并將其轉(zhuǎn)換成相應(yīng)的VBA代碼。
通常宏錄制器會(huì)“認(rèn)真地”記錄用戶(hù)的每一步操作,應(yīng)用與操作相關(guān)的所有屬性和方法的所有參數(shù),而實(shí)際進(jìn)行的操作僅僅為其中的一部分,因此可以刪除代碼中與操作無(wú)關(guān)的方法參數(shù)和屬性。
比如在大多數(shù)情況下,有關(guān)選定對(duì)象和激活對(duì)象的代碼并無(wú)實(shí)際的用途,而且會(huì)降低宏代碼的整體效率,所以可以刪除。
此外,通過(guò)錄制而得到的宏代碼不夠靈活,僅能用于執(zhí)行某項(xiàng)特定的操作任務(wù);不能做出判斷,不能執(zhí)行循環(huán),不能提示用戶(hù)輸入相關(guān)信息,不能使用變量賦值;只能生成Sub過(guò)程。因此為了創(chuàng)建功能更強(qiáng)大的宏程序,有必要對(duì)錄制宏的代碼進(jìn)行改進(jìn)。
在修改錄制的代碼時(shí),應(yīng)及時(shí)地調(diào)試代碼,以免誤刪所需要的代碼。關(guān)于優(yōu)化代碼的更多內(nèi)容請(qǐng)參閱技巧4以及本書(shū)第24章的內(nèi)容。
本例中錄制的代碼很簡(jiǎn)潔,沒(méi)有多余的代碼,因此無(wú)須整理,在進(jìn)一步的應(yīng)用中,需要獲取AdvancedFilter方法所在的代碼并適當(dāng)?shù)匦薷脑摯a,當(dāng)用戶(hù)在Database工作表中增加數(shù)據(jù)時(shí)能查詢(xún)最新的數(shù)據(jù),使代碼更靈活。修改后的代碼如下:
#001 Sub GetDatas()
#002 Dim lLastRow As Long
#003 lLastRow=Sheets('Database').UsedRange.Rows.Count
#004 Range('B5:G65536').Clear
#005 Sheets('Database”).Range('A1:F'&lLastRow).AdvancedFilter_
Action:=xlFilterCopy,_
CriteriaRange:=Range('B2:C3'),_
CopyToRange:=Range('B5'),_
Unique:=False
#010 End Sub
代碼解析:
第3行中的代碼獲取Database工作表中已使用區(qū)域的行數(shù)并賦值給變量lLastRow。
第4行中的代碼清除了當(dāng)前工作表中上次查詢(xún)所獲得的數(shù)據(jù),以免在本次查詢(xún)的結(jié)果中留下不必要的數(shù)據(jù)。
第5行中的代碼修改了宏錄制器生成的代碼,使用變量lLastRow擴(kuò)展數(shù)據(jù)列表,從而可以獲取最新的數(shù)據(jù)。
修改代碼后可以在Database工作表中添加數(shù)據(jù),重新運(yùn)行GetData過(guò)程。如果新添加的數(shù)據(jù)滿(mǎn)足條件,就會(huì)自動(dòng)地添加到結(jié)果數(shù)據(jù)表中,
注意:運(yùn)行此段代碼時(shí),Result工作表應(yīng)該為活動(dòng)工作表。
可以修改Result工作表單元格區(qū)域B3:C3中的日期范圍,然后再次運(yùn)行GetData過(guò)程,從而獲得滿(mǎn)足該日期范圍的數(shù)據(jù)。
聯(lián)系客服