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

时间:2012-01-09 11:51:17

标签: forms ms-access reference

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

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

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

=MyFunction([Field1], [Field2], [Field3] ...)

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

=MyFunction([Forms]![MyForm])

但我不喜欢在电话中命名表格。有没有办法将“当前形式”作为函数参数发送?在VBA中,您只需使用“Me”关键字,例如“Me![Field1]”。但似乎在表达中不接受“我”。

还有其他方法可以在表达式中引用当前表单吗?

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

感谢你的帮助! : - )

/安德斯

6 个答案:

答案 0 :(得分:9)

您可以使用:

=MyFunction([Form])

代码如下:

Function MyFunction(frm As Form)
MsgBox frm.Name
End Function

答案 1 :(得分:4)

'me'只能在相应的表单对象中调用(即在对象的过程,函数和事件中)。

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

screen.activeForm.recordset.fields(myFieldname).value
screen.activeForm.controls(myControl).value
screen.activeForm.name
....

当然,您可以将表单对象发送到自定义函数

my Result = myCustomFunction(screen.activeForm)

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

答案 2 :(得分:3)

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

Call SomeFunction(me)

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

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

我经常去:

Dim f     as form
Set f = screen.ActiveForm

答案 3 :(得分:1)

Screen.ActiveControl.Parent
' or
someControlVariable.Parent

如果我想要当前子表单(或者当前不在子表单中的表单),我会使用它,因为使用Screen.ActiveForm不提供当前子表单,而只提供包含该子表单的表单。请注意您的上下文,如果控件位于选项卡控件中,则其父级是该选项卡控件而不是表单。

答案 4 :(得分:0)

在ACC2013中,我无法使用fionnuala的答案。所以我改为:

Property-Window中的事件处理程序:

=MyFunction()

我的代码是:

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

答案 5 :(得分:0)

后跟Philippe Grondier above的方法是一种更通用的方法,尤其是当您需要引用作为表单对象的新实例的表单上的字段并且组合控件查询条件引用了表单上另一个字段的值时相同的形式。只要它是活动形式,就可以使用返回值的函数。例如

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