在許多程序中,我們經(jīng)常會(huì)看到像圖1所示的代碼片段,即出現(xiàn)了帶方括號(hào)的字符串。
這些方括號(hào)里面的字符串為工作簿中定義的名稱,方括號(hào)的作用就是告訴VBE編譯器將名稱轉(zhuǎn)換成相應(yīng)的單元格或單元格區(qū)域。 其實(shí),這是Evaluate方法的簡寫格式。
根據(jù)VBA幫助文件指出,Evaluate方法將Excel名稱轉(zhuǎn)換為對(duì)象或值。這樣的解釋確實(shí)有點(diǎn)模糊。 其語法為: expression.Evaluate(Name) expression可以省略,即簡寫為: Evaluate(Name) 參數(shù)不只限于名稱,還可以是公式表達(dá)式字符串。 如果參數(shù)中沒有變量,還可以更簡略地寫為: [Name] 使用Evaluate加上帶引號(hào)的參數(shù)的方法的優(yōu)點(diǎn)是,可以在表達(dá)式中使用變量。而使用括號(hào)簡寫的優(yōu)點(diǎn)是,不僅簡短,而且在引用對(duì)象時(shí)會(huì)出現(xiàn)對(duì)象的屬性和方法的智能提示且不會(huì)導(dǎo)致失敗,例如代碼: Evaluate('Sheet2').Activate 運(yùn)行失敗。而代碼: [Sheet2].Activate 成功運(yùn)行,并且在輸入[Sheet2].后會(huì)出現(xiàn)屬性和方法的提示。
其參數(shù)可以是:
下面是VBA幫助中給出的一些示例代碼。 下列表達(dá)式是等價(jià)的: [A1].Value=25 Evaluate(“A1”).Value=25
trigVariable=[SIN(45)] trigVariable=Evaluate[“SIN(45)”]
Set firstCellInSheet =Workbooks('BOOK1.XLS').Sheets(4).[A1] Set firstCellInSheet = Workbooks('BOOK1.XLS').Sheets(4).Evaluate('A1')
下面的代碼演示了在Evaluate方法中使用變量,將工作表Sheet1中單元格A1變?yōu)榇煮w格式: Worksheets('Sheet1').Activate boldCell = 'A1' Application.Evaluate(boldCell).Font.Bold = True
為什么要使用Evaluate方法? 下面是幾個(gè)使用Evaluate方法的優(yōu)點(diǎn): 1. 代碼更簡短 大多數(shù)情形下,Evaluate方法可以使用方括號(hào)的簡寫形式,使代碼更簡短。 下面的代碼在單元格A1中輸入數(shù)值100: [A1].Value = 100 [A1] = 100
2. 可以在VBA中使用更多的工作表函數(shù) 在VBA中,通過WorksheetFunction對(duì)象可以使用很多在VBA中沒有與之等價(jià)的工作表函數(shù),但仍有一些工作表函數(shù)不能在VBA中使用。然而,通過Evaluate方法卻可以在VBA中使用這些函數(shù),或者是工作表數(shù)組公式。 例如,由于VBA有等效的IsEmpty函數(shù)提供了工作表函數(shù)ISBLANK相同的功能,因此不能通過WorksheetFunction對(duì)象使用ISBLANK函數(shù)。但是,如果需要在VBA使用ISBLANK函數(shù),可以使用代碼: Evaluate('=ISBLANK(A1)') [ISBLANK(A1)] 如果工作表單元格A1為空,則返回TRUE,否則返回FALSE。
3. 公式更直觀 使用Evaluate方法比使用Application.WorksheetFunction更簡單且更直觀,其外觀與工作表函數(shù)相同,就像在單元格中編寫的公式一樣。 例如,在工作表中使用VLOOKUP函數(shù): =VLOOKUP(D1,A1:B4,2,FALSE) 通常,在VBA中的等效代碼為: Application.WorksheetFunction.VLookup(Range('D1'),Range('A1:B4'), 2, False) 而如果使用Evaluate方法并忽略“=”號(hào),在工作表中的公式可以直接復(fù)制到代碼中: Evaluate('VLOOKUP(D1,A1:B4,2,FALSE)') 或者: [VLOOKUP(D1,A1:B4,2,FALSE)]
4. 代碼更有效率 下面的代碼將101至200的數(shù)值輸入到單元格區(qū)域A1:A100: [A1:A100] = [ROW(101:200)] 下面的代碼將101至200的數(shù)值賦給一個(gè)Variant數(shù)組: varArray = [ROW(101:200)] 它們都比使用循環(huán)更有效率。
5. 調(diào)用在運(yùn)行時(shí)才創(chuàng)建的子過程 如果想要調(diào)用在運(yùn)行時(shí)才創(chuàng)建子過程,由于這個(gè)子過程在編譯時(shí)不存在,因此會(huì)導(dǎo)致編譯時(shí)錯(cuò)誤。雖然Run(“子過程名”)不會(huì)導(dǎo)致編譯時(shí)錯(cuò)誤,但如果在運(yùn)行時(shí)代碼還不存在,就會(huì)產(chǎn)生運(yùn)行時(shí)錯(cuò)誤。 而[子過程名]不會(huì)導(dǎo)致編譯時(shí)或者運(yùn)行時(shí)錯(cuò)誤。 因此,如果僅當(dāng)滿足某種條件時(shí)才創(chuàng)建某子過程的情形下,并且另一子過程使用的值要從調(diào)用該子過程中獲取。如果該子過程存在則調(diào)用它,如果不存在則繼續(xù)運(yùn)行,此時(shí),Evaluate方法是調(diào)用該子過程的唯一選擇。
Evaluate方法的使用 正如已經(jīng)講述的內(nèi)容,Evaluate方法主要用于兩種情形。 情形1:Evaluate( 公式 ) 評(píng)估公式表達(dá)式或者值,并轉(zhuǎn)換為值。 實(shí)際上,Evaluate方法在用于計(jì)算時(shí),允許創(chuàng)建“虛擬單元格”,作為VBA代碼與工作表公式之間的接口。這些虛擬單元格允許VBA訪問和直接處理當(dāng)前工作簿中每個(gè)工作表函數(shù),因此提供了一種允許僅用一兩行VBA代碼就替換成千行公式的方法。 情形2:Evaluate( 對(duì)象名 ) 將代表對(duì)象的對(duì)象名轉(zhuǎn)換為對(duì)象。
下面是Evaluate方法的一些基本應(yīng)用示例。 示例1:從關(guān)閉的工作簿中取值 下面的代碼從當(dāng)前工作簿所在文件夾的工作簿test.xlsx中獲取值。 Sub GetValueFromClosedWB() With [Sheet2!A1:A5] .Value = '='' &ActiveWorkbook.Path & '\[test.xlsx]Sheet1'!A1:A5' .Value = .Value '移除對(duì)原工作簿的鏈接 End With End Sub
示例2:提取名稱中的值 下面的代碼首先創(chuàng)建一個(gè)名為“我的公眾號(hào)”的名稱,其內(nèi)容為“完美Excel”,然后在當(dāng)前工作表的單元格A1中輸入值,最后使用Evaluate方法將A1中的值和名稱的內(nèi)容連接并顯示。 Sub GetNameValue() ThisWorkbook.Names.Add '我的公眾號(hào)','完美Excel' Range('A1').Value = '我的公眾號(hào)是' MsgBox Evaluate('A1 & 我的公眾號(hào)') End Sub 或者將最后一行代碼替換為簡寫形式: MsgBox [A1 & 我的公眾號(hào)] 運(yùn)行后的結(jié)果如圖2。
示例3:調(diào)用函數(shù)過程并從中獲取值 下面的代碼演示了調(diào)用子函數(shù)過程,并將返回的值加上100。 Sub CallFunc() MsgBoxEvaluate('testFunc(100) 100') MsgBox [testFunc(100) 100] End Sub
Function testFunc(i As Long) testFunc = i 10 End Function 運(yùn)行后的效果如下圖3。
示例4:使用變量 下面的簡單示例演示了在Evaluate方法中使用變量的基本方法。 下面的代碼顯示當(dāng)前工作表單元格B1至B10中的值。 Sub testGetVarValue() Dim i As Long For i = 1 To 10 MsgBox Evaluate('B' & i) Next i End Sub
下面的代碼在當(dāng)前工作表單元格A1至A10中的值。 Sub testEnterValue() Dim rng As Range, i As Long For i = 1 To 10 Set rng = Range('A' & i) [rng] = '完美Excel'& i Next End Sub 示例5:引用圖表和工作表對(duì)象 下面的代碼設(shè)置當(dāng)前工作表單元格背景色及圖表格式。 Sub testObject() [圖表 1].Activate With ActiveChart.ChartArea .Interior.Color = vbRed .Border.Color = vbYellow End With [Sheet6].Cells.Interior.Color = vbBlue End Sub 運(yùn)行后的效果如圖4。
下面的代碼依次激活當(dāng)前工作簿中的工作表。 Sub testObject1() Dim ws As Worksheet, i As Long
For i = 1 To Worksheets.Count Set ws = Worksheets('Sheet'& i) [ws].Activate Next i End Sub
示例6:數(shù)組 下面的代碼在虛擬單元格中創(chuàng)建數(shù)組,然后將其輸入到工作表單元格中。 Sub EvaluateArray() Dim Array_1D, Array_2D With Worksheets('Sheet8') Array_1D =[{'A','B','C','D','E'}] .[A1].Resize(1, UBound(Array_1D, 1)) =Array_1D Array_2D = [{1,2;3,4;5,6}] .[A3].Resize(UBound(Array_2D, 1),UBound(Array_2D, 2)) = Array_2D End With End Sub 運(yùn)行代碼后的結(jié)果如圖5。
示例7:統(tǒng)計(jì)單元格數(shù)據(jù)的數(shù)量 下面的程序統(tǒng)計(jì)列A中,某單元格的值在其上面的單元格中出現(xiàn)的次數(shù)。 Sub CountCellNum() Dim i As Long For i = 2 To [COUNTA(A:A)] Evaluate('B' & i) =Evaluate('COUNTIF(A1:A' & (i - 1) & ',A' & i& ')') Next i End Sub 運(yùn)行后的結(jié)果如圖6。
小結(jié) Evaluate是一個(gè)強(qiáng)大的命令,然而它往往并不為人所知。 Evaluate基本上可以表示:做任何所需要執(zhí)行的計(jì)算,如果要匯總數(shù)據(jù),那么就匯總;如果要運(yùn)行另一個(gè)程序,那么就運(yùn)行另一個(gè)程序;如果要做…那么就做…,總之,無論需要什么,立即完成。 然而,Evaluate沒有很多介紹文檔,也會(huì)在許多程序中看到它的使用。但基本上是,雖然知道它能做什么但并沒有真正看到它的好處,而只是看到了它表面上的一些,它的強(qiáng)大功能還需要深入挖掘。 本文為原創(chuàng)文章,轉(zhuǎn)載請(qǐng)聯(lián)系我(xhdsxfjy@163.com)或者注明出處。 歡迎在下面留言,完善本文內(nèi)容,讓更多的人學(xué)到更完美的知識(shí)。 |
|