日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Excel揭秘8:看看方括號(hào)在VBA中的妙處——有用的Evaluate方法

 L羅樂 2017-09-22

 

在《Excel VBA解讀77:Evaluate方法》中,我們簡單介紹了該方法的語法及使用。在本文中,我們將詳細(xì)剖析這個(gè)方法。


在許多程序中,我們經(jīng)常會(huì)看到像圖1所示的代碼片段,即出現(xiàn)了帶方括號(hào)的字符串。

 1

這些方括號(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ù)可以是:

  • A1樣式引用??梢允褂?/span>A1樣式引用中對(duì)單個(gè)單元格的任何引用,所有引用都應(yīng)該是絕對(duì)引用。

  • 單元格區(qū)域??梢允褂靡脝卧竦膮^(qū)域、交叉和聯(lián)合操作符(分別是冒號(hào)、空格和逗號(hào))。

  • 定義的名稱??梢栽诤暾Z言中指定任意名稱。

  • 外部引用??梢允褂?!操作符指向其他工作簿中的單元格或者名稱。

  • 圖表對(duì)象??梢灾付ㄈ我鈭D表對(duì)象名稱。

  • 公式表達(dá)式。代表任何有效的公式表達(dá)式的字符串。

 

下面是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)]
因此,對(duì)于很復(fù)雜的公式來說,使用Evaluate方法將其轉(zhuǎn)換到VBA代碼中將更方便,否則要修改為符合VBA語法的形式就需要大量的工作。

 

4. 代碼更有效率

下面的代碼將101200的數(shù)值輸入到單元格區(qū)域A1:A100

[A1:A100] = [ROW(101:200)]

下面的代碼將101200的數(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。

 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

 3

 

示例4:使用變量

下面的簡單示例演示了在Evaluate方法中使用變量的基本方法。

下面的代碼顯示當(dāng)前工作表單元格B1B10中的值。

Sub testGetVarValue()

    Dim i As Long

    For i = 1 To 10

        MsgBox Evaluate('B' & i)

    Next i

End Sub

 

下面的代碼在當(dāng)前工作表單元格A1A10中的值。

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。

 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。

 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。

 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í)。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多