VBA聲明和使用對(duì)象變量

2021-12-08 14:26 更新

你已經(jīng)學(xué)習(xí)的變量是用于儲(chǔ)存數(shù)據(jù)的,儲(chǔ)存數(shù)據(jù)是你使用“普通的”變量的主要原因。除了儲(chǔ)存數(shù)據(jù)從普通變量之外,還有引用VB對(duì)象的特殊變量,這些變量稱為對(duì)象變量。你在前面的章節(jié)中已經(jīng)學(xué)習(xí)了多種對(duì)象,現(xiàn)在,你開始學(xué)習(xí)如何用對(duì)象變量來代表對(duì)象。對(duì)象變量不儲(chǔ)存數(shù)據(jù),它們告訴數(shù)據(jù)在哪兒。例如,你可以用對(duì)象變量告訴VB數(shù)據(jù)在當(dāng)前工作表的單元格E10,對(duì)象變量使定位數(shù)據(jù)更容易。編寫VB程序時(shí),你經(jīng)常需要寫一些很長(zhǎng)的指令,例如:


Worksheets("Sheet1").Range(Cells(1,1), Cells(10, 5).Select


你可以聲明一個(gè)對(duì)象變量來告訴VB數(shù)據(jù)在哪兒,而不必使用很長(zhǎng)的指令來指向該對(duì)象。對(duì)象變量的聲明和你已經(jīng)學(xué)習(xí)的變量聲明類似,唯一的不同是在關(guān)鍵字As后面,你輸入詞語Object作為數(shù)據(jù)類型,例如:


Dim myRange As Object


上面的語句聲明了一個(gè)叫做myRange的對(duì)象變量。然而,實(shí)際上只聲明對(duì)象變量是不夠的,在使用這個(gè)變量于程序里之前,你還給這個(gè)對(duì)象變量賦上確定的值。使用關(guān)鍵字Set來給對(duì)象變量賦值,關(guān)鍵字Set后面是等號(hào),再后面是該變量指向的值,例如:


Set myRange = Worksheets("Sheet1").Range(Cells(1,1), Cells(10, 5))


上面的語句給對(duì)象變量myRange賦值,這個(gè)值指向工作表Sheet1的單元格區(qū)域A1:E10。如果你忽略了關(guān)鍵字Set,VB將會(huì)顯示一個(gè)錯(cuò)誤信息——“運(yùn)行時(shí)間錯(cuò)誤91:對(duì)象變量或With塊變量未設(shè)置”?,F(xiàn)在,又是來看看實(shí)例的時(shí)候了,下面的過程UseObjVariable示范一個(gè)叫myRange的對(duì)象變量的使用:


Sub UseObjVariable()


             Dim myRange As Object


             

Set myRange = Worksheets("Sheet1"). _


                          

Range(Cells(1, 1), Cells(10, 5))


             

myRange.BorderAround Weight:=xlMedium


             

With myRange.Interior


                          .ColorIndex = 6


                          .Pattern = xlSolid


             

End With


             

Set myRange = Worksheets("Sheet1"). _


                           Range(Cells(12, 5), Cells(12, 10))


             

myRange.Value = 54


             

Debug.Print IsObject(myRange)


End Sub


我們來逐行分析一下過程UseObjVariable里的代碼。過程開始的時(shí)候是對(duì)象變量myRange的聲明,下一行將對(duì)象變量設(shè)置未Sheet1的區(qū)域A1:E10。從現(xiàn)在開始,你每次要引用這個(gè)區(qū)域時(shí),你不需要寫下整個(gè)地址,而只要使用這個(gè)捷徑——該對(duì)象變量名稱就可以了。這個(gè)過程的目的是在區(qū)域A1:E10外圍設(shè)置邊框,你不必使用下面這樣冗長(zhǎng)的指令:


Worksheets("Sheet1").Range(Cells(1, 1), _


              Cells(10, 5)).BorderAround Weight:=xlMedium



而可以使用一個(gè)捷徑,使用對(duì)象變量名稱:


myRange.BorderAround Weight:=xlMedium


下一節(jié)語句是將選區(qū)A1:E10設(shè)置底色。同樣,你不需要使用你要操作的對(duì)象的冗長(zhǎng)地址,你可以使用簡(jiǎn)單的對(duì)象變量名稱myRange。下一句代碼是給對(duì)象變量myRange分配一個(gè)新的引用區(qū)域,VB將忘記老的引用,你下次使用myRange時(shí),它會(huì)引用另一個(gè)區(qū)域E12:J12。在新區(qū)域(E12:J12)輸入了54后,過程給你顯示如何確定某個(gè)變量時(shí)對(duì)象類型。如果myRange是對(duì)象變量的話,指令Debug.Print IsObject(myRange)將在立即窗口里面輸入True。IsObject是個(gè)VBA中指明某變量是否是對(duì)象變量的函數(shù)。


技巧:使用對(duì)象變量的好處


1、它們可以代替真實(shí)對(duì)象使用


?  

2、它們比真實(shí)對(duì)象更短更容易記住

?  

3、當(dāng)過程運(yùn)行時(shí),你可以改變它們的意義


使用明確的對(duì)象變量

對(duì)象變量可以引用任意一種對(duì)象,因?yàn)閂B有很多種對(duì)象,所以,要讓你的程序可讀性更強(qiáng),運(yùn)行更快,最好創(chuàng)建引用到具體對(duì)象類型的對(duì)象變量。例如,在過程UseObjVariable中,你可以將myRange對(duì)象變量聲明為Range對(duì)象,而不是通常的對(duì)象變量(Object):


Dim myRange As Range


如果你要引用一個(gè)具體的工作表,你可以聲明Worksheet對(duì)象:


Dim mySheet As Worksheet
Set mySheet = Worksheets("Marketing")


當(dāng)對(duì)象變量不再需要時(shí),你可以給它賦值Nothing,這將釋放內(nèi)存和系統(tǒng)資源:


Set mySheet = Nothing


查找變量定義

當(dāng)你在VBA過程里看到一行給變量賦值的指令時(shí),你可以通過選擇該變量名稱并且按下Shift+F2,快速地定位到該變量的定義(聲明)?;蛘?,你也可以選擇“視圖”-“定義”,VB將跳到變量的聲明行。要回到剛才的位置,只要按下Ctrl+Shift+F2或選擇“視圖”-“最后位置”。我們來試試:


1.  定位到過程CostOfPurchase的代碼里
2.  定位到語句purchCost = CSng(newPurchase)
3.  在變量名稱上單擊右鍵,并在快捷菜單上選擇“定義”
4.  通過按Ctrl+Shift+F2返回剛才位置
5.  試試在其它過程的其它變量上查找定義,每次使用不同的方法跳到聲明位置。


技巧:這個(gè)變量是什么類型?

你可以使用一個(gè)VB內(nèi)置函數(shù)來查明變量的類型。參見第四章中使用函數(shù)VarType的例子。





以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)