Forms 如何在Microsoft Access中的表达式中引用当前表单?

Forms 如何在Microsoft Access中的表达式中引用当前表单?,forms,ms-access,reference,Forms,Ms Access,Reference,我不是访问专家,我有一个(我希望!)简单的问题 我有一张有很多记录的表格。在一些文本框中,我只显示基础表中的值,因此它们被绑定到相应的字段 但有些文本框应该包含计算值。有些计算很复杂,涉及表中的许多字段。我把计算写成VBA函数。我可以输入这样的内容作为“控制源”: 但我不想在函数调用中列出几十个字段。相反,我希望将整个表单(或当前记录)作为参数发送,并让函数引用它所需的字段。我可以这样做: =MyFunction([Forms]![MyForm]) 但是我不喜欢在电话里说出表格的名字。是否有一

我不是访问专家,我有一个(我希望!)简单的问题

我有一张有很多记录的表格。在一些文本框中,我只显示基础表中的值,因此它们被绑定到相应的字段

但有些文本框应该包含计算值。有些计算很复杂,涉及表中的许多字段。我把计算写成VBA函数。我可以输入这样的内容作为“控制源”:

但我不想在函数调用中列出几十个字段。相反,我希望将整个表单(或当前记录)作为参数发送,并让函数引用它所需的字段。我可以这样做:

=MyFunction([Forms]![MyForm])
但是我不喜欢在电话里说出表格的名字。是否有一种方法可以将“当前表单”作为函数参数发送?在VBA中,只需使用“Me”关键字,例如“Me![Field1]”。但似乎“我”这个词不被接受

是否有其他方法引用表达式中的当前形式

(我知道这是一个装饰性的问题。但是使用“[Form]![MyForm]”编程不好。稍后您将控件复制到另一个窗体,忘记更改表达式中的名称…)

谢谢你的帮助!:-)

/Anders

您可以使用:

=MyFunction([Form])
守则是:

Function MyFunction(frm As Form)
MsgBox frm.Name
End Function
Function MyFunction()
  Dim frm As Form   
  Set frm = Screen.ActiveForm
  MsgBox frm.Name
End Function

“me”只能从相应的表单对象中调用(即在对象的过程、函数和事件中)

我最喜欢的引用当前表单的方法是调用screen.activeForm对象

screen.activeForm.recordset.fields(myFieldname).value
screen.activeForm.controls(myControl).value
screen.activeForm.name
....
当然,您可以将表单对象发送到自定义函数

my Result = myCustomFunction(screen.activeForm)

或者您可以构建一个用户定义的对象。然后,可以将所需字段视为内部属性,在相应对象的类_Initialize sub中设置

如果您在表单中使用代码,则“我”将引用当前表单。所以

Call SomeFunction(me)
但是,“me”不能在绑定到文本框的表达式的上下文中使用

在这种情况下,您可以按照建议使用screen.activeform在例程中选择当前屏幕

我经常去:

Dim f     as form
Set f = screen.ActiveForm
如果我想要当前子表单(如果当前不在子表单中,则使用表单),因为使用
Screen.ActiveForm
不提供当前子表单,而只提供包含该子表单的表单。请注意您的上下文,如果控件位于选项卡控件内,则其父控件是该选项卡控件而不是表单。

在ACC2013中,我无法使用的答案。因此,我改为:

属性窗口中的事件处理程序:

=MyFunction()
我的代码是:

Function MyFunction(frm As Form)
MsgBox frm.Name
End Function
Function MyFunction()
  Dim frm As Form   
  Set frm = Screen.ActiveForm
  MsgBox frm.Name
End Function
所采用的方法更通用,尤其是当您需要引用表单上的字段(该字段是表单对象的新实例)并且组合控件查询条件引用同一表单上另一个字段的值时。只要它是活动形式,就可以使用返回值的函数。例如

Public Function ActiveFormControlValue(strControlName As String) As Variant
    ActiveFormControlValue = Screen.ActiveForm.Controls(strControlName).Value
End Function

我确信您知道,使用控件的属性表将事件甚至对象的控件源设置为函数是完全可能的,在这种情况下,
=affunction([Form])
可能非常有用。如果您希望将控件剪切并粘贴到多个窗体上,此功能尤其有用。我相信OP考虑的就是这个功能。天哪,我不知道表达式中可以用[Form]来代替关键字[me]。这确实有效,并且确实传递了表单名称,而且不需要硬编码。这一技巧无疑打开了一些我不知道的可能性。是的,我不知道表达式中的“Form”与VBA中的“Me”关键字类似。非常方便。我似乎找不到这种技术的文档,但它是有效的!如前所述,您可以传递“me”或[form],但必须用表单的实际名称替换“[form]”。所以fionnuala答案会起作用,但您从不使用[Form],而是用表单名称(如表单)替换表单!某人的名字。我认为最好将“我”传递给例程,因为这样代码就可以从一个表单正确运行,如果其他表单被启动或获得焦点,那么您的代码就不会从中发现错误。但是,您可以使用Screen.ActiveForm。为什么在Expression Builder中使用[Form]会出现问题?ActiveForm在这个实例中是一个选项吗?我看到显式使用表单名称的缺点,因为这些名称可能会更改,或者您可能想窃取表单的表达式或代码,但对表单使用不同的名称。
Screen.ActiveForm.name
可以在全局函数中使用!谢谢你!我认为这应该被标记为答案,因为它将在比将表单名称作为参数传递多得多的情况下实现目标,并且将完全消除传递参数的需要——甚至是更整洁、更少混乱的代码。菲利普·格朗迪埃的荣誉!这很巧妙地解决了我正在解决的一个问题。