您在 Excel 中執(zhí)行的許多任務(wù)都是一次性的(例如輸入某天的銷售數(shù)據(jù)或向工作表 (工作表:在 Excel 中用于存儲(chǔ)和處理數(shù)據(jù)的主要文檔。也稱為電子表格。工作表由排列成行或列的單元格組成。工作表總是存儲(chǔ)在工作簿中。)中添加公式)。不過,還有一些任務(wù)需要頻繁反復(fù)執(zhí)行但可以使用 Excel 中的工具很快完成(例如更改單元格區(qū)域的格式)。除此之外,您可能還會(huì)常常碰到一兩個(gè)既需要反復(fù)執(zhí)行又步驟繁瑣的任務(wù)。 例如,您可能希望在每次向同事演示報(bào)告時(shí)突出顯示工作表中幾個(gè)重要的單元格。要完成這樣的任務(wù),您不必手動(dòng)執(zhí)行一系列繁冗的步驟,而是可以通過創(chuàng)建宏或錄制一系列操作來完成這些步驟。或者,如果您熟悉 Microsoft Visual Basic? for Applications (VBA) 編程語言,也可以從頭編寫自定義宏。無論選擇哪種方式,在創(chuàng)建宏后,均可以根據(jù)需要運(yùn)行、編輯或刪除該宏。 本文向您介紹面向?qū)ο蟮木幊毯?Visual Basic 編輯器,您可以在此環(huán)境中編寫自己的 Excel 宏。如果您打算一試身手,編寫自定義的宏,請參閱 Frank Rice 寫的 Microsoft Office Excel 2003 對象模型的超簡易指南(英文),以便對此過程有深入的了解。 使用 Visual Basic 編輯器Visual Basic 編輯器是一個(gè)功能強(qiáng)大的工具,它使您得以擴(kuò)展宏的功能和多用性,而非局限于通過簡單的錄制就可以完成的任務(wù)。要打開該工具,請?jiān)?B class=ui>“工具”菜單上指向“宏”,然后單擊“Visual Basic 編輯器”。(或按 Alt+F11)。 要打開某個(gè)特定的宏,請?jiān)?B class=ui>“工具”菜單上指向“宏”,然后單擊“宏”(或按 Alt+F8)。在“宏名”對話框中,選擇要編輯或查看的宏,然后單擊“編輯”即可打開 Visual Basic 編輯器。 在 Visual Basic 編輯器中使用面向?qū)ο蟮木幊?/H2>在 Visual Basic 編輯器中,您可以使用面向?qū)ο蟮木幊虂韯?chuàng)建自己的程序。大體上,程序只是計(jì)算機(jī)按指定順序運(yùn)行的一組指令。 在面向?qū)ο蟮木幊陶Z言中,計(jì)算機(jī)代碼的各個(gè)特征均基于環(huán)境中的某些事物。這些“事物”(毫不奇怪)被表示為對象,所有操作和數(shù)據(jù)都封裝在這些對象中。在 Excel 中,對象可以是工作簿、工作表、單元格區(qū)域和外部文件。 通常,在充實(shí)程序的過程中,要用到對象的四個(gè)特征:屬性、方法、事件和集合。 屬性簡單地說,屬性是描述其所屬對象的某個(gè)特征的變量。Excel 中常見的對象屬性是名稱,它代表著您或 Excel 指定給工作簿、工作表、單元格區(qū)域或其他對象的標(biāo)識(shí)值。例如,如果更改了工作表的名稱(使用 VBA 代碼或右鍵單擊工作表標(biāo)簽),則會(huì)更改名稱屬性中存儲(chǔ)的值。 您可以直接在 VBA 中為某些工作表屬性(如名稱)設(shè)置新的值。要更改其他工作表屬性,可能需要在 Excel 中錄制一個(gè)操作(例如,保護(hù)某個(gè)單元格區(qū)域時(shí)執(zhí)行的步驟),或使用一個(gè)方法(將在下一節(jié)中介紹)。 在 VBA 程序中,屬性是使用點(diǎn)標(biāo)記引用的:首先寫下對象名稱,然后寫下屬性名稱,在兩個(gè)元素之間用句點(diǎn)分隔。比方說,若要更改工作表的名稱,則需要使用 Worksheet.Name 屬性。 方法方法是一種對象“知道”如何執(zhí)行的操作。比方說,Excel 窗口中顯示的工作表叫做活動(dòng)工作表。在 Excel VBA 代碼中,可以首先對您要處理的工作表調(diào)用 Activate 方法,從而使該工作表成為目標(biāo)。 在 Activate 方法運(yùn)行后,附帶了該方法的工作表會(huì)移動(dòng)到 Excel 窗口中所有其他工作表的前面,以供編輯。 與屬性一樣,方法也是通過點(diǎn)標(biāo)記來調(diào)用的。例如,若要重新計(jì)算工作表中的所有公式,則可以調(diào)用 Worksheet.Calculate 方法。 事件正如屬性是一種可量化的對象特性、方法是一種對象知道如何執(zhí)行的操作一樣,事件是一種被對象“意識(shí)到”已經(jīng)發(fā)生的操作。例如,Excel 2003 可以意識(shí)到下面的事件(此外還有許多其他事件):
Excel 包含若干事件處理程序或代碼例程,用于監(jiān)視特定的操作。如果某個(gè)操作確實(shí)發(fā)生,并且您已告知 Excel 在發(fā)生該事件時(shí)要執(zhí)行的操作,那么 Excel 將運(yùn)行事件處理程序中的代碼。例如,如果在創(chuàng)建新的工作簿后,希望 Excel 以一組層疊窗口的形式顯示所有打開的工作簿,則可以創(chuàng)建以下事件處理程序:
您可能不知道這個(gè)事件處理程序例程的每個(gè)元素都是用來做什么的,不過不必?fù)?dān)心?,F(xiàn)在您只需要注意代碼中間的一行,該行告訴 Excel 使用層疊樣式排列窗口。您可以使用 Excel 中的菜單命令(“窗口”菜單,“重排窗口”命令,“層疊”子命令)獲得相同的結(jié)果。不過,如果您希望每當(dāng)發(fā)生某個(gè)特定事件時(shí)即執(zhí)行一個(gè)操作,則可以使用 VBA 讓其自動(dòng)執(zhí)行,免得您勞神費(fèi)力。 集合在面向?qū)ο蟮木幊讨?,您要了解的最后一個(gè)元素是集合。顧名思義,集合是包含在另一個(gè)對象中的一組類型相同的對象。舉例說來,一個(gè)工作簿包含由一個(gè)或多個(gè)工作表組成的集合。如果要對工作簿中的每個(gè)工作表進(jìn)行同樣的更改,則可以用編程方式依次遍歷集合中的每個(gè)工作表并進(jìn)行更改。 如果您以前創(chuàng)建過程序,那么可能運(yùn)行過 For...Next 循環(huán),該循環(huán)允許您使用與下面類似的順序,多次重復(fù)一組指令。(本例將活動(dòng)工作簿的目錄路徑添加到前三個(gè)工作表頁腳的右側(cè)。)
對此 For...Next 循環(huán)的上限進(jìn)行硬編碼(即分配設(shè)置值)的問題是,在每次添加或刪除工作表時(shí),都必須更改代碼。如果是一兩次,也不算什么,但如果您管理著許多代碼,難免會(huì)在某些位置忘記更改這些代碼。這將導(dǎo)致一些錯(cuò)誤,事后您不得不去糾正它們。更嚴(yán)重的情況是,人們可能一直沒有注意到這些錯(cuò)誤,直到年度報(bào)告的前 500 份副本已經(jīng)全部打印出來,編審人員才發(fā)現(xiàn)格式是錯(cuò)誤的,而這時(shí)候您已經(jīng)關(guān)掉手機(jī),正在度假海灘上欣賞落日。 您可以使用一段代碼來得出工作簿中的工作表數(shù),不過還有更簡單的方法:即改用 For Each...Next 循環(huán)。For Each...Next 循環(huán)可以查找集合中的對象數(shù)目(例如工作簿中的工作表數(shù)),并遍歷出現(xiàn)的每個(gè)對象。使用該技術(shù),可以按如下方式編寫上述代碼:
在標(biāo)準(zhǔn)的 For...Next 循環(huán)中,值是不斷遞增的;與之不同的是,F(xiàn)or Each...Next 循環(huán)只搜索 Worksheets 集合的下一個(gè)成員,在找不到時(shí)會(huì)停止搜索。 Visual Basic 編輯器及窗口Visual Basic 編輯器可在不同的窗口中顯示不同的信息。開始編寫宏時(shí),需要重點(diǎn)了解以下幾個(gè)窗口:“項(xiàng)目資源管理器”窗口、“屬性”窗口和“代碼”窗口。 “項(xiàng)目資源管理器”窗口在直接打開 Visual Basic 編輯器時(shí),可以使用“項(xiàng)目資源管理器”窗口來選擇要處理的宏?!绊?xiàng)目資源管理器”將在一個(gè)樹狀視圖(類似于 Windows? 資源管理器中的樹狀視圖)中顯示所有項(xiàng)目(代碼組)和宏。該樹狀結(jié)構(gòu)中的根對象或基本對象是您所處理的當(dāng)前工作簿以及其他一些打開的工作簿和外接程序。 VBA 項(xiàng)目使用的主要元素分別存儲(chǔ)在每個(gè)項(xiàng)目的獨(dú)立文件夾中。這些元素包括:
在下面的示例中,當(dāng)前工作簿被標(biāo)識(shí)為 VBAProject。該工作簿包含的三張工作表(Sheet1、Sheet2 和 Sheet3)和整個(gè)工作簿 (ThisWorkbook) 均顯示在 Microsoft Office Excel Objects 文件夾中。所有在 VBA 中編寫的宏或錄制宏都顯示在“模塊”文件夾中。所有類模塊或用戶窗體分別顯示在“類模塊”文件夾和“窗體”文件夾中。
“屬性”窗口“項(xiàng)目資源管理器”窗口的正下方是“屬性”窗口,用于查看和更改與選定對象相關(guān)的各種屬性。對于模塊而言,通常只有名稱屬性是可用的。工作表有其他一些可更改的屬性(如 StandardWidth 和 DisplayPageBreaks)。對“屬性”窗口中的屬性的更改通常在處理用戶窗體時(shí)進(jìn)行。 注釋 “屬性”窗口的名稱屬性框中顯示的對象名稱可能有別于 Excel 中相應(yīng)的對象名稱。兩個(gè)名稱可能稍有不同,造成這種情況的原因是,Visual Basic 編輯器為對象使用默認(rèn)的命名規(guī)則(例如,名稱不能包含空格、必須以字母開頭、不能是保留字且長度不能超過 31 個(gè)字符)。不過,即使名稱不同,它們內(nèi)部也依然聯(lián)系在一起,以確保引用適當(dāng)?shù)膶ο蟆? “代碼”窗口“代碼”窗口是 Visual Basic 編輯器中最大的窗口,其頂部有兩個(gè)下拉框,您可以使用左側(cè)的下拉框(即“對象”框)選擇要處理的對象。如果僅處理代碼,則該框顯示默認(rèn)的通用對象。第二個(gè)下拉框(即“過程”框)用于選擇當(dāng)前模塊中的各個(gè)宏。在模塊中添加或刪除宏時(shí),“過程”框中也將同時(shí)添加或刪除該宏。
您還可以使用向上鍵和向下鍵來滾動(dòng)代碼列表,直至找到所需的宏。在滾動(dòng)代碼的同時(shí),“過程”框會(huì)隨之更新,以反映當(dāng)前的宏。 |
|