乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

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

       L羅樂 2017-09-22

       

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


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

       1

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

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

       

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

      其語法為:

      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)合操作符(分別是冒號、空格和逗號)。

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

      • 外部引用。可以使用!操作符指向其他工作簿中的單元格或者名稱。

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

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

       

      下面是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方法將其轉(zhuǎn)換到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( 公式 )

      評估公式表達式或者值,并轉(zhuǎn)換為值。

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

      情形2:Evaluate( 對象名 )

      將代表對象的對象名轉(zhuǎn)換為對象。

       

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

      示例1:從關(guān)閉的工作簿中取值

      下面的代碼從當前工作簿所在文件夾的工作簿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 & 我的公眾號]

      運行后的結(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

      運行后的效果如下圖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:引用圖表和工作表對象

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

      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

      運行代碼后的結(jié)果如圖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

      運行后的結(jié)果如圖6

       6

       

      小結(jié)

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

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

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



       

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

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

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

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多