电竞比分网-中国电竞赛事及体育赛事平台

分享

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

 L羅樂 2017-09-22

 

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


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

 1

這些方括號里面的字符串為工作簿中定義的名稱,方括號的作用就是告訴VBE編譯器將名稱轉換成相應的單元格或單元格區(qū)域。

其實,這是Evaluate方法的簡寫格式。

 

根據(jù)VBA幫助文件指出,Evaluate方法將Excel名稱轉換為對象或值。這樣的解釋確實有點模糊。

其語法為:

expression.Evaluate(Name)

expression可以省略,即簡寫為:

Evaluate(Name)

參數(shù)不只限于名稱,還可以是公式表達式字符串。

如果參數(shù)中沒有變量,還可以更簡略地寫為:

[Name]

使用Evaluate加上帶引號的參數(shù)的方法的優(yōu)點是,可以在表達式中使用變量。而使用括號簡寫的優(yōu)點是,不僅簡短,而且在引用對象時會出現(xiàn)對象的屬性和方法的智能提示且不會導致失敗,例如代碼:

Evaluate('Sheet2').Activate

運行失敗。而代碼:

[Sheet2].Activate

成功運行,并且在輸入[Sheet2].后會出現(xiàn)屬性和方法的提示。

 

其參數(shù)可以是:

  • A1樣式引用??梢允褂?/span>A1樣式引用中對單個單元格的任何引用,所有引用都應該是絕對引用。

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

  • 定義的名稱。可以在宏語言中指定任意名稱。

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

  • 圖表對象。可以指定任意圖表對象名稱。

  • 公式表達式。代表任何有效的公式表達式的字符串。

 

下面是VBA幫助中給出的一些示例代碼。

下列表達式是等價的:

[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方法?

下面是幾個使用Evaluate方法的優(yōu)點:

1. 代碼更簡短

大多數(shù)情形下,Evaluate方法可以使用方括號的簡寫形式,使代碼更簡短。

下面的代碼在單元格A1中輸入數(shù)值100

[A1].Value = 100

[A1] = 100

 

2. 可以在VBA中使用更多的工作表函數(shù)

VBA中,通過WorksheetFunction對象可以使用很多在VBA中沒有與之等價的工作表函數(shù),但仍有一些工作表函數(shù)不能在VBA中使用。然而,通過Evaluate方法卻可以在VBA中使用這些函數(shù),或者是工作表數(shù)組公式。

例如,由于VBA有等效的IsEmpty函數(shù)提供了工作表函數(shù)ISBLANK相同的功能,因此不能通過WorksheetFunction對象使用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方法并忽略“=”號,在工作表中的公式可以直接復制到代碼中:

Evaluate('VLOOKUP(D1,A1:B4,2,FALSE)')

或者:

[VLOOKUP(D1,A1:B4,2,FALSE)]
因此,對于很復雜的公式來說,使用Evaluate方法將其轉換到VBA代碼中將更方便,否則要修改為符合VBA語法的形式就需要大量的工作。

 

4. 代碼更有效率

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

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

下面的代碼將101200的數(shù)值賦給一個Variant數(shù)組:

varArray = [ROW(101:200)]

它們都比使用循環(huán)更有效率。

 

5. 調(diào)用在運行時才創(chuàng)建的子過程

如果想要調(diào)用在運行時才創(chuàng)建子過程,由于這個子過程在編譯時不存在,因此會導致編譯時錯誤。雖然Run(“子過程名”)不會導致編譯時錯誤,但如果在運行時代碼還不存在,就會產(chǎn)生運行時錯誤。

[子過程名]不會導致編譯時或者運行時錯誤。

因此,如果僅當滿足某種條件時才創(chuàng)建某子過程的情形下,并且另一子過程使用的值要從調(diào)用該子過程中獲取。如果該子過程存在則調(diào)用它,如果不存在則繼續(xù)運行,此時,Evaluate方法是調(diào)用該子過程的唯一選擇。

 

Evaluate方法的使用

正如已經(jīng)講述的內(nèi)容,Evaluate方法主要用于兩種情形。

情形1:Evaluate( 公式 )

評估公式表達式或者值,并轉換為值。

實際上,Evaluate方法在用于計算時,允許創(chuàng)建“虛擬單元格”,作為VBA代碼與工作表公式之間的接口。這些虛擬單元格允許VBA訪問和直接處理當前工作簿中每個工作表函數(shù),因此提供了一種允許僅用一兩行VBA代碼就替換成千行公式的方法。

情形2:Evaluate( 對象名 )

將代表對象的對象名轉換為對象。

 

下面是Evaluate方法的一些基本應用示例。

示例1:從關閉的工作簿中取值

下面的代碼從當前工作簿所在文件夾的工作簿test.xlsx中獲取值。

Sub GetValueFromClosedWB()

    With [Sheet2!A1:A5]

        .Value = '='' &ActiveWorkbook.Path & '\[test.xlsx]Sheet1'!A1:A5'

        .Value = .Value '移除對原工作簿的鏈接

    End With

End Sub

 

示例2:提取名稱中的值

下面的代碼首先創(chuàng)建一個名為“我的公眾號”的名稱,其內(nèi)容為“完美Excel”,然后在當前工作表的單元格A1中輸入值,最后使用Evaluate方法將A1中的值和名稱的內(nèi)容連接并顯示。

Sub GetNameValue()

    ThisWorkbook.Names.Add '我的公眾號','完美Excel'

    Range('A1').Value = '我的公眾號是'

    MsgBox Evaluate('A1 & 我的公眾號')

End Sub

或者將最后一行代碼替換為簡寫形式:

MsgBox [A1 & 我的公眾號]

運行后的結果如圖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

運行后的效果如下圖3

 3

 

示例4:使用變量

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

下面的代碼顯示當前工作表單元格B1B10中的值。

Sub testGetVarValue()

    Dim i As Long

    For i = 1 To 10

        MsgBox Evaluate('B' & i)

    Next i

End Sub

 

下面的代碼在當前工作表單元格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:引用圖表和工作表對象

下面的代碼設置當前工作表單元格背景色及圖表格式。

Sub testObject()

    [圖表 1].Activate

    With ActiveChart.ChartArea

        .Interior.Color = vbRed

        .Border.Color = vbYellow

    End With

    [Sheet6].Cells.Interior.Color = vbBlue

End Sub

運行后的效果如圖4。

 4

 

下面的代碼依次激活當前工作簿中的工作表。

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

運行代碼后的結果如圖5。

 5

 

示例7:統(tǒng)計單元格數(shù)據(jù)的數(shù)量

下面的程序統(tǒng)計列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

運行后的結果如圖6。

 6

 

小結

Evaluate是一個強大的命令,然而它往往并不為人所知。

Evaluate基本上可以表示:做任何所需要執(zhí)行的計算,如果要匯總數(shù)據(jù),那么就匯總;如果要運行另一個程序,那么就運行另一個程序;如果要做那么就做,總之,無論需要什么,立即完成。

然而,Evaluate沒有很多介紹文檔,也會在許多程序中看到它的使用。但基本上是,雖然知道它能做什么但并沒有真正看到它的好處,而只是看到了它表面上的一些,它的強大功能還需要深入挖掘。



 

本文為原創(chuàng)文章,轉載請聯(lián)系我(xhdsxfjy@163.com)或者注明出處。

歡迎在下面留言,完善本文內(nèi)容,讓更多的人學到更完美的知識。

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多