可以使用 Eval 函数评估生成文本字符串或数值的 表达式 。
可以构造字符串,然后将其传递给 Eval 函数,就像字符串是实际表达式一样。 Eval 函数计算 字符串表达式 并返回其值。 例如, Eval("1 + 1") 返回 2。
如果向 Eval 函数传递包含函数名称的字符串, 则 Eval 函数返回函数的返回值。 例如, Eval("Chr$(65)") 返回“A”。
语法
eval ( stringexpr )
stringexpr 参数是计算结果为字母数字文本字符串的表达式。 例如, stringexpr 可以是返回字符串或数值的函数。 也可以是对窗体上 控件 的引用。 stringexpr 参数的计算结果必须为字符串或数值;它无法计算为 Microsoft Access 对象 。
注意: 下面的示例演示了如何在 Visual Basic for Applications (VBA) 模块中使用此函数。 有关使用 VBA 的详细信息,请在搜索旁边的下拉列表中选择“开发人员参考”,并在搜索框中输入一个或多个术语。
注意: 如果要将函数的名称传递给 Eval 函数,则必须在 stringexpr 参数中的函数名称后添加括号。 例如:
' ShowNames is user-defined function.
Debug.Print Eval("ShowNames()")
Debug.Print Eval("StrComp(""Joe"",""joe"", 1)")
Debug.Print Eval("Date()")
备注
可以在窗体或报表上的 计算控件 、宏或模块中使用 Eval 函数。 Eval 函数返回字符串或数值类型的 Variant。
参数 stringexpr 必须是存储在字符串中的表达式。 如果向 Eval 函数传递不包含数值表达式或函数名称但仅包含简单文本字符串的字符串,则会发生 运行时错误 。 例如, Eval("Smith") 会导致错误。
可以使用 Eval 函数来确定存储在控件的 Value 属性中的值。 以下示例将包含对控件的完整引用的字符串传递给 Eval 函数。 然后,它会在对话框中显示控件的当前值。
Dim ctl As Control
Dim strCtl As String Set ctl = Forms!Employees!LastName strCtl = "Forms!Employees!LastName" MsgBox ("The current value of " & ctl.Name & _ " is " & Eval(strCtl))
可以使用 Eval 函数访问在 Visual Basic for Applications (VBA) 模块中通常不可用的表达式运算符。 例如,不能使用 SQL 运算符 Between...和 或 In 直接在代码中,但可以在传递给 Eval 函数的表达式中使用它们。
下一个示例确定 Orders 窗体上的 ShipRegion 控件的值是否是几个指定的状态缩写之一。 如果字段包含其中一个缩写, intState 将为 True (-1) 。 请注意,使用单引号 ( ) 将字符串包含在另一个字符串中。
Dim intState As Integer
intState = Eval("Forms!Orders!ShipRegion In " _ & "('AK', 'CA', 'ID', 'WA', 'MT', 'NM', 'OR')")
查询示例
Expression |
结果 |
SELECT Eval (“15+3”) AS Expr1 FROM ProductSales GROUP BY Eval (“15+3”) ; |
计算字符串值并计算结果。 结果:18。 |
SELECT Eval (“Date () +month (date () ) ”) AS NewDate FROM ProductSales Group by Eval (“Date () +month (date () ) ”) ; |
计算字符串值,标识函数并执行它们。 结果:当前系统日期 + 当前月份,显示在“NewDate”列中。 |
VBA 示例
以下示例假定你有一系列 50 个函数,这些函数定义为 A1、A2 等。 此示例使用 Eval 函数调用系列中的每个函数。
Sub CallSeries()
Dim intI As Integer For intI = 1 To 50 Eval("A" & intI & "()") Next intI End Sub
下一个示例触发 Click 事件,就像用户单击窗体上的按钮一样。 如果按钮的 OnClick 属性的值以等号开头 (=) ,表示它是函数的名称, 则 Eval 函数将调用函数,这等效于触发 Click 事件。 如果值不以等号开头,则该值必须命名宏。 DoCmd 对象的 RunMacro 方法运行命名宏。
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