使用VBA,你可以創(chuàng)建工程控制Excel的許多東西,你同樣也可以控制很多其它的應(yīng)用程序。VB的偉大來自于它的控制和管理各種各樣的對(duì)象的能力。但是,“對(duì)象”是什么呢?“對(duì)象”是你通過VBA控制的東西。工作簿,工作表,工作表里的單元格區(qū)域,圖表或者工具條,這些只是一些用Excel時(shí)想要控制的東西的舉例。這些東西就是對(duì)象。Excel含有超出一百種你可以通過不同方式操作的對(duì)象。
所有的VB對(duì)象都被分層歸類。一些對(duì)象本身又可能含有其它的對(duì)象,例如,Excel時(shí)一個(gè)應(yīng)用對(duì)象,這個(gè)應(yīng)用對(duì)象包含其它對(duì)象,例如工作簿或者命令條。工作簿對(duì)象可能包含其它對(duì)象,如工作表或者圖表。你將在本章種學(xué)習(xí)如何控制以下Excel對(duì)象:區(qū)域,窗口,工作表,工作簿和應(yīng)用。我將“區(qū)域”列在了第一位置,有一個(gè)非常重要的原因,如果你不知道如何操作單元格區(qū)域的話,你基本上不能用電子表格來做什么。
某些對(duì)象看上去相似。如果你打開一個(gè)新工作簿,檢查它的工作表,你不會(huì)發(fā)現(xiàn)什么不同。一組相似的對(duì)象被稱為“集合”。例如,工作表的集合包含所有具體工作簿中的工作表;命令條的集合包含所有的工具條和菜單。集合同樣是對(duì)象。Excel中使用得最頻繁的集合是表(Sheets)集合,它代表所有的工作表和圖表,還有工作簿集合,工作表集合以及窗口集合。當(dāng)你使用集合時(shí),相同的動(dòng)作可以在這個(gè)集合中所有的對(duì)象上執(zhí)行。
每一種對(duì)象都有一些特征供你描述。在VB里,這些對(duì)象的特征被稱為“屬性”。例如,工作簿對(duì)象有名稱屬性;區(qū)域?qū)ο笥辛校煮w,公式,名稱,行,樣式和值等屬性。這些對(duì)象屬性是可以設(shè)置的。你通過設(shè)置對(duì)象的屬性控制對(duì)象的外觀和位置。對(duì)象屬性一次只能設(shè)置為一個(gè)特定的值。例如,當(dāng)前工作簿不可能同時(shí)有兩個(gè)不同的名稱。VB中最難理解的部分是有些屬性同時(shí)又可以是對(duì)象。想想?yún)^(qū)域(Range)對(duì)象,你可以通過設(shè)置字體顏色來改變選定單元格的外觀。但是,字體(Font)可以有不同的名稱(Times New Roman, Arial, …),不同的字號(hào)(10,12,14,…)和不同的樣式(粗體,斜體,下劃線,…)。這些是字體的屬性。如果字體有屬性,那么字體也是對(duì)象。
屬性真是了不起,讓你改變對(duì)象的外觀,但是,如何控制這些操作呢?你在使Excel為你執(zhí)行任務(wù)之前,你需要知道另外一個(gè)術(shù)語。對(duì)象有方法。每一種你想要對(duì)象做的操作都被稱為“方法”。最重要的VB方法是Add方法。你可以使用這個(gè)方法添加一個(gè)新工作簿或者工作表。
對(duì)象可以使用不同的方法。例如,區(qū)域(Range)對(duì)象有專門的方法讓你清除單元格內(nèi)容(ClearContents方法), 清除格式(ClearFormats方法)以及同時(shí)清除內(nèi)容和格式(Clear方法)。還有讓你選擇,復(fù)制或移動(dòng)對(duì)象的方法。方法有可選擇的參數(shù)確定方法執(zhí)行的具體方式。例如,工作簿(Workbook)對(duì)象有一個(gè)叫關(guān)閉(Close)的方法。你可以使用它關(guān)閉任何打開了的工作簿。如果工作簿有改動(dòng),Excel會(huì)彈出一個(gè)信息,問你是否要保存變化。你可以使用關(guān)閉方法和設(shè)定它的保存變化(SaveChanges)參數(shù)為假(False)來關(guān)閉這個(gè)工作簿并且不管它的任何變化。正如例子:
Workbooks("Chap01.XLS").Close SaveChanges:=False
學(xué)習(xí)對(duì)象,屬性和方法
當(dāng)你學(xué)習(xí)新的事物時(shí),理論會(huì)給你必須的背景,但是,你如何真正知道那是什么呢?大多數(shù)人習(xí)慣形象思維,為了使Excel對(duì)象易于理解,VB在線幫助提供了一個(gè)對(duì)象模型,請(qǐng)看接下來的附圖。注意,Application對(duì)象位于樹型圖的最上端,它實(shí)際上代表Excel本身。其它對(duì)象在較低的層次。
假設(shè)你想要控制Range對(duì)象,在你能夠控制任何Excel對(duì)象之前,你必須對(duì)它創(chuàng)建引用。為了獲得下圖中的Range對(duì)象,只要遵照下面幾行代碼。每次看到樹型圖中的線指向不同的層時(shí),你只要巧妙地將線換成一個(gè)逗點(diǎn)運(yùn)算符(停頓,英文狀態(tài)下的句號(hào))。這樣,最終你會(huì)以下面的方式到達(dá)Range對(duì)象:
Application.Workbook.Worksheet.Range
你可以使用Excel對(duì)象樹型圖來尋找到其它對(duì)象的路徑,例如窗口(Window),批注(Comment),自動(dòng)篩選(AutoFilter)或者繪圖區(qū)(ChartArea)。分析對(duì)象模型是一個(gè)學(xué)習(xí)Excel對(duì)象的非常好的方法。你花在這里的時(shí)間,以后你開始編寫VBA過程的時(shí)候,會(huì)給你加倍的回報(bào)。通常,你需要明確你引用的對(duì)象的名稱。
現(xiàn)在,我們來點(diǎn)更具體的。假設(shè)你要清除單元格A4里的內(nèi)容。手動(dòng)做這個(gè)時(shí),只要選擇單元格A4然后按下鍵盤上的Delete鍵就可以了。用VB做同樣的操作,你首先需要知道如何使Excel選中了正確的單元格。單元格A4和其它的工作表單元格一樣,是Range對(duì)象。VB沒有Delete方法來清除單元格內(nèi)容,取而代之的是ClearContents方法,例如:
Range("A4").ClearContents
注意在對(duì)象名稱和方法之間的逗點(diǎn)運(yùn)算符。這個(gè)指令去除單元格A4里的內(nèi)容。然而,如何使Excel清除工作簿Chap02.xls第一個(gè)工作表里單元格A4的內(nèi)容呢?我們?nèi)匀患僭O(shè)打開了好幾個(gè)工作簿。
圖2-4 Excel對(duì)象樹型圖
如果你不希望最后在錯(cuò)誤的工作簿或工作表里刪除了A4里的內(nèi)容,那么你必須寫下詳細(xì)的指令,這樣VB就知道在哪里找這個(gè)單元格:
Application.Workbooks("Chap02.xls").Worksheets("Sheet1") .Range("A4").ClearContents
上面的指令應(yīng)該寫成一行,并且應(yīng)該從右到左閱讀:清除單元格A4里的內(nèi)容,這個(gè)單元格在一個(gè)叫“Sheet1”的工作表里,而這個(gè)工作表又在一個(gè)叫“Chap02.xls”的工作簿里面,工作簿“Chap02.xls”又應(yīng)該是Excel應(yīng)用程序的一部分。注意,集合名稱的后面帶有一個(gè)字母“s”:Workbooks和Worksheets。所有引用的工作簿,工作表或單元格名稱都必須用引號(hào)(英文狀態(tài)的引號(hào))包括起來。
如何找到Excel對(duì)象樹型圖?選擇Excel界面上的“幫助”- “Excel幫助”-“編程信息”-“微軟ExcelVB參考”-“Excel對(duì)象模型”。(2002版有全局的對(duì)象模型,2003版好像沒有這個(gè)。)除了Excel對(duì)象,你還可以使用Office,F(xiàn)orms和DAO,ADO對(duì)象模型。屬于這些數(shù)據(jù)庫(kù)(library)中的對(duì)象都可以用在Excel中,也可以用在Office家族中的其它應(yīng)用軟件中。
圖2-6 Excel對(duì)象(Worksheet)
Excel在線幫助列出了Excel對(duì)象模型從早期版本以來的變化。許多對(duì)象,屬性和方法都已經(jīng)被更新
的,改進(jìn)的特色所代替了。為了提供兼容性,被取代的對(duì)象已經(jīng)被隱藏起來了(譯者:它們?nèi)匀皇?br>可用的)。打開VB編輯器窗口上的在線幫助,隱藏的對(duì)象同樣可以在對(duì)象瀏覽器里找到。如果你在
對(duì)象瀏覽器窗口上單擊右鍵,你可以選擇顯示隱藏成員的選項(xiàng)。你將在以后的章節(jié)中學(xué)習(xí)如何使用
對(duì)象瀏覽器。
句法和文法
既然現(xiàn)在你已經(jīng)知道了VBA的一些基本組成要素(對(duì)象,屬性和方法),是時(shí)間開始使用它們了。但是,你怎么將對(duì)象,屬性和方法連接成正確的語言結(jié)構(gòu)呢?每種語言都有語法規(guī)則,人們必須遵循語法以確保他們被理解了。無論你說的是英語,西班牙語,法語還是其它語言,你在讀,寫的時(shí)候都必須遵從一定的規(guī)則。在編程中,我們使用“句法”(syntax)這個(gè)術(shù)語來更確切地明確它的語言規(guī)則。你可以在在線幫助或者在對(duì)象瀏覽器窗口查找每個(gè)對(duì)象,屬性或方法的句法。下面列出一些你必須的VB常用規(guī)則:
規(guī)則1:引用對(duì)象的屬性
如果這個(gè)屬性沒有自變量,使用下面的句法:
Object.Property
對(duì)象是一個(gè)占位符,是你放置你想要進(jìn)入的實(shí)際對(duì)象名稱的地方。屬性同樣也是一個(gè)占位符,你可以在這里放置該對(duì)象的特點(diǎn)。例如:指向工作表中單元格A4中輸入的值,見下述指令:
Range("A4").Value
注意對(duì)象名稱和屬性之間的句號(hào)。當(dāng)你需要進(jìn)入一個(gè)存在于多個(gè)其它對(duì)象里的對(duì)象的屬性時(shí),你必須按順序地寫上所有對(duì)象的名稱,并且用 句號(hào)運(yùn)算符分開。例如:
ActiveSheet.Shapes(2).Line.Weight
這個(gè)例子指向當(dāng)前工作表里圖形(Shapes)集合里的第二個(gè)對(duì)象里的直線(Line)對(duì)象的粗細(xì)(Weight)屬性。
有些屬性要求一個(gè)或多個(gè)自變量。例如,使用偏移(Offset)屬性,你可以選擇一個(gè)和當(dāng)前單元格相對(duì)位置的單元格。Offset屬性需要兩個(gè)自變量,第一個(gè)自變量為行號(hào)(rowOffset)第二個(gè)是列號(hào)(columnOffset)。
對(duì)象 屬性 自變量
ActiveCell.Offset(3, 2)
在上面的例子中,假設(shè)當(dāng)前單元格是A1,Offset(3, 2)將會(huì)指向往下3行和往右兩列的單元格,也就是單元格C4。因?yàn)?,在括?hào)內(nèi)的自變量總是很難理解,通常操作是將它們的名稱也列上,見下例:
ActiveCell.Offset(rowOffset:=3, columnOffset:=2)
注意,自變量名稱后面總是跟著一個(gè)冒號(hào)和一個(gè)等于號(hào)(:=)。如果你使用帶名稱的自變量,你可以任意順序地列出它們,上面的指令也可以寫成這樣:
ActiveCell.Offset(columnOffset:=2, rowOffset:=3)
改后的指令沒有改變意思,你仍然指向單元格C4。然而,如果你改變ActiveCell.Offset(3, 2)中自變量的次序,結(jié)果你會(huì)指向D3,而不是C4。
規(guī)則2:改變對(duì)象的屬性
Object.Property = Value
Value是一個(gè)新的你要賦給該對(duì)象屬性的值。這個(gè)值可以是:一個(gè)數(shù)字
Range("A4").Value = 25
上面的指令在當(dāng)前工作表的單元格A4里輸入數(shù)字25在引號(hào)里的文本
ActiveCell.Font.Name = "Times New Roman"
上面的指令將當(dāng)前單元格字體改為Times New Roman
邏輯值(True或False)
ActiveCell.Font.Bold = True
上面的指令設(shè)置當(dāng)前單元格的字體為粗體。
?
規(guī)則3:返回對(duì)象屬性的當(dāng)前值
Variable = Object.Property
Variable(變量)是VB將要儲(chǔ)存屬性設(shè)置的地方的名稱。
變量 對(duì)象 屬性
CellValue = Range(“A4”).Value
上面的指令將當(dāng)前A4單元格里的值保存到變量CellValue。
?
規(guī)則4:指向?qū)ο蟮姆椒?br>
如果該方法沒有自變量,那么句法應(yīng)該是:
Object.Method
對(duì)象是一個(gè)占位符,是你放置你想要進(jìn)入的實(shí)際對(duì)象名稱的地方。方法同樣也是一個(gè)占位符,你可以在這里放置要對(duì)該對(duì)象的進(jìn)行的操作的名稱。例如,可以使用下述指令來清除單元格A4的格式(應(yīng)該是內(nèi)容):
對(duì)象 方法
Range("A4").ClearContents
如果該方法可以使用自變量來限制,那么句法為:
Object.Method (argument1, argument2, … argumentN)
例如,使用GoTo方法,你可以快速地選擇工作表里的任何區(qū)域。GoTo方法的句法為:
Object.GoTo(Reference, Scroll) ‘對(duì)象.GoTo(參照, 窗口滾動(dòng))
Reference自變量是目標(biāo)單元格或者區(qū)域,Scroll自變量可以設(shè)定為真(True)讓Excel窗口滾動(dòng)到該目標(biāo)地址出現(xiàn)在窗口的左上角;或者設(shè)定為假(False),窗口不滾動(dòng)(系統(tǒng)默認(rèn)為False)。
例如,下面的VBA語句選擇工作表Sheet1里的單元格P100,并且窗口滾動(dòng):
Application.GoTo _
Reference:=Worksheets("Sheet1").Range("P100"), _
Scroll:=True
上面的指令沒有固定在一行,使用了一條特殊的線(下劃線)將它分為幾段。
更多建議: