第41章 初識(shí)VBA ?。郑拢寥Q(chēng)為Visual Basic for Application,它是Visual Basic的應(yīng)用程序版本。作為功能強(qiáng)大的工具,VBA使Excel形成了獨(dú)立的編程環(huán)境。本章將簡(jiǎn)要介紹什么是VBA以及如何學(xué)習(xí)Excel VBA。 41.1 什么是宏 在很多應(yīng)用軟件中都有宏的應(yīng)用。什么是宏呢?計(jì)算機(jī)詞典中有多種對(duì)于宏的定義。在此無(wú)需花費(fèi)大量時(shí)間去研究那些拗口的定義哪個(gè)更準(zhǔn)確。本書(shū)中討論的宏僅限于微軟Office軟件包設(shè)計(jì)的一個(gè)特殊功能,目的是讓用戶(hù)的一些任務(wù)實(shí)現(xiàn)自動(dòng)化。 與其他用于軟件開(kāi)發(fā)的單獨(dú)編程語(yǔ)言不同,宏代碼只能“寄生”于Excel文件之中,并且宏代碼不能編譯為可執(zhí)行文件。 41.2 VBA的應(yīng)用場(chǎng)景 Excel VBA作為一種擴(kuò)展工具,得到了越來(lái)越廣泛的應(yīng)用,原因在于,很多實(shí)際應(yīng)用中復(fù)雜的Excel操作都可以利用Excel VBA得到簡(jiǎn)化。一般來(lái)說(shuō),Excel VBA可以應(yīng)用在如下幾個(gè)方面:
41.3 在Excel 中錄制宏代碼 41.3.1 錄制宏是最好的學(xué)習(xí)工具 錄制宏不僅是Excel 中一個(gè)非常實(shí)用的功能,而且是學(xué)習(xí) VBA的好幫手。在 Excel 中,有兩種方法可以開(kāi)始錄制一個(gè)宏。 ?。保肊xcel菜單:“工具”——宏——錄制新宏,在“錄制新宏”對(duì)話(huà)框中,設(shè)置宏的名稱(chēng)、保存位置以及快捷鍵,再單擊“確定”按鈕,就可以開(kāi)始錄制一個(gè)新的宏。 系統(tǒng)默認(rèn)錄制新宏的名稱(chēng)為“Macro”加數(shù)字序號(hào)的形式,例如Macro1、Macro2等等,建議用戶(hù)使用能夠代表代碼功能的宏名稱(chēng)。宏名稱(chēng)可以包含字母、數(shù)字和下劃線(xiàn),但第一個(gè)字符必須是字母或中文字符,不能是數(shù)字,也就是“1Macro”不可以作為宏名稱(chēng)。建議在宏名稱(chēng)中不要使用中文字符,否則在非中文版的Excel中使用該宏時(shí)可能會(huì)出現(xiàn)兼容性問(wèn)題。 ?。玻茫謎sual Basic工具欄 步驟1:?jiǎn)螕粢晥D——工具欄——Visual Basec,將顯示工具欄。 步驟2:?jiǎn)螕舻诙€(gè)按鈕“錄制宏”,同樣會(huì)出現(xiàn)“錄制新宏”對(duì)話(huà)框。 步驟3:?jiǎn)螕簟颁浿菩潞辍睂?duì)話(huà)框的“確定”按鈕,系統(tǒng)將開(kāi)始錄制宏,Visual?。拢幔螅椋愎ぞ邫诘牡诙€(gè)按鈕將變?yōu)椤巴V逛浿啤薄?/div> 開(kāi)始錄制宏后,Excel中絕大部分操作將被記錄為宏代碼,此時(shí)可以開(kāi)始在Excel 中進(jìn)行相關(guān)的操作。操作結(jié)束后,單擊Visual Basic工具欄的“停止錄制”按鈕,將停止本次錄制宏。單擊“查看代碼”按鈕或按<Alt+F11>組合鍵就可以打開(kāi)VBE(V isual Basic Editor,即VBA集成開(kāi)發(fā)環(huán)境)窗口,在代碼窗口中將看到剛才錄制的宏代碼,下一章中將講述VBE中主要窗口的功能。 對(duì)于VBA的初學(xué)者,最困難的事情就是想要實(shí)現(xiàn)一個(gè)功能,卻不知道代碼從何寫(xiě)起,錄制宏可以很好地幫助大家。在Excel中進(jìn)行操作的同時(shí)錄制宏,就可以看到整個(gè)操作過(guò)程的代碼,請(qǐng)注意這只是一個(gè)“半成品”,經(jīng)過(guò)必要的修改才能得到更高效更智的代碼。 41.3.2 錄制宏的局限性 錄制宏可以忠誠(chéng)地記錄Excel 操作,但也有其本身的局限性,主要表現(xiàn)在以下幾個(gè)方面: ?。薄浿坪戤a(chǎn)生的代碼不一定完全等同于用戶(hù)的操作,例如用戶(hù)設(shè)置保護(hù)工作表時(shí)輸入的密碼就無(wú)法記錄在代碼中,設(shè)置工作表控件的屬性也無(wú)法產(chǎn)生相關(guān)的代碼。 ?。玻浿坪戤a(chǎn)生的代碼執(zhí)行效率不高,因?yàn)榇a中大量使用Activate和Select等方法,影響了代碼的執(zhí)行效率,在實(shí)際應(yīng)用中需要進(jìn)行相應(yīng)的優(yōu)化。 第42章?。郑拢恋慕M裝工廠——Visual Basic Editor Visual Basic Editor(以下簡(jiǎn)稱(chēng)VBE),是指Excel及其他Office組件中集成的VBA編輯器,本章將介紹VBE中主要功能窗口的功能。 42.1VBE窗口介紹 42.1.1?。郑拢糯翱诮榻B 在VBE界面中,除了和一般Windows應(yīng)用程序類(lèi)似的菜單和工具欄外,其工作區(qū)中還提供了多個(gè)功能窗口供用戶(hù)選擇。單擊VBE“視圖”菜單,將顯示菜單項(xiàng),用戶(hù)可根據(jù)需要和使用習(xí)慣選擇在VBE中顯示的功能窗口。 42.1.2 工程窗口 工程窗口以樹(shù)形結(jié)構(gòu)顯示Excel中的所有工程,即Excel中所有已經(jīng)打開(kāi)的工作簿,包含隱藏工作簿的加載宏。每個(gè)工程作為一個(gè)樹(shù)結(jié)構(gòu)的根結(jié)點(diǎn),一般顯示為“VBAProject(Book1.xls)”的形式。 42.1.3 屬性窗口 屬性窗口會(huì)列出選取對(duì)象的屬性,用戶(hù)可以修改這些屬性的值。當(dāng)選取了多個(gè)控件時(shí),屬性窗口會(huì)列出所有控件所共有的屬性;如果此時(shí)更改某個(gè)屬性的值,那么被選中的多個(gè)控件的相應(yīng)屬性會(huì)同時(shí)被修改。屬性窗口所示分為兩部分:對(duì)象框和屬性列表。 42.1.4 代碼窗口 代碼窗口用來(lái)輸入、顯示以及編輯VBA代碼。打開(kāi)對(duì)象的代碼窗口后,可以查看模塊或?qū)ο笾械拇a和在它們之間進(jìn)行復(fù)制和粘貼。 42.1.5 立即窗口 在立即窗口中鍵入或粘貼一行代碼,然后按<Enter>鍵可以執(zhí)行該代碼。在代碼中使用Debug.Print可將內(nèi)容輸出到立即窗口中。 注意:立即窗口中的代碼是不能被保存的,關(guān)閉Excel后,立即窗口中的內(nèi)容將丟失。 第43章 VBA語(yǔ)言基礎(chǔ) ?。郑拢磷鳛橐环N編程語(yǔ)言,具有其自身特有的語(yǔ)法規(guī)則。本章將介紹VBA編程的基礎(chǔ)知識(shí),包括變量與常量、過(guò)程、程序結(jié)構(gòu)以及對(duì)象的屬性、方法和事件。 43.1 變量與常量 ?。矗常保薄?shù)據(jù)類(lèi)型 數(shù)據(jù)類(lèi)型用來(lái)決定可保存何種數(shù)據(jù)。VBA中的數(shù)據(jù)類(lèi)型包括Byte,Boolean,Integer,Long,Currency,Decimal,Single,Double,Date,Stri ng,Object,Variant(默認(rèn))和用戶(hù)定義類(lèi)型等。不同數(shù)據(jù)類(lèi)型所需要的存儲(chǔ)空間并不相同。
43.1.2 變量 變量用于保存在程序運(yùn)行過(guò)程中需要臨時(shí)保存的值或?qū)ο?,在程序運(yùn)行過(guò)程中其值可以發(fā)生改變。 在VBA中,變量無(wú)需聲明就可以直接使用,此時(shí)該變量為變體變量。但使用之前聲明變量是一個(gè)良好的編程習(xí)慣,同時(shí)也可以提高程序的運(yùn)行效率。 在VBA中用Dim語(yǔ)句聲明變量。下述代碼聲明局部變量a為整數(shù)型變量。 Dim a as Integer 使用類(lèi)型標(biāo)識(shí)符可以簡(jiǎn)化為: Dim a% 注意:如果在同一個(gè)語(yǔ)句中同時(shí)聲明多個(gè)變量,如下面的Dim語(yǔ)句中聲明了兩個(gè)變量,其中的變量a實(shí)際聲明為Variant變量,則應(yīng)該使用如下代碼: Dim a as Integer,b as Integer 變量賦值使用等號(hào),等號(hào)右側(cè)可以是表達(dá)式。如下代碼是為變量a賦值。 ?。帷。健。保玻福担?/div> 43.1.3 常量 常量用于存儲(chǔ)固定信息,其值不會(huì)發(fā)生改變,使用常量可以增加程序的可讀性。例如VBA中的常量vbGreen,其值為65 280,在代碼中設(shè)置綠色時(shí)使用常量vbGreen,使得代碼更具可讀性。 在VBA中用Const語(yǔ)句聲明常量。如下代碼聲明字符型常量ClubName。 Const clubName As String = "ExcelHome" 43.2 運(yùn)算符 ?。郑拢林杏腥缦拢捶N運(yùn)算符: 1.算術(shù)運(yùn)算符:用來(lái)進(jìn)行數(shù)學(xué)計(jì)算的運(yùn)算符。 ?。玻容^運(yùn)算符:用來(lái)進(jìn)行比較的運(yùn)算符。 3.連接運(yùn)算符:用來(lái)合并字符串的運(yùn)算任。 ?。矗壿嬤\(yùn)算符:用來(lái)執(zhí)行邏輯運(yùn)算的運(yùn)算符。 連接運(yùn)算符包括"&"運(yùn)算符和"+"運(yùn)算符兩種。 43.3 過(guò)程 過(guò)程(Procedure)是可以執(zhí)行的語(yǔ)句序列單元,所有可執(zhí)行的代碼必須包含在某個(gè)過(guò)程內(nèi),任何過(guò)程都不能嵌套在其他過(guò)程中。過(guò)程的名稱(chēng)只能在模塊級(jí)別進(jìn)行定義。 ?。郑拢林杏校撤N過(guò)程,即Sub過(guò)程、Function過(guò)程和Property過(guò)程。 ?。保甋ub過(guò)程執(zhí)行指定的操作,但不返回運(yùn)行結(jié)果,以關(guān)鍵Sub開(kāi)關(guān)和關(guān)鍵字End Sub結(jié)束??梢酝ㄟ^(guò)錄制宏生成Sub過(guò)程或在VBE窗口里直接編寫(xiě)。 ?。玻瓼unction過(guò)程執(zhí)行指定的操作,可以返回運(yùn)行結(jié)果,以關(guān)鍵字Function開(kāi)關(guān)和關(guān)鍵字End Function結(jié)束。Function過(guò)程可以在其他過(guò)程中調(diào)用,也可以在工作表的公式中使用,就像Excel的內(nèi)置函數(shù)一樣。 ?。常甈roperty過(guò)程用于設(shè)置和獲取自定義對(duì)象屬性的值,或者用來(lái)設(shè)置對(duì)另外一個(gè)對(duì)象的引用。 43.4 程序結(jié)構(gòu) VBA中的程序結(jié)構(gòu)與控制和大多數(shù)編程語(yǔ)言相同,下面介紹最基本的幾種程序結(jié)構(gòu)。 ?。矗常矗薄l件語(yǔ)句 程序代碼經(jīng)常用到條件判斷,并且根據(jù)結(jié)果執(zhí)行不同的代碼。在VBA中有If/Then語(yǔ)句和Select Case語(yǔ)句兩種條件語(yǔ)句。 下面的If/Then語(yǔ)句判斷活動(dòng)單元格的內(nèi)容,如果是“Excelhome”則將其字號(hào)設(shè)置為10,否則將字號(hào)設(shè)置為9。 If ActiveCell.Value = "ExcelHome" Then ActiveCell.Font.Size = 10 Else ActiveCell.Font.Size=9 ?。矗常矗病⊙h(huán)語(yǔ)句 對(duì)程序中多次重復(fù)執(zhí)行的某段代碼就可以使用循環(huán)語(yǔ)句。在VBA中循環(huán)語(yǔ)句有多種形式,包括For循環(huán)、Do循環(huán)和While循環(huán)。下面的For循環(huán)實(shí)現(xiàn)1~10的累加功能。 Sub ForLoop() Dim i As Integer, iSum As Integer iSum = 0 For i = 1 To 10 iSum = iSum + i Next MsoBox iSum,,"ForLoop" End Sub 43.4.3?。譱th語(yǔ)句 With語(yǔ)句可以在一個(gè)單一對(duì)象或一個(gè)用戶(hù)定義類(lèi)型上執(zhí)行一系列的語(yǔ)句。使用With語(yǔ)句不僅可以簡(jiǎn)化程序代碼,而且可以提高代碼的運(yùn)行效率。With/End With結(jié)構(gòu)中以“.”開(kāi)頭的語(yǔ)句相當(dāng)于引用了With語(yǔ)句中指定的對(duì)象。當(dāng)程序一旦進(jìn)入With/End 結(jié)構(gòu),With語(yǔ)句指定的對(duì)象就不能改變。因此不能用一個(gè)With語(yǔ)句來(lái)設(shè)置多個(gè)不同的對(duì)象。如下代碼是使用With語(yǔ)句設(shè)置活動(dòng)工作表的相關(guān)屬性。 With ActiveSheet .Visible = True .Cells(1,1 ) = "ExcelHome" .Name = .Cells(1,1) End With ?。矗常怠?duì)象 對(duì)象代表應(yīng)用程序中的元素,例如工作表、單元格、圖表或窗體等。應(yīng)用程序提供的對(duì)象按照層次關(guān)系進(jìn)行排列管理。Excel應(yīng)用程序中的頂級(jí)對(duì)象是Application對(duì)象的子對(duì)象,反之,Application對(duì)象是這些對(duì)象的的父對(duì)象。 許多子對(duì)象都有自己的子對(duì)象。例如Workbook對(duì)象包含Worksheets對(duì)象,或者說(shuō),Workbook對(duì)象是Worksheets對(duì)象的父對(duì)象。Worksheets對(duì)象是一種稱(chēng)為集合中的單個(gè)Worksheet對(duì)象。 ?。矗常担薄傩?/div> 屬性是指對(duì)象的特征、如大小、顏色或屏幕位置,也可指某一方面的行為,諸如對(duì)象是否被激活或是否可見(jiàn)。通過(guò)修改對(duì)象的屬性值可以改變對(duì)象的特性。如下代碼是設(shè)置活動(dòng)工作表的名稱(chēng)為“ExcelHome”。 ActiveSheet.Name = “ExcelHome” ?。矗常担病》椒?/div> 方法指對(duì)象能執(zhí)行的動(dòng)作。例如使用Worksheets對(duì)象的Add方法可以添加一個(gè)新的工作表,代碼如下: Worksheets.Add 在代碼中,屬性和方法都是通過(guò)連接符“.”來(lái)和對(duì)象連接的。 ?。矗常担场∈录?/div> 事件是一個(gè)對(duì)象可以辨認(rèn)的動(dòng)作,像單擊鼠標(biāo)或按下某鍵等,并且可以指定代碼針對(duì)此動(dòng)作來(lái)做出響應(yīng)。用戶(hù)操作、程序代碼的執(zhí)行和系統(tǒng)本身都可以觸發(fā)相關(guān)的事件。 第44章 與Excel進(jìn)行交互 在Excel中,系統(tǒng)提供了各式各樣的對(duì)話(huà)框與用戶(hù)進(jìn)行交互;在使用VBA編寫(xiě)程序時(shí),為了提高代碼的靈活性和程序的友好度,也經(jīng)常需要實(shí)現(xiàn)用戶(hù)與Excel的交互功能。本章將介紹如何InputBox和MsgBox實(shí)現(xiàn)輸入和輸出信息,以及如何調(diào)用Excel的內(nèi)置對(duì)話(huà)框。 ?。矗矗笔褂茫停螅纾拢铮敵鲂畔?/div> MsgBox函數(shù)通常應(yīng)用于如下幾種情況: ?。保敵龃a最終運(yùn)行結(jié)果 2.產(chǎn)生一個(gè)消息框用于提醒用戶(hù) ?。常诖a運(yùn)行過(guò)程中顯示某個(gè)變量的值,用于調(diào)試代碼 MsgBox函數(shù)的語(yǔ)法格式如下: MsgBox(prompt[,buttons][,title] [,helpfile,context]) prompt參數(shù)用于設(shè)置消息框的提示文本信息,最大長(zhǎng)度為1 023個(gè)字符。顯然這么多的字符無(wú)法顯示在同一行,如果代碼中沒(méi)有使用強(qiáng)制換行,系統(tǒng)將按照每行102個(gè)字符進(jìn)行自動(dòng)換行處理,多數(shù)情況下這并不符合用戶(hù)的使用習(xí)慣。 在文本信息中使用vbCrLf或 vbNewLine常量可以進(jìn)行強(qiáng)制換行。 示例44.1 顯示多行文本信息 步驟1:打開(kāi)一個(gè)新的工作簿文件,按Alt+F11組合鍵切換到VBE窗口。 步驟2.在工程窗口中插入“模塊”,修改其名稱(chēng)為“MsgBoxDemo”。 步驟3.在模塊MsgBoxDemo中寫(xiě)入如下代碼。 Sub MultiLineDemo() '定義變量 Dim MsgStr As String '生成提示信息 MsgStr = "歡迎加入Excel Home論壇!"&vbCrLf MsgStr =MsgStr & "Excel Home 是微軟技術(shù)社區(qū)聰明成員" & vbCrLf MsgStr = MsgStr & "Let's do it better!" '顯示消息框 MsgBox MsgStr,,"歡迎" End Sub 步驟4.返回Excel界面,運(yùn)行宏MultiLineDemo,將顯示消息框。 buttons參數(shù)用于指定消息框顯示按鈕的數(shù)目及形式、圖標(biāo)樣式和缺少按鈕等。組合使用參數(shù)值可以顯示多種不同風(fēng)格的消息框;省略buttons參數(shù)時(shí),消息框只顯示一個(gè)確定按鈕。 44.2 如何利用InpuitBox輸入 程序中往往需要用戶(hù)輸入很多內(nèi)容,例如數(shù)字、日期或文本等,這就需要使用InpuitBox獲取用戶(hù)輸入。 使用VBA提供的InpuitBox函數(shù)可以實(shí)現(xiàn)用戶(hù)輸入,其語(yǔ)法格式為: InpuBox(prompt[, title] [, default] [,xpos] [, helpfile, context]) 輸入框中必須顯示相關(guān)的提示信息,即prompt參數(shù),否則用戶(hù)無(wú)法知道需要輸入什么樣的內(nèi)容。設(shè)置輸入框的標(biāo)題,即title參數(shù),使得輸入框更接近Excel的內(nèi)置對(duì)話(huà)框風(fēng)格;如果省略該參數(shù),則輸入框的標(biāo)題為“Micrlsoft Excel”。 注意:用戶(hù)在輸入框中輸入的內(nèi)容是否滿(mǎn)足要求,需要在代碼中進(jìn)行相應(yīng)判斷,以保證后續(xù)程序可以正確地執(zhí)行。 除了InputBox函數(shù)之外,Excel VBA的InpuBox方法(Application.InputBox)也可用于接收用戶(hù)輸入的信息,二者的用法基本相同。區(qū)別在于InpuBox方法可以指定返回值的數(shù)據(jù)類(lèi)型。其語(yǔ)法格式為: InpuBox(Prompt,Title,Default, Left, Top, HelpFile, HelpContextId, Type) 示例44.2 利用InpuBox方法輸入員工號(hào)信息 步驟1.打開(kāi)—個(gè)新的工作簿文件,按Alt+F11組合鍵切換到VBE窗口。 步驟2.在工程窗口中插入“模塊”,修改其名為“InputBoxDemo”。 步驟3.在模塊InputBoxDemo中寫(xiě)入如下代碼。 Sub ExcelInputBoxDemo() '定義變量 Dim newID As Integer Do '提示用戶(hù)輸入員工號(hào) newID = Application.InputBox("請(qǐng)輸入員工號(hào)(四位數(shù)字):", "員工信息管理系統(tǒng)", Type:=1) '如果輸入的是四位員工號(hào)就退出循環(huán) Loop Until Len(CStr(newID)) = 4 '顯示信息框 MsgBox "您輸入的員工號(hào)為 " & newID, vbInformation, "提示信息" End Sub 步驟4.返回Excel界面,運(yùn)行宏ExcekInputBoxDemo,將顯示輸入框;如果輸入“abcd”后單擊“確定”,將顯示消息框。由此可以看出,使用InputBox方法,系統(tǒng)將根據(jù)Type參數(shù)判斷輸入的數(shù)據(jù)類(lèi)型是否符號(hào)要求。 注意:在VBA代碼中直接使用InputBox相當(dāng)于調(diào)用VBA的InputBox函數(shù)。 44.3 Excel內(nèi)置對(duì)話(huà)框 用戶(hù)使用Excel時(shí),系統(tǒng)出現(xiàn)的對(duì)話(huà)框統(tǒng)稱(chēng)為Excel內(nèi)置對(duì)話(huà)框,例如單擊“文件”——“打開(kāi)”將顯示“打開(kāi)”對(duì)話(huà)框。VBA程序與用戶(hù)之間的交互也可以借助這些內(nèi)置對(duì)話(huà)框來(lái)實(shí)現(xiàn)。 Application對(duì)象的Dialogs集合中包含大部分Excel內(nèi)置對(duì)話(huà)框,每種對(duì)話(huà)框?qū)?yīng)一個(gè)VBA常量。在VBA幫助中搜索“內(nèi)置對(duì)話(huà)框參數(shù)列表”;可以查看所有的內(nèi)置對(duì)話(huà)框參數(shù)列表。 使用Show方法可以顯示一個(gè)內(nèi)置對(duì)話(huà)框,下面代碼將顯示“打開(kāi)”對(duì)話(huà)框。 Application.Dialogs(xlDialogOpen).Show 第45章 自定義函數(shù) 自定義函數(shù)與Excel工作表函數(shù)相比具有更強(qiáng)大、更靈活的功能。自定義函數(shù)可以用來(lái)簡(jiǎn)化公式,也可以用來(lái)完成Excel工作表函數(shù)無(wú)法完成的功能。 ?。矗担薄∈裁词亲远x函數(shù) 自定義函數(shù)(User-defined Worksheet Functions 簡(jiǎn)稱(chēng)UDF)就是用戶(hù)創(chuàng)建的用于滿(mǎn)足特定需求的函數(shù),是對(duì)于Excel內(nèi)置工作表函數(shù)的一個(gè)補(bǔ)充。Excel已經(jīng)提供了數(shù)百個(gè)工作表函數(shù)可供選擇使用,有必要?jiǎng)?chuàng)建自定義函數(shù)嗎?答案是肯定的。自定義函數(shù)的優(yōu)勢(shì)在于: 1.自定義函數(shù)可以簡(jiǎn)化公式。一般情況下,組合使用Excel工作表函數(shù)完全可以滿(mǎn)足絕大多數(shù)應(yīng)用,但是復(fù)雜的公式有可能太冗長(zhǎng)和繁瑣,其可讀性非常差,不易于修改,除了公式的作者之外,公式的使用者可能很難理解公式的含義。此時(shí)就可以通過(guò)使用自定義函數(shù)來(lái)進(jìn)行簡(jiǎn)化。 2.自定義函數(shù)與Excel工作函數(shù)相比具有更強(qiáng)大和更靈活的功能。Excel實(shí)際應(yīng)用中,要求是千變?nèi)f化的,僅僅使用Excel工作表函數(shù)常常不能圓滿(mǎn)地解決問(wèn)題。此時(shí)就可以考慮使用自定義函數(shù)來(lái)滿(mǎn)足實(shí)際工作中的個(gè)性化需求。 與Excel工作表函數(shù)相比,自定義函數(shù)的弱點(diǎn)也是顯而易見(jiàn)的,就是自定義函數(shù)的效率要遠(yuǎn)遠(yuǎn)低于Excel工作表函數(shù)功能,應(yīng)該使用45.3節(jié)中講述的方法進(jìn)行引用。 45.2 函數(shù)的參數(shù)與返回值 ?。郑拢林袇?shù)有兩種傳遞方式:按值傳遞(關(guān)鍵字ByVal)和按地址傳遞(ByRef)。參數(shù)的默認(rèn)傳遞方式為按地址傳遞,因此如果希望使用這種方式傳遞參數(shù),可以省略參數(shù)前的關(guān)鍵字。 這兩種傳遞方式的區(qū)別在于,按值傳遞只是將參數(shù)值的副本傳遞到調(diào)用過(guò)程中,在過(guò)程中對(duì)于參數(shù)的修改,并不改變參數(shù)的原始值;按地址傳遞是將該參數(shù)的引用傳遞到調(diào)用過(guò)程中,在過(guò)程中任何對(duì)于參數(shù)的修改都將改變參數(shù)的原始值。 注意:由于按地址傳遞方式會(huì)修改參數(shù)的原始值,所以需要謹(jǐn)慎使用。 函數(shù)屬于Function過(guò)程,其區(qū)別于Sub過(guò)程之處在于,F(xiàn)unction過(guò)程可以提供返回值。函數(shù)可以返回一個(gè)單一值或數(shù)組。如下面的自定義函數(shù)TaxRate根據(jù)工資數(shù)返回相應(yīng)的稅費(fèi)稅率,如果在工作表中使用公式實(shí)現(xiàn)則需要多層If結(jié)構(gòu)嵌套。 Function TaxRate(Salary) Select Case Salary - 1000 Case Is <0 TaxRate = 0 Case Is <=500 TaxRate = 0.05 Case Is <= 2000 TaxRate = 0.1 Case Is <= 5000 TaxRate = 0.15 Case Else TaxRate =0.2 End Select End Function ?。矗担场∪绾卧冢郑拢林幸霉ぷ鞅砗瘮?shù) 由于工作表函數(shù)的效率遠(yuǎn)遠(yuǎn)高于自定義函數(shù),因此對(duì)于工作表函數(shù)已經(jīng)實(shí)現(xiàn)的功能,可以在VBA代碼中直接引用工作表函數(shù),其語(yǔ)法格式為: Application.WorksheetFunction.工作表函數(shù)名稱(chēng) WorksheetFunction.工作表函數(shù)名稱(chēng) Application.工作表函數(shù)名稱(chēng) 在VBA中Application對(duì)象可以省略,所以第二種語(yǔ)法格式實(shí)際上是第一種語(yǔ)法格式的簡(jiǎn)化。為了方便讀者識(shí)別,本書(shū)后續(xù)章節(jié)中所有對(duì)于工作表的函數(shù)的引用都將采用第一種格式。 在VBA代碼中調(diào)用工作表函數(shù)時(shí),函數(shù)參數(shù)的順序與在工作表單元格公式中相同,但是具體表示方法會(huì)略有不同,例如在工作表中使用公式示A1和A2單元格的和,公式為: ?。絊UM(A1,A2) 其中參數(shù)為兩個(gè)單元格的引用A1和A2。而在VBA代碼中調(diào)用工作表函數(shù)SUM時(shí),需要使用VBA中單元格的引用方法,如下所示: Application.WorksheetFunction.Sum(Cells(1,1),Cells(2,1)) ?。矗担础≡冢郑拢林幸米远x函數(shù) 除非自定義函數(shù)不使用任何參數(shù),否則自定義函數(shù)不能通過(guò)單擊VBE菜單“運(yùn)行”——“運(yùn)行子過(guò)程/窗體”來(lái)運(yùn)行自定義函數(shù)過(guò)程。在VBA代碼中,只能在另一個(gè)過(guò)程里調(diào)用該自定義函數(shù)。 ?。矗担怠≡诠ぷ鞅碇幸米远x函數(shù) 在工作表單元格公式引用自定義函數(shù)的方法和引用普通Excel工作表函數(shù)的方法基本相同。 步驟1.單擊選中目標(biāo)單元格。 步驟2.單擊菜單“工具”——選項(xiàng),在“視圖”選項(xiàng)卡中,確認(rèn)已經(jīng)選中“編輯欄”。 步驟3.單擊“編輯欄”的“插入函數(shù)”按鈕,或單擊菜單“插入”——“公式”。 步驟4.在“插入函數(shù)”對(duì)話(huà)框中選擇類(lèi)別“用戶(hù)定義”,在“選擇函數(shù)”列表框中將顯示可供選擇的全部自定義函數(shù)名稱(chēng)。 注意:使用關(guān)鍵字Private聲明的私有自定義函數(shù)不會(huì)出現(xiàn)在“插入函數(shù)”對(duì)話(huà)框中,私有自定義函數(shù)不能用于公式里,只能在另外一個(gè)VBA過(guò)程里調(diào)用這些私有的自定義函數(shù)。 步驟5.單擊自定義函數(shù)名稱(chēng),然后單擊“確定”,假設(shè)選定的函數(shù)為T(mén)axRate。 步驟6.在“函數(shù)參數(shù)”對(duì)話(huà)框中輸入相關(guān)參數(shù),單擊“確定”,單元格中將出現(xiàn)相應(yīng)的計(jì)算結(jié)果。 ?。矗担丁∽远x函數(shù)的限制 并非所有的功能都可以在自定義函數(shù)中實(shí)現(xiàn)。在工作表單元格公式中引用自定義函數(shù)時(shí),不能更改Microsoft Excel的環(huán)境,這意味著自定義函數(shù)不能執(zhí)行以下任何操作: ?。保诠ぷ鞅碇胁迦?、刪除單元格或設(shè)置單元格格式。 2.更改其他單元格中的值。 ?。常诠ぷ鞑局幸苿?dòng)、重命名、刪除或添加工作表。 ?。矗娜魏苇h(huán)境選項(xiàng),例如計(jì)算模式或屏幕視圖。 ?。担蚬ぷ鞑局刑砑用Q(chēng)。 ?。叮O(shè)置屬性或執(zhí)行大多數(shù)方法。 其實(shí),Excel中的內(nèi)置工作表函數(shù)同樣也不能更改Microsoft Excel的環(huán)境,函數(shù)只能執(zhí)行計(jì)算以在輸入它們的單元格中返回某個(gè)值或文本。 如果在其他過(guò)程中調(diào)用自定義函數(shù)就不存在上述限制。盡管如此,為了規(guī)范代碼,建議所有上述需要更改Microsoft Excel環(huán)境功能的代碼在Sub過(guò)程中實(shí)現(xiàn)。 45.7如何制作加載宏 加載宏(英文名稱(chēng)為Add-in)是一類(lèi)程序的統(tǒng)稱(chēng),它們可以為Microsoft Excel添加可選的命令和功能。例如,“分析工具庫(kù)”加載宏程序提供了一套數(shù)據(jù)分析工具,在進(jìn)行復(fù)雜統(tǒng)計(jì)或工程分析時(shí),可以節(jié)省操作步驟,提高分析效率。 Microsoft Excel有三種類(lèi)型的加載宏程序:Excel加載宏、自定義的組件對(duì)象模型(COM)加載宏和自動(dòng)化加載宏。本節(jié)討論的加載宏特批Excel加載宏。 理論上來(lái)說(shuō),任何一個(gè)工作簿可以制作成為加載宏,但是某些工作簿不適合制作成為加載宏,例如一個(gè)包含圖表的工作簿,如果該工作簿轉(zhuǎn)換為加載宏,那么就無(wú)法查看該圖表,除非利用VBA代碼將圖表所在的工作表拷貝成為一個(gè)新的工作簿。 制作加載宏的步驟非常簡(jiǎn)單,一般來(lái)說(shuō)有兩種方法可以將普通工作簿轉(zhuǎn)換為加載宏。 1.在VBE的工程窗口中雙擊ThisWorkBook,按F4顯示屬性窗口,在其中修改IsAddin屬性的值為T(mén)rue。 ?。玻泶鏋榧虞d宏。 步驟1.在Excel窗口中單擊菜單“文件”——“另存為”。 步驟2.在“另存為”對(duì)話(huà)框中,單擊保存類(lèi)型下拉列表框,選擇“Microsoft Office Excel加載宏(*.xla)”。 步驟3.選擇保存位置,加載宏的缺省目錄為“c:\Documents and Settings\<用戶(hù)登錄名>\Application Data\Microslft\Addlns\”。 步驟4.單擊“確定”按鈕。 系統(tǒng)默認(rèn)的加載宏擴(kuò)展名為XLA,但并非一定要用XLA作為加載宏的擴(kuò)展名,使用任意的擴(kuò)展名都不會(huì)影響加載宏的功能。為了便于識(shí)別,建議使用XLA作為加載宏的擴(kuò)展名。 第46章 如何操作工作簿、工作表和單元格 在Excel中,對(duì)工作簿、工作表和單元格的操作,多數(shù)都可以利用VBA代碼實(shí)現(xiàn)兩樣的效果。本章介紹了工作簿對(duì)象的Workshee t對(duì)象的引用方法以及添加刪除對(duì)象的方法。Range對(duì)象是Excel最基本也是最常用的對(duì)象之一,對(duì)于Rabge對(duì)象處理的方法也有多種,本章將進(jìn)行詳細(xì)的介紹。 ?。矗叮薄orkbook對(duì)象 Workbook對(duì)象代表Microsoft Excel工作簿,也就是通常據(jù)說(shuō)的Excel文件,每個(gè)Excel文件都是一個(gè)Workbook對(duì)象。Workbook集合代表所有已經(jīng)打開(kāi)的工作簿,加載宏除外。 在代碼中經(jīng)常用的Workbook對(duì)象是ThisWorkbook和ActiveWorkbook。 1.ThisWorkbook對(duì)象指代碼所在的Workbook對(duì)象。 2.ActiveWorkbook對(duì)象指Excel中活動(dòng)窗口中的Workbook對(duì)象。 46.1.1 引用Workbook對(duì)象 使用Workbooks屬性引用工作簿有如下兩種方法。 1.使用工作簿序號(hào)引用Workbook對(duì)象,語(yǔ)法格式為: Workbooks.Item(工作簿序號(hào)) 工作簿序號(hào)是指創(chuàng)建或打開(kāi)工作簿的順序號(hào),Workbooks(1)代表Excel應(yīng)用程序中創(chuàng)建或打開(kāi)的第一個(gè)工作簿,而Workbook( Workbooks.Count)為最后一個(gè)工作簿,其中Workbooks.Count返回Workbooks集合中包含的Workbook對(duì)象的個(gè)數(shù)。即便是隱藏工作簿也包括在序號(hào)計(jì)數(shù)中,也就是說(shuō)可以使用工作簿序號(hào)引用隱藏的Workbook對(duì)象。 Item屬性是大多數(shù)對(duì)象集合的默認(rèn)屬性,因此可以省略Item關(guān)鍵字,簡(jiǎn)化為下面的語(yǔ)法形式: Workbooks(工作簿序號(hào)) ?。玻褂霉ぷ鞑荆ɑ蚣虞d宏)名稱(chēng)引用Workbook對(duì)象,語(yǔ)法格式為: Workbooks(工作簿名稱(chēng)) 利用Workbook對(duì)象的Name屬性可以返回工作簿名稱(chēng),但是Name為只讀性,不能利用Name屬性修改工作簿名稱(chēng);如果需要更改工作簿名稱(chēng),應(yīng)使用Workbook對(duì)象的SaveAs方法以其他名稱(chēng)保存工作簿。下面代碼將工作簿Book1.xls另存到C:\temp目錄,文件名稱(chēng)為ExcelHome.xls,如果不指定目錄,則新的工作簿保存在與原來(lái)工作簿相同的目錄中。 Workbooks("Book1.xls").SaveAs"c:\temp\ExcelHome.xls" ?。矗叮保病〈蜷_(kāi)一個(gè)已經(jīng)存在的工作簿 使用Workbooks對(duì)象的Open方法可以打開(kāi)一個(gè)已經(jīng)存在的工作簿,其語(yǔ)法格式如下: Workbooks.Open FileName:="c:\temp\ExcelHome.xls" 注意:參數(shù)名和參數(shù)值之間應(yīng)該使用“:=”符號(hào),而不是等號(hào)。 參數(shù)名稱(chēng)可以省略,代碼簡(jiǎn)化為: Workbooks.Open"c:\temp\ExcelHome.xls" ?。矗叮保场”闅v工作簿 對(duì)于兩種不同的引用工作簿的方法,分別可以使用For Each循環(huán)和For/Next循環(huán)遍歷Workbooks集合中的Workbook對(duì)象。 示例46.1 遍歷工作簿名稱(chēng) 步驟1.在工程中插入模塊,并修改其名稱(chēng)為“AllWorkBook"。 步驟2.在模塊AllWorkBook中寫(xiě)入如下代碼。 Sub AllWorkBook1() '聲明變量 Dim WK As Workbook, iRow As Integer ActiveSheet.Cells(1, 1) = "AllWorkBook1 運(yùn)行結(jié)果" iRow = 2 '循環(huán)取得WorkBooks集合中的所有WorkBook對(duì)象 For Each WK In Application.Workbooks '將工作簿的名稱(chēng)寫(xiě)入工作表第一列 ActiveSheet.Cells(iRow, 1) = WK.Name '行號(hào)遞增 iRow = iRow + 1 Next End Sub Sub AllWorkBook2() '聲明變量 Dim i As Integer, iRow As Integer ActiveSheet.Cells(1, 2) = "AllWorkBook2 運(yùn)行結(jié)果" iRow = 2 '設(shè)置循環(huán)變量的初值和終止值 For i = 1 To Application.Workbooks.Count '將工作簿的名稱(chēng)寫(xiě)入工作表第二列 ActiveSheet.Cells(iRow, 2) = Workbooks(i).Name '行號(hào)遞增 iRow = iRow + 1 Next End Sub 步驟3.運(yùn)行宏AllWorkBook1。 步驟4.運(yùn)行宏AllWorkBook2?!?/div> 運(yùn)行結(jié)果,兩個(gè)過(guò)程的結(jié)果分別顯示在第一列和第二列,內(nèi)容完全相同,實(shí)際應(yīng)用中可以根據(jù)需要選擇任何一種遍歷方法。這兩種遍歷方法適用于多數(shù)對(duì)集合,如遍歷Worksheets集合中的Worksheet對(duì)象。 ?。矗叮保础√砑右粋€(gè)新的工作簿 在Excel中單擊菜單“文件”——新建,然后單擊新建工作簿窗口的“空白工作簿”;或單擊標(biāo)準(zhǔn)工具欄的“新建”按鈕,可以在Excel中產(chǎn)生一個(gè)新的工作簿。利用WorkBook對(duì)象的Add方法也可以實(shí)現(xiàn)添加一個(gè)新的工作簿,其語(yǔ)法格式為: ?。護(hù)rkbooks.Add ?。矗叮保怠”Wo(hù)工作簿 從安全角度考慮,可以為工作簿設(shè)置密碼。下面代碼設(shè)置活動(dòng)工作簿的保密密碼為“abc”。 ActiveWorkbook.Protect Password:="abc" 如果需要修改工作簿,可以利用Unprotect方法取消工作簿的保護(hù)。 ActiveWorkbook.Unprotect Password:="abc" ?。矗叮保丁£P(guān)閉工作簿 使用WorkBook對(duì)象的Close方法可以關(guān)閉打開(kāi)的工作簿。如果該工作簿有更改,Excel將顯示對(duì)話(huà)框,詢(xún)問(wèn)是否保存更改。 關(guān)閉工作簿時(shí)設(shè)置SaveChanges參數(shù)值為False,將放棄所有對(duì)該工作簿的更改,并且不會(huì)出現(xiàn)保存提示框。 ActiveWorbook.Close SaveChanges:=False 46.2 Worksheet對(duì)象 Worksheet對(duì)象代表一張工作表。Worksheet對(duì)象既是Worksheets集合的成員,同時(shí)又是Sheets集合的成員。Worksheets集合包含工作簿中所有的Worksheet對(duì)象。Sheets集合除了包含工作簿中所有的Worksheet對(duì)象外,還包含工作簿中所有的圖表工作表(Chart)對(duì)象和宏表對(duì)象。 ActiveSheet對(duì)象可用來(lái)引用處于活動(dòng)狀態(tài)的工作表。 ?。矗叮玻薄∫肳orksheet對(duì)象 對(duì)于Worksheet對(duì)象,有如下3種引用方法。 ?。保褂霉ぷ鞅硇蛱?hào)引用Worksheet對(duì)象,語(yǔ)法格式為: Worksheets(工作表序號(hào)) 工作表序號(hào)是按照工作表的排列順序依次編號(hào)的,Worksheets(1)代表工作簿中的第一個(gè)工作表,而Worksheets(Worksheets.Co unt)代表最后一個(gè)工作表,其中Worksheets.Count返回Worksheets集合中包含的Worksheet對(duì)象的個(gè)數(shù)。隱藏工作表也包括在序號(hào)計(jì)數(shù)中,也就是說(shuō)可以使用工作表序號(hào)引用隱藏的Worksheet對(duì)象。 ?。玻褂霉ぷ鞅砻Q(chēng)引用Worksheet對(duì)象,語(yǔ)法格式為: Worksheets(工作表名稱(chēng)) 使用工作表名稱(chēng)引用Workbook對(duì)象時(shí),工作表的名稱(chēng)不區(qū)分大小寫(xiě)字母,因此Worksheets(“sheet1”)引用的是同一個(gè)工作表,但是Worksheet對(duì)象的Name屬性返回值是工作表的實(shí)際名稱(chēng),可能和引用工作表時(shí)的名稱(chēng)有大小寫(xiě)區(qū)別。 ?。常褂霉ぷ鞅淼拇a名(Codename)引用Worksheet對(duì)象。假設(shè)工作簿中有3個(gè)工作表。 在VBE窗口中查看工程窗口和屬性窗口。在工程窗口中Worksheet對(duì)象顯示為“工作表代碼名(工作表名稱(chēng))”的形式,對(duì)應(yīng)在屬性窗口中,“名稱(chēng)”欄為代碼名,“Name”欄為工作表名稱(chēng)。使用代碼名Sheet1等同于Worksheets(Sht3)。工作表的名稱(chēng)和其代碼名也可以相同。 46.2.2 遍歷工作簿中的所有工作表 遍歷工作表的方法與遍歷工作簿的方法完全相同,可以使用For Each循環(huán)或For/Next循環(huán),具體請(qǐng)參閱46.1.3小節(jié)。 ?。矗叮玻场√砑有碌墓ぷ鞅?/div> 在Excel單擊菜單“插入”——“工作表”可以在當(dāng)前工作簿中插入一個(gè)新的工作表。使用Add方法也可以在工作簿中插入一個(gè)新的工作表,其語(yǔ)法格式為: Sheets.Add 提示:插入指定名稱(chēng)的工作表可以使用代碼Sheets.Add.Name = "newSheet",雖然在VBA幫助中沒(méi)有說(shuō)明Add方法具有Name屬性,但上述代碼是可以運(yùn)行。需要注意的是,采用這個(gè)簡(jiǎn)化方式時(shí),無(wú)法使用Add方法的參數(shù)。 ?。矗叮玻础】截惡鸵苿?dòng)工作表 Worksheet對(duì)象的Copy方法和Move方法可以實(shí)現(xiàn)工作表的拷貝和移動(dòng)。其語(yǔ)法格式為: Copy(Befor,After) Move(Before,After) Before和After均為可選參數(shù),二者只能選擇一個(gè)。Copy和Move方法不僅可以實(shí)現(xiàn)同一個(gè)工作簿之內(nèi)的工作表的拷貝和移動(dòng),也可以實(shí)現(xiàn)工作簿之間的工作表拷貝和移動(dòng)。下面的代碼可以將工作簿Book1.XLS中的工作表Sheet1拷貝到工作簿Book2.XLS中,并放置在原有的第3個(gè)工作表之前。 Workbooks("Book1.xls").Sheets("Sheet1").Copy Before:=Workbooks("Book2.xls").Sheets(3) 46.2.5 如何保護(hù)工作表 為了防止工作表被意外修改可以設(shè)置工作表保護(hù)密碼。Worksheet對(duì)象Protect方法有很多可選參數(shù),其中Password參數(shù)用于設(shè)置保護(hù)密碼。 ActiveSheet.Protect "ExcelHome" ?。矗叮玻丁h除工作表 使用Worksheet對(duì)象的Delete方法刪除工作表時(shí),將會(huì)出現(xiàn)提示框,單擊“刪除”完成刪除工作表。 如果不希望在刪除工作表時(shí)出現(xiàn)這個(gè)提示框,可以使用DisplayAlerts禁止提示框的顯示。 Application.DisplayAlerts = False Worksheets("Sheet1").Delete Application.DisplayAlerts = True 注意:代碼中如果使用了Application.DisplayAlerts=False, 在使用Application.DisplayAlerts=True恢復(fù)之前,所有的系統(tǒng)提示信息都是將被屏蔽。如果沒(méi)有使用代碼進(jìn)行恢復(fù),則在代碼運(yùn)行結(jié)束后,Micorosoft Excel將該屬性設(shè)置為T(mén)rue。 46.3 Range對(duì)象 Range對(duì)象代表工作表中的單個(gè)單元格或多個(gè)單元格組成的區(qū)域,該區(qū)域可以是連續(xù)的也可以是非連續(xù)的。雖然單元格是Excel操作的基本單位,但是Excel中不存在單元格對(duì)象。 ?。矗叮常薄∫脝蝹€(gè)單元格 在VBA代碼中有多種方法可以用來(lái)引用單個(gè)單元格。 ?。保褂谩埃蹎卧衩Q(chēng)]”的形式:這是在寫(xiě)法上最簡(jiǎn)單的一種引用方式。其中單元格名稱(chēng)與在工作表單元格公式中使用的A1樣式單元格名稱(chēng)完全相同,如[C5]代表工作表中的C5單元格。在這種引用方式中,單元格名稱(chēng)不能使用變量。 2.使用Cells屬性:Cells屬性返回一個(gè)Rabge對(duì)象。其語(yǔ)法格式為: Cells(RowIndex,ColumnIndex) Cells屬性的參數(shù)為行號(hào)和列號(hào)。行號(hào)是一個(gè)數(shù)值,其范圍為1~65 536。列號(hào)可以是數(shù)值,其范圍為1~256;也可以是字母形式的列標(biāo),其范圍為“A”~“IV”。工作表所支持的列數(shù)量為256,其列標(biāo)為“IV”。同樣是引用C5單元格,可以有兩種寫(xiě)法: Cells(5,3) Cells(5,"c") ?。玻褂肦ange(單元格名稱(chēng))形式:其中單元格名稱(chēng)可以使用變量或表達(dá)式。在參數(shù)名稱(chēng)的表達(dá)式中可以使用"&"連接符,連接兩個(gè)字符串。 Range(“C5”) ?。矗叮常病卧窀袷降某S脤傩?/div> 常用的單元格格式有字體大小、字體顏色、背景色以及邊框等,下面的代碼將設(shè)置“A1:D10”區(qū)域的格式為:紅色11號(hào)字,背景色為青色,并添加邊框。 Sub CellFormat() With Range("A1:D10") With .Font '設(shè)置字號(hào) 'Size = 11 '設(shè)置字體顏色為紅色 'Color = vbRed End With '設(shè)置單元格邊框線(xiàn) Borders.LineStyle = xlContinuous '設(shè)置單元格背景色為青色 .Interior.Color = vbCyan End With End Sub ?。矗叮常场√砑优?/div> Comment對(duì)象代表單元格的批注,是Comments集合的成員。Comment對(duì)象并沒(méi)有Add方法,添加批注需要使用Range對(duì)象的AddCo mment方法。下述代碼在活動(dòng)單元格添加批注,內(nèi)容為“ExcelHome”。 Activecell.AddComment "ExcelHome" 利用For Each循環(huán)可以遍歷Comments集合中的所有Comment對(duì)象。 46.3.4 如何表示一個(gè)區(qū)域 Range屬性除了可以返回單個(gè)單元格,也可以返回單元格區(qū)域。Range的語(yǔ)法格式如下: Range(cell1,cell2) 參數(shù)Cell必須為A1樣式引用,是一個(gè)單元格或區(qū)域的名稱(chēng)字符串。參數(shù)Cell2,可以是一個(gè)包含單個(gè)單元格、整列或整行的Range對(duì)象,也可以是一個(gè)單元格或區(qū)域的名稱(chēng)字符串。 如果引用以A3單元格和C6單元格之間所包含的單元格區(qū)域?qū)ο?,可以使用如下幾種方法: Range(“A3:C6”) Range([A3],[C6]) Range(Cells(3,1),Cells(6,3)) Range(Range("A3"),Range("C6")) 第一種Range(“A3,C6”)引用方式是最常用的方式,其中的冒號(hào)是區(qū)域操作符,其含義是以?xún)蓚€(gè)A1樣式單元格為頂點(diǎn)的矩形單元格區(qū)域。 46.3.5 如何定義名稱(chēng) 在工作表公式中,經(jīng)常通過(guò)定義名稱(chēng)來(lái)簡(jiǎn)化工作表單元格公式。本節(jié)所批的名稱(chēng)是單元格區(qū)域的定義名。Workbook對(duì)象的Names集合代表工作簿中所有名稱(chēng)組成的集合。Add方法用于指定新的名稱(chēng),參數(shù)RefersToR1C1用于指定單元格區(qū)域,格式為R1C1引用方式。利用Range對(duì)象的Name屬性,指定名稱(chēng)的代碼為: Range("A3:D6").Name = "data" ?。矗叮常丁∵x中工作表的指定區(qū)域 在VBA代碼中經(jīng)常要引用某些特定區(qū)域,CurrentRegion屬性和UsedRange屬性是兩個(gè)最常用的屬性。 CurrentRegion屬性返回Range對(duì)象,就是通常據(jù)說(shuō)的當(dāng)前區(qū)域。當(dāng)前區(qū)域是一個(gè)由任意空行和空列包圍的最小矩形單元格區(qū)域。按Ctrl+Shift+8組合鍵可以選中當(dāng)前區(qū)域,選中著色區(qū)域內(nèi)的任意單元格時(shí),即使該單元格沒(méi)有內(nèi)容,按Ctrl+Shift+8組合鍵,同樣會(huì)選中相應(yīng)的著色區(qū)域。 UsedRange屬性返回Range對(duì)象,代表指定工作表上的已使用區(qū)域,該區(qū)域是由工作表中已經(jīng)被使用的單元格組成的矩形單元格區(qū)域。這里的“使用”與單元格是否有內(nèi)容無(wú)關(guān),即使只是改變了單元格的格式,這個(gè)單元格也是已經(jīng)被告使用,它將被包括在UsedR ange屬性返回的Range對(duì)象中。 可以使用Rabge對(duì)象的Select方法或Activate方法來(lái)檢查相應(yīng)區(qū)域的范圍。 Activate.UsedRange.Select Activate.UsedRange.Activate 46.3.7 特殊區(qū)域——行與列 行與列是工作表中經(jīng)常用到的兩個(gè)Range對(duì)象,對(duì)于行與列的引用既可以使用Rows屬性和Columns屬性,也可以使用Range屬性。 引用第1行至第5行的區(qū)域可以使用如下幾種形式: Rows(“1:5”) Range(“A1:IV5”) Range(“1:5”) 列的引用方法與上述行的引用方式類(lèi)似。例如引用A列~E列的區(qū)域可以使用如下幾種形式: Colums("A:E") Range("A1:E65536") Range("A:E") ?。矗叮常浮h除單元格 Range對(duì)象的Delete方法可刪除一個(gè)單元格或單元格區(qū)域。下面代碼將刪除C3:F5單元格區(qū)域,其下的替補(bǔ)單元格向上移動(dòng),也就是原來(lái)C6:F8單元格區(qū)域?qū)⑾蛏弦苿?dòng)到被刪除的區(qū)域。 Range("C3:F5").Delete Shift:=xlShiftUp ?。矗叮常埂〔迦雴卧?/div> Range對(duì)象的Insert方法可在工作表中插入一個(gè)單元格或單元格區(qū)域,其他單元格作相應(yīng)移動(dòng)以騰出空間。下面代碼在工作表的第2行插入單元格,原工作表的第2行單元格將占據(jù)第3行的位置。 Rows(2).Insert ?。矗叮常保啊『喜^(qū)域與相交區(qū)域 Union方法返回Range對(duì)象,代表兩個(gè)或多個(gè)區(qū)域的合并區(qū)域,其參數(shù)為Range類(lèi)型。 Application.Union(Range("A3:D6"),Range("C5:F8")) Intersect方法返回Range對(duì)象,代表兩個(gè)或多個(gè)單元格區(qū)域重疊的矩形區(qū)域,其參數(shù)為Range類(lèi)型,如果參數(shù)單元格區(qū)域沒(méi)有重疊區(qū)域,那么結(jié)果為Nothing。 Application.Intersect(Range("A3:D6"),Range("C5:F8")) 利用 Intersect方法可以判斷某個(gè)單元格區(qū)域是否完全包含在另一個(gè)單元格區(qū)域中。 第47章 事件的應(yīng)用 在Excel VBA中,事件是指對(duì)象可以辨認(rèn)的動(dòng)作。用戶(hù)可以指定VBA代碼來(lái)對(duì)這些動(dòng)作做出響應(yīng)。Excel可以監(jiān)視多種不同類(lèi)型的事件,Excel中的工作表、工作簿、應(yīng)用程序、圖表工作表、查詢(xún)表和控件等不同對(duì)象都有不同的事件,而且每個(gè)對(duì)象都有多種相關(guān)的事件,本章將主要介紹工作表和工作簿的常用事件。 ?。矗罚薄∈录^(guò)程 事件過(guò)程作為一種特殊的Sub過(guò)程,在事件被觸發(fā)時(shí)執(zhí)行,如果事件過(guò)程包含參數(shù),系統(tǒng)會(huì)為相關(guān)參數(shù)賦值。事件過(guò)程必須寫(xiě)入相應(yīng)的模塊中才能發(fā)揮作用,工作簿事件過(guò)程須寫(xiě)入Thisworkbook模塊中,工作表事件過(guò)程則須寫(xiě)入相應(yīng)的工作表模塊中;且只有過(guò)程所在工作表的行為可以觸發(fā)該事件。 47.2 工作表事件 工作表事件發(fā)生在特定的Worksheet對(duì)象中。Worksheet對(duì)象也是Excel最常用的對(duì)象之一,因此實(shí)際應(yīng)用中經(jīng)常會(huì)用到Worksheet對(duì)象事件。 47.2.1 Change事件 工作表中的單元格被用戶(hù)手工修改或被VBA代碼修改時(shí),將觸發(fā)工作表Change事件。值得注意的是,雖然事件的名稱(chēng)是Change 但是并非工作表中單元格的任何變化都能觸發(fā)該事件。 Change事件的參數(shù)Target是Change變量,代表工作表中發(fā)生變化的區(qū)域,它可以是一個(gè)單元格也可以攻玉是多個(gè)單元格組成的區(qū)域。在實(shí)際應(yīng)用中,用戶(hù)通常希望只有工作表中的某些特定單元格區(qū)域發(fā)生變化時(shí),才激活Change事件,這就需要在Change事件中對(duì)Target參數(shù)進(jìn)行判斷。 示例47.1 自動(dòng)記錄數(shù)據(jù)錄入日期 在工作表ChangDemo的代碼窗口中寫(xiě)入如下代碼: Private Sub Worksheet_Change(ByVal Target As Range) With Target '判斷是否選中了單個(gè)單元格 If .Count = 1 Then '判斷單元格是否在第一列 If .Column = 1 Then '禁止事件激活 Application.EnableEvents = False '在相應(yīng)行的第二列輸入當(dāng)前日期 Target.Offset(0, 1) = Date '恢復(fù)事件激活 Application.EnableEvents = True End If End If End With End Sub 返回Excel界面,在工作表ChangDemo中的A列中輸入備忘內(nèi)容,Change事件將自動(dòng)在B列的相應(yīng)行寫(xiě)入當(dāng)前日期。修改工作表中其他列的單元格(如C列),工作表的Change事件同樣會(huì)被觸發(fā),但是因?yàn)椴粷M(mǎn)足代碼中的判斷條件,所以不會(huì)執(zhí)行寫(xiě)入日期的代碼。 如何禁止事件的激活 上述代碼使用Application.EnableEvents=False為防止事件被意外多次激活。Application對(duì)象的EnableEvents屬性可以設(shè)置是否允許對(duì)象的事件被激活。上述代碼中如果沒(méi)有禁止事件激活的代碼,在寫(xiě)入當(dāng)前日期的代碼執(zhí)行后,工作表的Change事件被再次激活,事件代碼被再次執(zhí)行。某些情況下,這種事件的意外激活會(huì)重復(fù)多次發(fā)生,甚至造成死循環(huán)導(dǎo)致事件代碼重復(fù)調(diào)用,無(wú)法結(jié)束運(yùn)行。因此在可能意外觸發(fā)事件的時(shí)候,需要設(shè)置Application.EnableEvents=False禁止事件激活。但這個(gè)設(shè)置并不能限制控件的事件被激活。 EnableEvents屬性的值不會(huì)隨著事件過(guò)程的執(zhí)行結(jié)束而自動(dòng)恢復(fù)為T(mén)rue,也就是說(shuō)需要在代碼運(yùn)行結(jié)束之前進(jìn)行恢復(fù)。如果代碼被異常終止,而EnableEvents屬性的值仍然為False,則相關(guān)的事件都無(wú)法激活?;謴?fù)辦法是在VBE的立即窗口中執(zhí)行Application.EnableEven ts=True。 ?。矗罚玻病electionChange事件 工作表中選定區(qū)域的范圍發(fā)生變化將觸發(fā)工作表的SelectionChange事件。SelectionChange事件的參數(shù)Target是Range變量,代表工作青史被選中的區(qū)域,相當(dāng)于Selection屬性返回的Range對(duì)象。 示例47.2 高亮顯示工作表中選定區(qū)域所在的行和列 在工作表SelectionChangeDemo中寫(xiě)入如下的SelectionChange事件代碼。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) With Target '清除工作表單元格的背景色 .Parent.Cells.Interior.ColorIndex = xlNone '設(shè)置選中區(qū)域所在行的背景色 .EntireRow.Interior.Color = vbCyan '設(shè)置選中區(qū)域所在列的背景色 .EntireColumn.Interior.Color = vbCyan End With End Sub 返回Excel界面,在工作表SelectionChangeDemo中選中一個(gè)單元格區(qū)域C10:C14,顯示效果,第10行至第14行以及第3列單元格高亮顯示。 ?。矗罚场」ぷ鞑臼录?br> 工作簿事件發(fā)生在特定的Workbook對(duì)象中。 ?。矗罚常薄pen事件 Open事件是Workbook對(duì)象最常用的事件之一,它發(fā)生于用戶(hù)打開(kāi)工作簿之時(shí)。 注意:在如下兩種情況下,打開(kāi)工作簿不會(huì)觸發(fā)Open事件。 ?。保诎醋?lt;Shift>鍵的同時(shí)打開(kāi)工作簿。 ?。玻诖蜷_(kāi)文件時(shí)的宏安全警告提示框里,選擇了“禁用宏”。 Open事件經(jīng)常被用來(lái)自動(dòng)設(shè)置用戶(hù)界面,這樣的好處在于,無(wú)論工作簿關(guān)閉時(shí)的狀態(tài)如何,再次打開(kāi)時(shí)都可以按照某個(gè)特定風(fēng)格呈現(xiàn)在用戶(hù)面前。 示例47.3 自動(dòng)設(shè)置工作簿打開(kāi)時(shí)的界面風(fēng)格 步驟1.在Thisworkbook模塊中寫(xiě)入如下的Open事件代碼。 Private Sub Workbook_Open() 'Excel窗口最大化 Application.WindowState = xlMaximized With ActiveWindow '工作表窗口最大化 .WindowState = xlMaximized '禁止顯示行標(biāo)和列標(biāo) .DisplayHeadings = False End With '激活Welcome工作表 Sheets("Welcome").Select End Sub 步驟2.返回Excel界面,選中Sheet1工作表。 步驟3.單擊Excel窗口右上角的向下還原按鈕,取消窗體最大化。 步驟4.單擊“文件”——“保存”。 步驟5.單擊“文件”——“退出”關(guān)閉工作簿。 步驟6.單擊“文件”——“打開(kāi)”,再次打開(kāi)剛才保存的工作簿。 步驟7.單擊安全警告提示框的“啟用宏”按鈕。 工作簿打開(kāi)后,Excel窗口是最大化的,Welcome工作表成為活動(dòng)工作表,而不是關(guān)閉工作簿時(shí)的Sheet1工作表。 ?。矗罚常病eforeClose事件 工作簿被關(guān)閉之前BeforeClose事件被激活。BeforeClose事件經(jīng)常和Open事件配合使用,在Open事件中修改的Excel設(shè)置和用戶(hù)界面,可以在BeforeClose事件中進(jìn)行恢復(fù)。 示例47.4 關(guān)閉工作簿時(shí)自動(dòng)恢復(fù)Excel默認(rèn)界面風(fēng)格 在Thisworkbook模塊中寫(xiě)入如下的代碼: Private Sub Workbook_Open() With Application '隱藏公式編輯欄 .DisplayFormulaBar = False '設(shè)置鼠標(biāo)指針為沙漏型 .Cursor = xlWait End With End Sub Private Sub Workbook_BeforeClose(Cancel As Boolean) With Application '顯示公式編輯欄 .DisplayFormulaBar = True '恢復(fù)系統(tǒng)默認(rèn)鼠標(biāo)指針 .Cursor = xlDefault End With End Sub 保存并關(guān)閉工作簿,然后再次打開(kāi)工作簿,公式編輯欄已經(jīng)隱藏且鼠標(biāo)指針改為沙漏形。而在BeforeClose事件中,對(duì)相應(yīng)的設(shè)置進(jìn)行了恢復(fù),所以工作簿關(guān)閉后,Excel將恢復(fù)默認(rèn)的系統(tǒng)設(shè)置。 ?。矗罚常场∪抗ぷ鞅硎褂孟嗤氖录a 工作簿事件有幾個(gè)名稱(chēng)是以“Sheet”開(kāi)頭的,這些事件的一個(gè)共同特點(diǎn)是,工作簿內(nèi)的任意工作表的行為都將觸發(fā)事件代碼的執(zhí)行。 如果希望所有的工作表都相應(yīng)相同的工作表事件代碼,有兩種實(shí)現(xiàn)方法: 1.在每個(gè)工作表代碼模塊中寫(xiě)入相同的事件代碼。 2.使用相應(yīng)的工作簿事件代碼。 毫無(wú)疑問(wèn),第二種方法是最簡(jiǎn)潔的實(shí)現(xiàn)方法。 示例47.5 高亮顯示任意工作表中選定區(qū)域所在的行和列 與示例47.2相對(duì)應(yīng),如果希望在工作簿中的任意工作表都擁有這種高亮顯示的效果,可以在Thisworkbook模塊中寫(xiě)入如下事件代碼: Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) With Target '清除工作表單元格的背景色 .Parent.Cells.Interior.ColorIndex = xlNone '設(shè)置選中區(qū)域所在行的背景色 .EntireRow.Interior.Color = vbCyan '設(shè)置選中區(qū)域所在列的背景色 .EntireColumn.Interior.Color = vbCyan End With End Sub 與示例47.2相比,這種方法不必在每個(gè)工作表代碼模塊中寫(xiě)入相同的事件代碼,而且當(dāng)工作簿中新增工作表時(shí),也無(wú)需為新建工作表添加Change事件代碼。 ?。矗罚础》菍?duì)象事件 Excel提供了兩種不與對(duì)象關(guān)聯(lián)的特殊事件,利用Application對(duì)象的相應(yīng)方法可以設(shè)置這些特殊事件。 47.4.1 OnTime事件 OnTime事件指定一個(gè)過(guò)程在將來(lái)的特定時(shí)間運(yùn)行,此處的特定事件既可以是具體指定的某個(gè)時(shí)間點(diǎn),也可以是指定的一段時(shí)間之后。 示例47.6 文件保存提醒 步驟1.在工作簿中插入標(biāo)準(zhǔn)模塊,并在其中寫(xiě)入如下代碼。 '定義全局變量 Public iTime As Date Sub SaveReminder() '判斷當(dāng)前工作簿是否被修改 If ThisWorkbook.Saved = False Then '顯示消息框 If MsgBox("為了防止數(shù)據(jù)丟失請(qǐng)保存文件" & _ vbCrLf & "點(diǎn)擊<是>進(jìn)行保存", vbYesNo, "OnTimeDemo") = vbYes Then '如果用戶(hù)選擇<是>,則保存當(dāng)前工作簿 ThisWorkbook.Save End If End If '記錄下次運(yùn)行的時(shí)間點(diǎn) iTime = Now + TimeValue("0:0:10") '設(shè)置10秒后再次運(yùn)行SaveReminder過(guò)程 Application.OnTime iTime, "SaveReminder" End Sub 步驟2.在Thisworkbook中寫(xiě)入如下代碼。 Private Sub Workbook_Open() '記錄下次運(yùn)行的時(shí)間點(diǎn) iTime = Now + TimeValue("0:0:10") '設(shè)置10秒后再次運(yùn)行SaveReminder過(guò)程 Application.OnTime iTime, "SaveReminder" End Sub Private Sub Workbook_BeforeClose(Cancel As Boolean) '取消設(shè)置的自動(dòng)運(yùn)行 Application.OnTime iTime, "SaveReminder", Schedule:=False End Sub 步驟3.保存并關(guān)閉工作簿。 重新打開(kāi)工作簿,在10秒鐘之后將看到工作簿保存提醒消息框。 Now函數(shù)返回當(dāng)前計(jì)算機(jī)系統(tǒng)設(shè)置的日期和時(shí)間:TimeValue("0:0:10")函數(shù)返回一個(gè)Date類(lèi)型數(shù)據(jù),相當(dāng)于10秒;SaveReminder是標(biāo)準(zhǔn)模塊中在指定時(shí)間執(zhí)行的過(guò)程的名稱(chēng)。為了演示方便,示例中設(shè)定的較短的代碼執(zhí)行時(shí)間間隔。 首先在工作簿打開(kāi)時(shí)會(huì)觸發(fā)工作簿的Open事件,其中的OnTime設(shè)置10秒后運(yùn)行SaveReminder過(guò)程。 在SaveReminder過(guò)程中,判斷工作簿的Saved屬性的值,如果為False說(shuō)明工作簿已經(jīng)被修改,進(jìn)而提示用戶(hù)進(jìn)行保存,如果用戶(hù)單擊“是”按鈕,就保存當(dāng)前工作簿。在過(guò)程的最后,設(shè)置10秒后再次執(zhí)行SaveReminder過(guò)程代碼。 在工作簿的BeforClose事件中,利用Onkey方法的Schedule參數(shù)清除已經(jīng)設(shè)置的定時(shí)運(yùn)行過(guò)程,如果省略此代碼,即使工作簿已經(jīng)關(guān)閉,到達(dá)指定時(shí)間時(shí),Excel將再次打開(kāi)工作簿運(yùn)行SaveReminder過(guò)程代碼。 ?。矗罚矗病nKey 使用OnKey方法可以設(shè)置按下特定的鍵或組合鍵時(shí)運(yùn)行指定的過(guò)程代碼。Excel會(huì)一直監(jiān)視著用戶(hù)的任何鍵盤(pán)操作,因此理論上可設(shè)置任何一個(gè)鍵或組合鍵來(lái)運(yùn)行指定的過(guò)程代碼。 注意:在工作表中輸入公式或在對(duì)話(huà)框中時(shí),OnKey設(shè)置的組合鍵無(wú)效。 示例47.7 為Excel設(shè)置自定義快捷鍵 步驟1.在工作簿中插入標(biāo)準(zhǔn)模塊,在模塊中寫(xiě)入如下代碼。 Sub OnKeyDemo() Application.OnKey"^a","CtrlA" End Sub Sub CtrlA() MsgBox "您按下了Ctrl+A組合鍵" End Sub 步驟2.返回Excel界面,按<Ctrl+A>組合鍵,將出現(xiàn)消息框。 OnKey方法的參數(shù)"^a"中的"^"代表<Ctrl>鍵,關(guān)于其他功能鍵的表示方法請(qǐng)參考VBA幫助。 默認(rèn)情況下,Excel中<Ctrl+A>組合鍵為選中工作表中的全部單元格。運(yùn)行OnKeyDemo過(guò)程之后,按<Ctrl+A>組合鍵將執(zhí)行CtrlA過(guò)程代碼顯示消息框。這也就是說(shuō),OnKey方法設(shè)置的組合鍵與系統(tǒng)默認(rèn)的組合鍵相比有更高的優(yōu)先級(jí)。 使用如下的代碼可以恢復(fù)<Ctrl+A>組合鍵的默認(rèn)設(shè)置功能。 Application.OnKey"^a" 第48章 控件在工作表中的應(yīng) 在工作表中可以使用兩種控件:窗體控件和ActiveX控件,二者既有聯(lián)系又有明顯的區(qū)別。 48.1 在工作表中插入控件 控件是在Excel與用戶(hù)交互時(shí),用于輸入數(shù)據(jù)或操作數(shù)據(jù)的對(duì)象。在工作表中使用控件將為用戶(hù)提供更加友好的操作界面??丶哂胸S富的屬性,并且可以被不同的事件激活以執(zhí)行相關(guān)代碼。 示例48.1 在工作表中使用按鈕控件 下面介紹如何在工作表中插入按鈕控件。 步驟1.打開(kāi)一個(gè)新的工作簿。 步驟2.單擊菜單“視圖”——“工具欄”——“控件工具箱”;或者單擊Visual Basic工具欄上的“控件工具箱”按鈕,將顯示控件工具箱工具欄。 步驟3.單擊“命令按鈕”。 步驟4.移動(dòng)鼠標(biāo)至工作表的任意區(qū)域,光標(biāo)變?yōu)槭中巍?/div> 步驟5.按住鼠標(biāo)左鍵,在工作表中拖動(dòng);至適當(dāng)位置再釋放鼠標(biāo),工作表中將添加一個(gè)名稱(chēng)為CommandButton1的按鈕。 步驟6.如下4種方法可以為新的命令按鈕控件添加事件代碼。 ?。保p擊命令按鈕控件。 ?。玻诿畎粹o上右鍵單擊選擇“查看代碼”。 ?。常畣螕艨丶ぞ呦涔ぞ邫谏喜榭创a按鈕。 ?。矗袚Q到VBE窗口,在代碼中選擇CommandButton1對(duì)象和相應(yīng)的事件。 步驟7.代碼窗口中將自動(dòng)添加了按鈕控件的Click事件模塊框架。 步驟8.在模塊框架中寫(xiě)入如下事件代碼。 Private Sub CommandButton1_Click() MsgBox "歡迎加入Excel Home" End Sub 步驟9.返回Excel界面,單擊控件工具箱工具欄或Visual Basic工具欄的退出編輯模式按鈕。 步驟10.單擊工作表中的按鈕,將看到歡迎消息框。 ?。矗福病〈绑w控件和工具箱控件 在Excel中有兩種控件,分別是窗體控件和控件工具箱控件,后者也被成為ActiveX控件。 單擊菜單“視圖”——“工具欄”——“窗體”,將顯示窗體工具伴。窗體控件是Excel 5和Excel 95完全兼容的,可以用于普通工作表和MS Excel 5.0對(duì)話(huà)框工作表中。部分工具欄按鈕處于禁用狀態(tài),這些窗體控件只能用于MS Excel 5.0對(duì)話(huà)框工作表中,在普通的工作表中無(wú)法使用。 控件工具箱控件為ActiveX控件,是用戶(hù)窗體上的控件子集,這些控件只能用于Excel 97或更高版本的Excel中。對(duì)比不難看出,其中部分控件從外觀上看是相同的,其功能也非常相似,如按鈕,組合框和列表框等,但ActiveX控件擁有豐富的屬性,支持多種事件。正是由于ActiveX控件具有的如上這些優(yōu)勢(shì),使得ActiveX控件在Excel中得到比窗體控件更為廣泛的應(yīng)用。本章后續(xù)章節(jié)中所涉及的控件勻指ActiveX控件。 48.3 控件的屬性 每種控件都有多種屬性,這些屬性是對(duì)控件某些特征的描述。ActiveX控件的一個(gè)最重要的優(yōu)勢(shì)在于擁有豐富的屬性,在不同的應(yīng)用中需要設(shè)置不同的屬性值。以命令按鈕控件為例,更改其屬性值的步驟如下。 步驟1.單擊控件工具箱工具欄上或Visual Basic工具欄上的編輯模式按鈕,進(jìn)入編輯模式。 步驟2.在控件上右鍵單擊,在彈出的快捷菜單上選擇“屬性”。 步驟3.在屬性窗口中,設(shè)置命令按鈕的屬性值,Caption屬性為"Excel Home";AutoSize屬性為T(mén)rue。命令按鈕控件的尺寸自動(dòng)調(diào)整以適應(yīng)新設(shè)置的Caption。 如果需要,還可以再繼續(xù)設(shè)置其他的屬性。全部設(shè)置完成后,切換回工作表窗口,退出控件的編輯模式即可。 ?。矗福础≌J(rèn)識(shí)常用控件 本節(jié)將介紹控件工具箱工具欄所包含的基本控件。 ?。矗福矗薄∽畛S玫目丶畎粹o(CommandButton) 命令按鈕是最常用的ActiveX控件,一般用來(lái)執(zhí)行指定的代碼。鼠標(biāo)單擊命令按鈕將觸發(fā)其Click事件,在Click事件代碼中,可以顯示消息框,也可以完成操作工作表單元格等任務(wù)。 示例48.2 使用命令按鈕控件設(shè)置單元格格式 如果需要多次執(zhí)行錄制的宏,利用命令按鈕執(zhí)行宏代碼,是最方便快捷的方法。 步驟1.在工作表中設(shè)置活動(dòng)單元格背景色為紅色,錄制宏產(chǎn)生相應(yīng)的代碼如下,該代碼已經(jīng)保存在工作簿的“模塊1”中。 Sub Macro1() 'Macro1 Macro '宏由 Taller 錄制,時(shí)間:2007-5-26 With Selection.Interior .ColorIndex = 3 .Pattern = xlSolid End With End Sub 步驟2.在工作表中添加命令按鈕控件。 步驟3.雙擊處于編輯模式的命令按鈕,在VBE的代碼窗口中將自動(dòng)添加Click事件的代碼框架。 步驟4.使用如下兩種方法,可以實(shí)現(xiàn)單擊命令按鈕運(yùn)行相應(yīng)的代碼。 ?。保畬浿坪戤a(chǎn)生的代碼寫(xiě)入Click事件的代碼框架。 Private Sub CommandButton1_Click() With Selection.Interior .ColeorIndex = 3 .Pattern = xlSolid End With End Sub ?。玻贑lick事件的代碼中調(diào)用錄制宏Macro1。 Private Sub CommandButton1_Click() Call Macro1 End Sub 如果錄制宏的代碼需要被多個(gè)不同的過(guò)程引用,或者Click事件中的代碼較多時(shí),方法二使得代碼更具有可讀性,也便于日后的代碼維護(hù)和修改。 步驟5.返回Excel界面,退出編輯模式。 步驟6.在工作表中單擊選中任意單元格,單擊命令按鈕將設(shè)置活動(dòng)單元格的背景色為紅色。 ?。矗福矗病?fù)選框(CheckBox) 復(fù)選框控件用于二元選擇,控件的返回值為T(mén)rue或False。利用復(fù)選框控件的LinkCell屬性還可以在單元格中得到控件的返回值。 示例48.3 使用復(fù)選框控件制作多選調(diào)查問(wèn)卷 步驟1.在工作表中添加一個(gè)復(fù)選框,修改其屬性。 ?。保瓹aption屬性為“Excel基礎(chǔ)應(yīng)用”。 ?。玻甃inkCell屬性為C3。 步驟2.調(diào)整控件位置,使其位于A3單元格內(nèi),退出編輯模式。 步驟3.在B3單元格輸入公式“=IF(C3,“經(jīng)?!?,“偶爾”)”。 步驟4.使用類(lèi)似方法添加另外3個(gè)復(fù)選框控件并修改其屬性。 ?。保瓹heckBox2的Caption屬性值為“Excel VBA程序開(kāi)發(fā)”。 2.CheckBox3的Caption屬性值為“Excel 函數(shù)和公式”。 ?。常瓹heckBox4的Caption屬性值為“Excel 圖表與圖形”。 ?。矗瓹heckBox2的LinkCell屬性值為“C4”。 ?。担瓹heckBox3的LinkCell屬性值為“C5”。 ?。叮瓹heckBox4的LinkCell屬性值為“C6”。 無(wú)需使用VBA代碼也可以實(shí)現(xiàn)二選一的效果。選中復(fù)選框控件時(shí),相應(yīng)行的第2列結(jié)果為“經(jīng)?!?,否則為“偶爾”,用戶(hù)通過(guò)單擊控件可以切換第2列的值。為了便于用戶(hù)理解控件值變化對(duì)最終結(jié)果的影響,將首復(fù)選框控件的值顯示在第3列中。實(shí)際應(yīng)用中,可以設(shè)置該列的字體顏色為白色或隱藏第3列,這樣可以使得用戶(hù)界面更加簡(jiǎn)潔。 ?。矗福矗场∵x項(xiàng)按鈕(OptionButton) 選項(xiàng)按鈕控件同樣用于進(jìn)行二元選擇,控件的返回值為T(mén)rue或False。與復(fù)選框控件的不同之處在于,選項(xiàng)按鈕控件用于單項(xiàng)選擇,在多個(gè)選項(xiàng)按鈕成為一組時(shí),選中其中某個(gè)選項(xiàng)按鈕后,同組的其余選項(xiàng)按鈕的值自動(dòng)設(shè)置為False。而復(fù)選框控件用于多項(xiàng)選擇,單個(gè)復(fù)選框控件是否被選中,并不影響其他的復(fù)選框控件。 示例48.4 使用選項(xiàng)按鈕控件制作單項(xiàng)調(diào)查問(wèn)卷 步驟1.在工作表中添加一個(gè)選項(xiàng)按鈕,修改其Caption屬性為“Excel基礎(chǔ)應(yīng)用”。 步驟2.雙擊控件,在代碼窗口中寫(xiě)入如下的Click事件代碼。 Private Sub OptionButton1_Click() Cells(12,"D").Value = OptionButtonl.Caption End Sub 步驟3.使用類(lèi)似方法添加另外3個(gè)選項(xiàng)按鈕控件并修改其Caption屬性。 1. OptionButton2的Caption屬性值為“Excel VBA程序開(kāi)發(fā)”。 2.CheckBox3的Caption屬性值為“Excel 函數(shù)和公式”。 ?。常瓹heckBox4的Caption屬性值為“Excel 圖表與圖形”。 步驟4.在代碼窗口中添加如下Click事件代碼。 將錄制宏產(chǎn)生的代碼寫(xiě)入Click事件的代碼框架中。 Private Sub CommandButton1_Click() With Selection.Interior .ColorIndes = 3 .Pattern = xlSolik End Sub 在Click事件代碼中調(diào)用錄制的宏Macro1. Private Sub CommandButton1_Click() Call Macro1 End Sub 如果錄制宏的代碼需要被多個(gè)不同的過(guò)程引用,或者Click事件中的代碼較多時(shí),方法二使得代碼更具有可讀性,也便于日后的代碼維護(hù)和修改。 步驟5.返回Excel界面,退出編輯模式。 步驟6.在工作表中單擊選中任意單元格,單擊命令按鈕將設(shè)置活動(dòng)單元格的背景色為紅色。 ?。矗福矗病?fù)選框(CheckBox) 復(fù)選框控件用于二元選擇,控件的返回值為T(mén)rue或False。利用復(fù)選框控件的LinkCell屬性還可以在單元格中得到控件的返回值。 示例48.3 使用復(fù)選框控件制作多選調(diào)查問(wèn)卷 步驟1.在工作表中添加一個(gè)復(fù)選框,修改其屬性。 Caption屬性為“Excel 基礎(chǔ)應(yīng)用”。 LinkCell屬為C3。 步驟2.調(diào)整控件位置,使其位于A3單元格內(nèi),退出編輯模式。 步驟3.在B3單元格輸入公式“=IF(C3,“經(jīng)?!?,“偶爾”)”。 步驟4.使用類(lèi)似方法添加另外3個(gè)復(fù)選框控件并修改其屬性。 ?。保瓹heckBox2的 Caption屬性值為“ Excel VBA程序開(kāi)發(fā)”。 ?。玻瓹heckBox3的 Caption屬性值為“ Excel 函數(shù)和公式”。 ?。常瓹heckBox4的 Caption屬性值為 “Excel 圖表與圖形”。 ?。矗瓹heckBox2的 Caption屬性值為“C4”。 5.CheckBox3的 Caption屬性值為“C5”。 6.CheckBox4的 Caption屬性值為“C6”。 無(wú)需使用VBA代碼也可以實(shí)現(xiàn)二選一的效果。選中復(fù)選框控件時(shí),相應(yīng)行的第2列結(jié)果為“經(jīng)?!?,融為“偶爾”,用戶(hù)通過(guò)單擊控件可以切換第2列的值。為了便于用戶(hù)理解控件值變化對(duì)最終結(jié)果的影響,將復(fù)選框控件的值顯示在第3列中。實(shí)際應(yīng)用中,可以設(shè)置該列的字體顏色為白色或隱藏第3列,這樣可以使得用戶(hù)界面更加簡(jiǎn)潔。 ?。矗福矗场∵x項(xiàng)按鈕(OptionButton) 選項(xiàng)按鈕控件同樣用于進(jìn)行二元選擇,控件的返回值為T(mén)rue或 False。與復(fù)選框控件的不同之處在于,選項(xiàng)按鈕控件用于單項(xiàng)選擇,在多個(gè)選項(xiàng)按鈕成為一組時(shí),選中其中某個(gè)選項(xiàng)按鈕后,同組的其余選項(xiàng)按鈕的值自動(dòng)設(shè)置為 False。而復(fù)選框控件用于多項(xiàng)選擇,單個(gè)復(fù)選框控件是否被選中,并不影響其他的復(fù)選框控件。 示例48.4 使用選項(xiàng)按鈕控件制作單項(xiàng)調(diào)查問(wèn)卷 步驟1.在工作表中添加一個(gè)選項(xiàng)按鈕,修改其Capion屬性為“ Excel 基礎(chǔ)應(yīng)用”。 步驟2.雙擊控件,在代碼窗口中寫(xiě)入如下Click事件代碼。 Private Sub OptionButton1_Click() Cells(12,"D"),Valeu = OptionButton1.Caption End Sub 步驟3.使用類(lèi)似方法添加另外3個(gè)選項(xiàng)按鈕控件并修改其Caption屬性。 ?。保甇ptionButton2的 Caption屬性值為 “Excel VBA程序開(kāi)發(fā)”。 ?。玻甇ptionButton3的 Caption屬性值為“ Excel 函數(shù)和公式”。 ?。常甇ptionButton4的 Caption屬性值為 “Excel 圖表與圖形”。 步驟4.在代碼窗口中添加如下Click事件代碼。 Private Sub OptionButton2_Click() Cells(12,"D").Value = OptionButton2.Caption End Sub Private Sub OptionButton3_Click() Cells(12,"D").Value = OptionButton3.Caption End Sub Private Sub OptionButton4_Click() Cells(12,"D").Value = OptionButton4.Caption End Sub 步驟5.退出編輯模式,在工作表中單擊任意一個(gè)OptionButton控件,在D12單元格中將顯示選擇的結(jié)果。 實(shí)際應(yīng)用中,往往需要在多個(gè)類(lèi)別的項(xiàng)目中實(shí)現(xiàn)多選一功能。以示例48.4為例,如果除了上述4個(gè)選項(xiàng)外,還有另外一組選項(xiàng),最終希望用戶(hù)在每組中選擇一個(gè)項(xiàng)目,這就需要利用屬性對(duì)選項(xiàng)按鈕控件進(jìn)行分組。分組后,改變某個(gè)選項(xiàng)按鈕的值,不影響其他組中的選項(xiàng)按鈕。 步驟6.進(jìn)入編輯模式,依次設(shè)置OptionButton1,OptionButton2,OptionButton3和 OptionButton4控件的GroupaName屬性值為“Excel” 步驟7.添加4個(gè)選項(xiàng)按鈕,設(shè)置其GroupaName屬性值為“NonExcel”,并修改其Caption屬性。 OptionButton5的 Caption屬性值為“會(huì)員廣場(chǎng)”。 OptionButton6的 Caption屬性值為“電腦網(wǎng)絡(luò)”。 OptionButton7的 Caption屬性值為“休閑吧”。 OptionButton8的 Caption屬性值為“MS Office Word”。 步驟8.在代碼窗口中寫(xiě)入如下Click事件代碼。 Private Sub OptionButton5_Click() Cells(13,"D").Value = OptionButton5.Caption End Sub Private Sub OptionButton6_Click() Cells(13,"D").Value = OptionButton6.Caption End Sub Private Sub OptionButton7_Click() Cells(13,"D").Value = OptionButton7.Caption End Sub Private Sub OptionButton8_Click() Cells(13,"D").Value = OptionButton8.Caption End Sub 步驟9.退出設(shè)計(jì)模式。用戶(hù)可以分別選中左右兩組控件中的某個(gè)選項(xiàng)按鈕,選擇的結(jié)果顯示在D12和D13單元格中。 48.4.4 列表框(ListBox)和組合框( ComboBox) 組合框控件與列表框控件非常相似,兩種控件都可以在一組列表中進(jìn)行選擇;二者的區(qū)別在于列表框控件可以選中一個(gè)或多個(gè)條目,而組合框控件只能選中單個(gè)條目。組合框的優(yōu)點(diǎn)在于控件占用面積小,除了可以在預(yù)置選項(xiàng)中進(jìn)行選擇外還可以輸入其他數(shù)據(jù)。 下面介紹組合框控件的幾個(gè)常用屬性。 ?。保甃istFillRange屬性可以指定列表來(lái)自于工作表中的某個(gè)區(qū)域。 ?。玻甃istRows屬性指定下拉過(guò)猶不及顯示的行數(shù)。 ?。常甋tyle屬性指定是否允許輸入列表中不存在的值。 示例48.5 使用組合框控件制作調(diào)查問(wèn)卷 利用組合框控件可以實(shí)現(xiàn)與示例48.4相同的效果。 步驟1.在工作表中插入組合框控件,并修改其屬性如下。 1.設(shè)置ListFillRange屬性值為G1:G4。 2.設(shè)置ListRows屬性值為D14。 3.設(shè)置Style屬性值為“2-fmStyleDropDownList”,即只允許用戶(hù)在列表中選擇項(xiàng)目。 步驟2.在工作表中插入第二個(gè)組合框控件,并修改其屬性如下。 ?。保O(shè)置ListFillRange屬性值為H1:H4。 ?。玻O(shè)置ListRows屬性值為H15。 ?。常O(shè)置Style屬性值為“2-fmStyleDropDownList”,即只允許用戶(hù)在列表中選擇項(xiàng)目。 步驟3.退出設(shè)計(jì)模式,單擊組合框控件,將出現(xiàn)下拉列表,選中某個(gè)項(xiàng)目后將更新D15單元格。 ?。矗福矗怠∥谋究颍═extBox) 文本框控件主要用于接受用戶(hù)的輸入。一般情況下,用戶(hù)會(huì)在工作表的單元格中直接輸入數(shù)據(jù),但當(dāng)單元條處于編輯狀態(tài)時(shí),E xcel應(yīng)用程序則無(wú)法運(yùn)行任何代碼,借助文本框控件,就可以實(shí)現(xiàn)對(duì)用戶(hù)鍵盤(pán)輸入的控制。 示例48.6 快速錄入3數(shù)字 在單元格中錄入數(shù)據(jù)時(shí),需要按<Enter>鍵才能完成輸入。如果需要錄入大量的數(shù)據(jù)時(shí),每個(gè)單元格都按<Enter>鍵將會(huì)影響錄入的效率。假設(shè)錄入的數(shù)據(jù)為3位數(shù)字,依次放置于第一列單元格,借助文本框控件可以實(shí)現(xiàn)快速錄入,并防止意外輸入非數(shù)字字符。 步驟1.在工作表添加文本框控件。 步驟2.雙擊控件,在VBE代碼窗口中寫(xiě)入如下事件代碼。 Private Sub TextBox1_Change() '判斷文本框內(nèi)字符的個(gè)數(shù) In Len(TextBox1.Value) = 3 Then '將文本框的內(nèi)容寫(xiě)入A列第一個(gè)非空單元格 [a65536].End{xlUp}.Offset(1,0) = TextBox1.Value '清空文本框 TextBox1.Text = "" End If End Sub Private Sub TextBox1_KeyPress(ByBal KeyAscii As MSForms.ReturnInteger) '判斷鍵盤(pán)輸入的字符是否為數(shù)字 If KeyAscii <Asc("c") Or KeyAscii > Asc("9") Then '清空鍵盤(pán)輸入 KeyAscii = 0 End If End Sub 步驟3.返回Excel界面,退出編輯模式。 步驟4.單元文本框控件,在文本框中輸入數(shù)字,3個(gè)數(shù)字輸入完成后,自動(dòng)填充到A列的第一個(gè)非空單元格,并清空文本框,此時(shí)可以開(kāi)始錄入下一數(shù)據(jù)。 ?。矗福矗丁∏袚Q按鈕(ToggleButton) 切換按鈕控件也被稱(chēng)作開(kāi)頭按鈕,單擊該擦傷可以在“開(kāi)”和“關(guān)”兩種狀態(tài)之間進(jìn)行切換,其外觀也隨之變化。切換按鈕的返回值為T(mén)rue(按下?tīng)顟B(tài))或 False(彈起狀態(tài))。 48.4.7 數(shù)值調(diào)節(jié)鈕(SpinButton) 數(shù)值調(diào)節(jié)鈕控件可以實(shí)現(xiàn)用戶(hù)單擊控件中的箭頭來(lái)選擇一個(gè)值??丶哂袃蓚€(gè)箭頭,一個(gè)箭頭用于增加值,一個(gè)用于減少值;增加或減少以SamllChange屬性值為步長(zhǎng)。 ?。矗福矗浮×鲃?dòng)條(ScrollBar) 滾動(dòng)條控件與數(shù)值調(diào)節(jié)鈕控件非常類(lèi)似,區(qū)別在于滾動(dòng)條控件可按照兩種不同的步長(zhǎng)(SmallChange屬性值和 LargeChange屬性值)改變控件的值,而且用戶(hù)可以拖放滾動(dòng)條按鈕,大幅度改變控件的值。 單擊控件兩端按鈕以SmallChange屬性值為步長(zhǎng)修改控件的值 單擊控件以L(fǎng)argeChange屬性值為步長(zhǎng)修改控件的值 ?。矗福矗埂?biāo)簽控件(Label) 標(biāo)簽控件主要用于顯示文本信息,除非需要使用標(biāo)簽控件的事件代碼,否則在工作表中完全可以使用文本框自選圖形替代標(biāo)簽控件。 ?。矗福矗保啊D像控件(Image) 圖像控件用于顯示一張圖片。使用圖像控件可能會(huì)使工作簿文件的大小猛增。利用圖像控件的Picture屬性可以選擇需要加載的圖片文件。 第49章 窗體在EXCEL中的應(yīng)用 在VBA代碼中使用InputBox和 MsgBox,可以滿(mǎn)足大多數(shù)交互應(yīng)用的需要,但這些對(duì)話(huà)框并非適合所有的應(yīng)用場(chǎng)景,其明顯的弱點(diǎn)在于缺乏靈活性。例如,除了窗口的顯示位置和幾種預(yù)先定義的按鈕組合外,無(wú)法按照實(shí)際需要添加更多的控件,利用用戶(hù)窗體則可以實(shí)現(xiàn)各種用戶(hù)定制的對(duì)話(huà)框。本章將介紹如何插入窗體、修改窗體屬性、窗體事件的應(yīng)用和在窗體中使用控件。 ?。矗梗薄?chuàng)建自己的第一個(gè)窗體 在示例44.2中,利用了InpuBox框輸入員工號(hào),如果除了員工號(hào)還有很多信息需要錄入,這就需要多次調(diào)用InpuBox逐項(xiàng)輸入。使用用戶(hù)窗體就可以實(shí)現(xiàn)在一個(gè)窗體中輸入某個(gè)員工的全部信息。 ?。矗梗保薄〔迦胗脩?hù)窗體 步驟1.打開(kāi)一個(gè)新的工作簿文件,按<Alt+F11>組合鍵切換到VBE窗口。 步驟2.單擊VBE菜單“插入”——“用戶(hù)窗體”,系統(tǒng)將添加名稱(chēng)為Userform1 用戶(hù)窗體。 步驟3.按<F4>鍵顯示屬性窗口,修改用戶(hù)窗體的Capiton屬性為“員工信息管理系統(tǒng)”。 步驟4.單擊VBE菜單“插入”——“模塊”,在模塊1中寫(xiě)入如下代碼。 Sub ShowFrm() UserForm1.Show End Sub Show方法用于顯示 UserForm對(duì)象。 步驟5.返回Excel界面,運(yùn)行宏 ShowFrm,將顯示用戶(hù)窗體。 步驟6.單擊用戶(hù)窗體右上角的紅色“X”按鈕,可以關(guān)閉窗體。 49.1.2 關(guān)閉窗體 使用如下代碼將關(guān)閉UserForm1窗體,代碼執(zhí)行后UserForm對(duì)象將從內(nèi)存中刪除,此后無(wú)法訪(fǎng)問(wèn)窗體和其中的控件。 Unload UserForm1 ?。矗梗病〈绑w中使用控件 上面設(shè)置中顯示的用戶(hù)窗體只是一個(gè)空白窗體,其中沒(méi)有任何控件,因此也就無(wú)法進(jìn)行用戶(hù)交互。本節(jié)將講解如何在用戶(hù)窗體中使用控件。 ?。矗梗玻薄≡诖绑w中插入控件 示例49.2 在用戶(hù)窗體中插入控件 步驟1.打開(kāi)示例49.1的工作簿,另存為新工作簿,按<Alt+F11>組合鍵切換到VBE窗口。 步驟2.在工程窗口中雙擊UserForm1,對(duì)象窗口中將顯示UserForm對(duì)象。 步驟3.單擊VBE菜單“視圖”——“工具箱”,顯示工具箱窗口。 步驟4.單擊標(biāo)簽控件的按鈕A 步驟5.拽住鼠標(biāo)左鍵,在UserForm1控件上拖動(dòng)至適當(dāng)位置,再釋放鼠標(biāo),將添加一個(gè)標(biāo)簽控件。 步驟6.按<F4>鍵,在屬性窗口中調(diào)整標(biāo)簽控件的屬性值。 AutoSize屬性值為“True”。 Caption屬性值為“員工號(hào)”。 步驟7.使用類(lèi)似的方法添加另外兩個(gè)標(biāo)簽控件,并設(shè)置控件的屬性值。 AutoSize屬性值為“True”。 Label2控件的Captio屬性值為“性別”。 Label3控件的Caption屬性值為“部門(mén)”。 步驟8.在UserForm1控件上右鍵單擊,選擇“全選”,選中全部控件。 步驟9.在選中的控件上右鍵單擊,選擇“對(duì)齊”——“左對(duì)齊”。 步驟10.在用戶(hù)窗體中插入TextBox控件,并調(diào)整其屬性。 MaxLength屬性值為4,即控件中最多可輸入4個(gè)字符。 步驟11.在用戶(hù)窗體中插入兩個(gè)ComboBox控件,并調(diào)整其屬性。 Style屬性值為 "2-fmStyleDropDownList",即用戶(hù)只能在下拉列表中選擇條目,不能輸入新的值。 步驟12.在用戶(hù)窗體中插入兩個(gè)CommandButton控件,并調(diào)整其屬性。 CommandButton1控件Caption屬性設(shè)置為“添加數(shù)據(jù)”。 CommandButton2控件Caption屬性設(shè)置為“退出”。 步驟13.調(diào)整控件的大小及其位置。 步驟14.返回Excel界面,運(yùn)行宏ShowFrm,將顯示用戶(hù)窗體。 步驟15.單擊用戶(hù)窗體右上角的紅色“X”按鈕,可以關(guān)閉窗體。 ?。矗梗玻病≈付丶a 上面設(shè)置的用戶(hù)窗體中,如果單擊“性別”旁邊的下拉箭頭,會(huì)發(fā)現(xiàn)下拉列表是空白的,單擊“添加數(shù)據(jù)”按鈕也沒(méi)有任何反應(yīng),其原因在于尚未添加各控件相關(guān)的事件代碼。下面來(lái)為控件添加事件代碼。 示例49-3 為窗體控件添加事件代碼 步驟1.打開(kāi)示例49-2的工作簿,另存為新工作簿,按<Alr+F11>組合鍵切換到VBE窗口。 步驟2.在工程窗口中UserForm1上右鍵單擊,選擇“查看代碼”。 步驟3.在代碼窗口上部的對(duì)象下拉列表中選擇"TextBox1",在事件下拉列表中選擇"KeyPress",系統(tǒng)將自動(dòng)添加KeyPress事件模塊框架,在其中寫(xiě)入如下代碼,用于防止用戶(hù)意外輸入非數(shù)字字符。 Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) '判斷鍵盤(pán)輸入的字符是否為數(shù)字 If keyAscii <Asc("0") Or KeyAscii > Asc("9") Then '清空鍵盤(pán)輸入 KeyAscii = 0 End If End Sub 步驟4.在代碼窗口上部的對(duì)象下拉列表中選擇“Userform”,在事件下拉列表中選擇"Initialize",系統(tǒng)將自動(dòng)添加Initialize事件模塊框架,在其中寫(xiě)入如下代碼,用于添加ComboBox控件的下拉列表。 Private Sub UserForm_Initialize() With Me.ComboBox1 .AddItem "男" .AddItem "女" End With With Me.ComboBox2 .AddItem "計(jì)劃部" .AddItem "建設(shè)部" .AddItem "網(wǎng)絡(luò)部" .AddItem "財(cái)務(wù)部" End With End Sub 步驟5.在代碼窗口上部的對(duì)象下拉列表中選擇“CommandButton1”,在事件下拉列表中選擇"Click",系統(tǒng)將自動(dòng)添加Click事件模塊框架,在其中寫(xiě)入如下代碼。 Private Sub CommandButton1_Click() Dim iRow As Integer '定位工作表中A列第一個(gè)空白單元格 iRow = [A65536].End(xlUp).Row + 1 '將數(shù)據(jù)寫(xiě)入工作表中 '員工號(hào) Cells(iRow, 1) = Me.TextBox1.Value '性別 Cells(iRow, 2) = Me.ComboBox1.Value '部門(mén) Cells(iRow, 3) = Me.ComboBox2.Value '清空用戶(hù)窗體中輸入的內(nèi)容 Me.TextBox1.Value = "" Me.ComboBox1.Value = "" Me.ComboBox2.Value = "" End Sub 步驟6.在代碼窗口上部的對(duì)象下拉列表中選擇"CommandButton2",在事件下拉列表中選擇"Click",系統(tǒng)將自動(dòng)添加Click事件模塊框架,在其中寫(xiě)入如下代碼。 Private Sub CommandButton2_Click() '卸載窗體 Unload UserForm1 End Sub 步驟7.返回Excel界面,運(yùn)行宏ShowFrm。 步驟8.在用戶(hù)窗體的文本框中輸入員工“7009”,如果按鍵為非數(shù)字鍵,將被忽略,并且文本框中最多只能輸入4個(gè)數(shù)字;單擊“性別”組合框,選擇“男”;單擊“部門(mén)”組合框,選擇“網(wǎng)絡(luò)部”。 步驟9.單擊“添加數(shù)據(jù)”按鈕,新輸入數(shù)據(jù)添加到工作表中,同時(shí)用戶(hù)窗體將清空,用戶(hù)可以開(kāi)始輸入下一組數(shù)據(jù)。 步驟10.單擊“退出”按鈕,關(guān)閉用戶(hù)窗體。 49.3窗體的常用事件 用戶(hù)窗體作為一個(gè)控件的容器,本身也是一個(gè)對(duì)象,因此用戶(hù)窗體同樣支持多種事件。本節(jié)將介紹窗體的幾個(gè)常用事件。 49.3.1 Initialize事件 使用UserForm對(duì)象的Show方法顯示用戶(hù)窗體時(shí)將觸發(fā)Initialize事件,也就是說(shuō)Initialize事件代碼運(yùn)行之后才會(huì)顯示用戶(hù)窗體,因此對(duì)用戶(hù)窗體或窗體中的初始化工作可以在Initialize事件代碼中完成。如示例49.3中用Initialize事件代碼添加ComboBox控件的下拉列表。 49.3.2 QueryClose事件和Terminate事件 QueryClose事件和Terminate事件都是和關(guān)閉窗體相關(guān)的事件。關(guān)閉窗體時(shí)首先激活QueryClose事件,系統(tǒng)將窗體從屏幕上刪除后,在內(nèi)存中制裁窗體之前將激活Terminate事件,也就是說(shuō)Terminate事件代碼中仍然可以訪(fǎng)問(wèn)用戶(hù)窗體及窗體上的控件。 示例49-4 用戶(hù)窗體QueryClose事件和Terminate事件 步驟1.打開(kāi)—個(gè)新的工作簿文件,按<Alt+F11>組合鍵切換到VBE窗口。 步驟2.單擊VBE菜單“插入”——“用戶(hù)窗體”,系統(tǒng)將添加名稱(chēng)Userrorm1的用戶(hù)窗體。 步驟3.在窗體中添加一個(gè)TextBox控件。 步驟4.雙擊窗體,在代碼窗口中寫(xiě)入如下事件代碼。 Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) MsgBox Me.Visible & vbTab & TextBox1.Value, , "QueryClose" End Sub Private Sub UserForm_Terminate() MsgBox Me.Visible & vbTab & TextBox1.Value, , "Terminate" End Sub 步驟5.單擊VBE菜單“插入”——“模塊”,在模塊1中寫(xiě)入如下代碼。 Sub CloseEventDemo() UserForm1.Show End Sub 步驟6.返回Excel界面,運(yùn)行宏CloseEventDemo,在用TextBox控件中輸入"ExcelHome"。 步驟7.單擊用戶(hù)窗體右上角的紅色“X”按鈕,關(guān)閉用戶(hù)窗體,將出現(xiàn)消息框,由消息框的標(biāo)題可以得知QueryClose事件被激活。 步驟8.單擊“確定”,將出現(xiàn)消息框,由消息框的標(biāo)題可以得知Terminate事件被激活,此時(shí)屏幕中已經(jīng)不再顯示用戶(hù)窗體,因此用戶(hù)窗體的Visible屬性值為False,但是代碼可以讀取用戶(hù)窗體中TextBox控件的值。 步驟9.單擊“確定”,將關(guān)閉消息框。
|
|
來(lái)自: 昵稱(chēng)380475 > 《Excel 大全》