ms-access vba Eval函数行为

时间:2009-07-07 23:26:02

标签: ms-access vba

我在Access表单中有一个公共函数

Public Function PopupProcess() as long
  MsgBox Me.ActiveControl
  PopupProcess = 1
End Function

当我打电话

eval("forms('MyForm').popupprocess")

它显示一个消息框2次。有人知道为什么会这样吗?

我使用SP3访问Access 2003。

编辑:主要思想是从该表单调用自定义命令栏控件OnAction的函数。 也许你有更好的方法从命令栏控件的表单调用函数。

2 个答案:

答案 0 :(得分:8)

这是一个非常长期存在的错误,自访问97天以来一直存在(大约4-5个访问版本)。

这里的解决方案是永远不要使用表格限定符,只需将以下内容放在你的行动事件中,你就可以了。

=PopUpProcess()

请注意,您必须在其前面加上=,并且后缀必须包含方括号()

请记住,您可以实际使用行为。运行的函数将来自当前焦点在屏幕上的表单。这意味着您可以使用具有相同名称的函数的不同表单,无论哪个表单具有焦点,具有该名称的函数都将从该表单代码模块运行。

更好的是,如果其中一个表单在表单代码模块中没有公共功能,则使用标准代码模块中的函数。所以你可能有九种形式,它们都使用主标准代码模块中的标准一种功能。但是,第10个表单可能需要运行特殊代码,因此您只需将该函数代码放在表单的代码模块中作为公共代码,它将代替标准代码模块中的public运行。

此方法允许您构建一个适用于许多不同表单的自定义菜单栏,但这些表单将从该自定义菜单栏运行不同的代码。这也鼓励您将菜单代码放在它所属的表单中。

因此,要解决您的问题,只需不要使用表单的限定符,并使用上述格式。

请注意,您也可以从这些函数传递参数,例如

=PopUpProcess(‘hello’)

然后将该函数声明为:

Public Function PopUpProcess(strParm as string)

请记住,当您在功能区中使用on动作进行访问2007时,上面所述的功能和语法以及所有内容也适用。

答案 1 :(得分:1)

不知道。如果你这样称呼会怎么样?

Call Forms("MyForm").PopupProcess

尝试使用CallByName函数而不是eval来调用您的函数。它应该只触发你的函数一次,它仍然允许你参数化表单名称和函数或子名称:

CallByName Forms("MyForm"), "PopupProcess", VbMethod