使用 Eval 函數(shù)可以計(jì)算一個(gè)結(jié)果為文本字符串或數(shù)值的表達(dá)式的值。
可以構(gòu)造一個(gè)字符串,然后就像是一個(gè)真正的表達(dá)式一樣把字符串傳給 Eval 函數(shù),。Eval 函數(shù)將計(jì)算字符串表達(dá)式并返回計(jì)算結(jié)果值。例如, Eval("1 + 1") 返回 2。
如果傳給 Eval 函數(shù)的字符串包含一個(gè)函數(shù)的名稱,Eval 函數(shù)會(huì)返回該函數(shù)的返回值。例如,Eval("Chr$(65)") 返回 "A"。
Eval(stringexpr)
stringexpr 參數(shù)是一個(gè)對(duì)字母數(shù)字文本字符串進(jìn)行計(jì)算的表達(dá)式。例如,stringexpr 可以是一個(gè)返回字符串或數(shù)值的函數(shù),或是對(duì)窗體上的控件的引用。stringexpr 參數(shù)的值必須對(duì)字符串或數(shù)值進(jìn)行計(jì)算,但不能對(duì) Microsoft Access 對(duì)象進(jìn)行計(jì)算。
注釋 如果把函數(shù)名傳給 Eval 函數(shù),則必須在 stringexpr 參數(shù)中的函數(shù)名后加上括號(hào)。例如:
' ShowNames is user-defined function.
Debug.Print Eval("ShowNames()")
Debug.Print Eval("StrComp(""Joe"",""joe"", 1)")
Debug.Print Eval("Date()")
可以在窗體或報(bào)表上的計(jì)算控件中,或者宏或模塊中使用 Eval 函數(shù)。Eval 函數(shù)將返回一個(gè)字符串或數(shù)值類型的 Variant。
stringexpr 參數(shù)必須是一個(gè)以字符串形式存儲(chǔ)的表達(dá)式。如果傳給 Eval 函數(shù)的字符串不包括數(shù)值表達(dá)式或函數(shù)名稱而僅僅是一個(gè)簡(jiǎn)單的文本字符串,則會(huì)出現(xiàn)運(yùn)行時(shí)錯(cuò)誤。例如, Eval("Smith") 將產(chǎn)生錯(cuò)誤。
使用 Eval 函數(shù)可決定存儲(chǔ)在控件中的 Value 的屬性值。下面的示例傳給 Eval 函數(shù)一個(gè)包含對(duì)控件的完整引用的字符串,然后在對(duì)話框中顯示該控件的當(dāng)前值。
Dim strCtl As String
Set ctl = Forms!Employees!LastName
strCtl = "Forms!Employees!LastName"
MsgBox ("The current value of " & ctl.Name & " is " & Eval(strCtl))
使用 Eval 函數(shù)可以訪問在 Visual Basic 中通常不能使用的表達(dá)式運(yùn)算符。例如,不能在代碼中直接使用 SQL 運(yùn)算符 Between...And 或 In,但是在傳給 Eval 函數(shù)的表達(dá)式中可以使用它們。
下面的示例用于確定“訂單”窗體上的“貨主地區(qū)”控件的值是否為幾個(gè)特定的州縮寫名稱中的一個(gè)。如果字段中包含了其中一個(gè)縮寫名稱, intState 的值將為 True(-1)。請(qǐng)注意,在示例中使用了單引號(hào) (') 以在字符串中包含另一個(gè)字符串。
Dim intState As Integer
intState = Eval("Forms!Orders!ShipRegion In " _
& "('AK', 'CA', 'ID', 'WA', 'MT', 'NM', 'OR')")
下面的示例中,假設(shè)有 50 個(gè)定義為 A1、 A2 這樣的一系列函數(shù),然后使用 Eval 函數(shù)依次調(diào)用每個(gè)函數(shù)。
Sub CallSeries()
Dim intI As Integer
For intI = 1 To 50
Eval("A" & intI & "()")
Next intI
End Sub
下面的示例將觸發(fā)一個(gè) Click 事件,就像用戶單擊窗體上的一個(gè)按鈕一樣。如果按鈕的 OnClick 屬性值以等號(hào)(=)打頭表明它是函數(shù)名,Eval 函數(shù)就會(huì)調(diào)用該函數(shù),這與觸發(fā) Click 事件的效果相同。如果屬性值不以等號(hào)打頭,那么它必須指定一個(gè)宏的名稱。DoCmd 對(duì)象的 RunMacro 方法運(yùn)行該宏。
Dim ctl As Control
Dim varTemp As Variant
Set ctl = Forms!Contacts!HelpButton
If (Left(ctl.OnClick, 1) = "=") Then
varTemp = Eval(Mid(ctl.OnClick,2))
Else
DoCmd.RunMacro ctl.OnClick
End If