在VBA中可以利用Excel函數(shù)的強(qiáng)大功能,。
使用WorksheetFunction對(duì)象
WorksheetFunction對(duì)象的成員就是Excel內(nèi)置函數(shù),,因此,利用該對(duì)象可以直接在VBA中使用這些函數(shù),。
例如,,求單元格區(qū)域A1:A5的數(shù)值之和,假如將該區(qū)域命名為“myRange”,,則可以在VBA中使用下列代碼:
Application.WorksheetFunction.Sum(Range("myRange"))
Application.WorksheetFunction.Sum(Range("A1:A5")) |
注意,,在VBA中當(dāng)輸入WorksheetFunction后再輸入一個(gè)句點(diǎn)時(shí),,就會(huì)顯示所有的函數(shù)列表,如下圖所示,。
Evaluate方法
使用Worksheet對(duì)象或Application對(duì)象的Evaluate函數(shù),。該函數(shù)接受字符串參數(shù),,返回引用的公式的值(字符串為公式)或者引用的單元格區(qū)域(字符串代表單元格或單元格區(qū)域,,A1樣式),。其語(yǔ)法為:
表達(dá)式.Evaluate(Name)
將Excel名稱轉(zhuǎn)換為對(duì)象或值,,其中:
- 表達(dá)式 對(duì)于Application,,表達(dá)式可選,;對(duì)于Chart、DialogSheet和Worksheet,表達(dá)式必需。
- Name 必需的字符串,。滿足Excel命名規(guī)范的對(duì)象的名稱,,包括:
(1)A1樣式引用,??梢砸訟1樣式的引用方式使用任意對(duì)單個(gè)單元格的引用,引用都被考慮是絕對(duì)引用,。
(2)單元格區(qū)域??梢允褂脜^(qū)域,、交叉和聯(lián)合操作符(冒號(hào)、空格和逗號(hào))引用單元格區(qū)域,。
(3)定義的名稱,。
(4)外部引用??梢允褂?操作符引用另一工作簿中的單元格或定義的名稱,。例如Evaluate(“[BOOK1.XLS]Sheet1!A1″)。
(5)Chart對(duì)象,??梢灾付ㄈ我鈭D表對(duì)象名稱,例如“圖例”,、“繪圖區(qū)”或“系列1”,,來(lái)訪問該對(duì)象的屬性和方法。例如,,Charts(“Chart1″).Evaluate(“Legend”).Font.Name返回圖例中使用的字體名,。
也可以使用方括號(hào)代替evaluate函數(shù),使用方括號(hào)(例如,,”[A1:C5]”)與調(diào)用帶字符串參數(shù)的Evaluate方法是相同的,。例如,,下面的代碼等價(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") |
使用方括號(hào)的優(yōu)勢(shì)是代碼更簡(jiǎn)短,。使用Evaluate方法的的優(yōu)勢(shì)是參數(shù)是字符串,,因此可以在代碼中構(gòu)造字符串或使用變量。
例如,,下面的代碼將Sheet1中單元格A1加粗:
Worksheets("Sheet1").Activate
boldCell = "A1"
Application.Evaluate(boldCell).Font.Bold = True |
更簡(jiǎn)短一些,,如設(shè)置當(dāng)前工作表中單元格B1為加粗:
下面的代碼返回當(dāng)前工作表中單元格A1的值:
下面的代碼返回當(dāng)前工作表中單元格區(qū)域A1:A5的值之和:
又例如:
For i = 2 To 10
Debug.Print Evaluate("A" & i), Evaluate("COUNTIF(A1:A" & (i - 1) & ",A" & i & ")")
Next i |
將打印出A1:A10區(qū)域內(nèi),某單元格的值在其上面的單元格中出現(xiàn)的次數(shù)。
輸出結(jié)果為:
可以將上述代碼稍作變化,,以統(tǒng)計(jì)A列中的值,,即可以動(dòng)態(tài)調(diào)整,。
For i = 2 To [COUNTA(A:A)]
Debug.Print Evaluate("A" & i), Evaluate("COUNTIF(A1:A" & (i - 1) & ",A" & i & ")")
Next i |
注意,,上面的代碼中使用[COUNTA(A:A)]來(lái)統(tǒng)計(jì)A列中有多少個(gè)數(shù)值單元格,。
下面的代碼選擇單元格區(qū)域A1:C3:
Range(“offset(a1,,,3,3)”).Select |
使用Evaluate函數(shù),,可以使用在VBA中不能使用的工作表函數(shù)。例如,,ISBLANK函數(shù)。下面的示例判斷單元格A1是否為空,,如果為空返回True,,不為空則返回False,。
MsgBox Evaluate(“=ISBLANK(A1)”)
MsgBox [ISBLANK(A1)] |
可以更加靈活地編寫代碼。
Sub IsActiveCellEmpty()
Dim strFunctionName As String, strCellReference As String
strFunctionName = "ISBLANK"
strCellReference = ActiveCell.Address
MsgBox Evaluate(strFunctionName & "(" & strCellReference & ")")
End Sub |
但是,,如果只是使用方括號(hào),則不能夠在其中包含變量表達(dá)式,。
示例1
首先,,創(chuàng)建隱藏的名稱來(lái)保存密碼。(在名稱定義對(duì)話框中看不到隱藏的名稱,,因此可以非常方便地存儲(chǔ)信息)
Names.Add Name:="PassWord", RefersTo:="Bazonkas", Visible:=False |
接著,,在表達(dá)式中使用隱藏的數(shù)據(jù):
strUserInput = InputBox("請(qǐng)輸入密碼:")
If strUserInput = [Password] Then
... |
示例2
下面的表達(dá)式生成一個(gè)二維的Variant型數(shù)組,100行1列,,值為101到200,。
vRowArray = [Row(101:200)] |
下面的代碼將101至200的值賦給單元格區(qū)域B1:B100:
[B1:B100] = [Row(101:200)] |
以上都比For…Next循環(huán)更有效率。
示例3
自定義函數(shù)——FindOffset函數(shù)
該函數(shù)將在某區(qū)域內(nèi)搜索某值,然后從所發(fā)現(xiàn)的結(jié)果位置偏移x行和x列,。例如:
=FindOffset($A$1:$E$10,”Dog”,2,3)
在$A$1:$E$10區(qū)域查找“Dog”,,2(可選的)告訴該函數(shù)從內(nèi)容為“Dog”的單元格處偏移2列,3(可選的)告訴該函數(shù)從內(nèi)容為“Dog”的單元格處偏移3行,。因此,,如果“Dog”在單元格B5,那么該函數(shù)將返回單元格D8(離B5單元格右側(cè)2列下方3行)中的值,。
代碼如下:
Function FindOffset(LookInRange As Range, FindVal, _
Optional ColOffset As Long, Optional RowOffset As Long)
Dim lCount As Long, lRow As Long
On Error Resume Next
For lCount = 1 To LookInRange.Columns.Count
lRow = Application.WorksheetFunction.Match _
(FindVal, LookInRange.Columns(lCount), 0)
If lRow > 0 Then
FindOffset = LookInRange.Cells(lRow, lCount) _
(RowOffset + 1, ColOffset + 1)
Exit For
End If
Next lCount
On Error GoTo 0
End Function |
說(shuō)明:
For循環(huán)的循環(huán)次數(shù)為Range變量LookInRange的列數(shù),,即
LookInRange.Columns.Count |
在每次循環(huán)中,WorksheetFunction.Match用于查找FindVal代表的值在單元格區(qū)域LookInRange中的列數(shù),,如果找到,,即lRow > 0,將返回真并進(jìn)入If語(yǔ)句,。If語(yǔ)句里面的代碼指定開始偏移的單元格位置,,即
LookInRange.Cells(lRow, lCount) |
變量lRow包含要偏稱的行數(shù),lCount為要偏移的列數(shù),。因此,,
=FindOffset($A$1:$E$10,”Dog”,2,3)
如果“Dog”在單元格B5中,LookInRange.Cells(lRow, lCount)將為L(zhǎng)ookInRange.Cells(5, 2) ,,與LookInRange ($A$1:$E$10)相關(guān)的單元格為B5,,即$A$1:$E$10區(qū)域的第5行和第2列。
接著使用Item屬性從該單元偏移,,也就是(RowOffset + 1, ColOffset + 1),。加1是因?yàn)镺ffset屬性的Item方法基于0,即基點(diǎn)單元格,。(注:Offset屬性可以接受負(fù)值,,而Item屬性不能)
一旦找到單元格,Exit For及時(shí)退出該函數(shù)并顯示結(jié)果,。
使用這些技術(shù),,可以將VBA和Excel公式與函數(shù)聯(lián)合,使得更為強(qiáng)大和靈活,。
進(jìn)一步閱讀:在VBA中使用R1C1樣式的公式
參考資源:
How to Use an Excel Formula from VBA
http://www./News/excel-evaluate-formula-VBA.htm
http://msdn.microsoft.com/en-us/library/aa223886(v=office.11).aspx
Excel 2007 VBA參考大全