如何在Access 2007中通过VBA设置更新前属性

如何在Access 2007中通过VBA设置更新前属性,vba,ms-access,ms-access-2007,subform,beforeupdate,Vba,Ms Access,Ms Access 2007,Subform,Beforeupdate,我有一个子表单,它根据用户输入更改其记录源(Form.SourceObject)。我正在开发一个变更跟踪系统,该系统依赖于子表单中某些字段的pre Update属性(在工作表视图中,如果有区别的话)。如果我不更改记录源,更新前的将相应触发。如果我改变了它,它就丢失了,我需要重新分配触发器。问题是,我找不到任何描述如何做到这一点的东西。我尝试使用以下代码,其中“Tracker”是要调用的代码: Forms![PartsDatabaseX]![RepsSubformX]![Pack Rank].Be

我有一个子表单,它根据用户输入更改其记录源(
Form.SourceObject
)。我正在开发一个变更跟踪系统,该系统依赖于子表单中某些字段的
pre Update
属性(在工作表视图中,如果有区别的话)。如果我不更改记录源,更新前的
将相应触发。如果我改变了它,它就丢失了,我需要重新分配触发器。问题是,我找不到任何描述如何做到这一点的东西。我尝试使用以下代码,其中“Tracker”是要调用的代码:

Forms![PartsDatabaseX]![RepsSubformX]![Pack Rank].BeforeUpdate = "[Event Procedure]"
错误2455=“您输入的表达式在更新前对属性的引用无效”

错误2455=“您输入的表达式在更新前对属性的引用无效”

编译错误=预期的函数或变量

Forms![PartsDatabaseX]![RepsSubformX]![Pack Rank].BeforeUpdate  "Tracker"
错误438=“对象不支持此属性或方法”

编辑-

在对其进行更多的操作之后,我可以将
BeforeUpdate
属性正确地分配给表单中的控件,前提是存在相应的before update事件:

Private Sub Assign_Before_Update()
Me.FormCtl.BeforeUpdate = "[Event Procedure]"
End Sub

Private Sub FormCtl_BeforeUpdate(Cancel As Integer)
'Do stuff
End Sub
不幸的是,此方法在子窗体中仍然失败


我开始认为,我正在更改
表单.SourceObject
这一事实是阻止我设置属性的原因。

我找到了解决此问题的方法-我已经这样做了,以便可以选择的每个查询都有自己的子表单,可以根据需要隐藏/取消隐藏。它可以工作,但我不喜欢在我的主窗体上有5个额外的子窗体浮动…

当您想要访问子窗体上的控件时,需要使用子窗体控件的.form属性

表单![PartsDatabaseX]
到达主窗体

表单![PartsDatabaseX]![RepsSubformX]
到达子窗体控件。子窗体控件具有SourceObject、LinkMasterFields和LinkChildFields等属性,但没有自己的任何控件

表单![PartsDatabaseX]![RepsSubformX].Form
作为真正的表单对象到达子表单

表单![PartsDatabaseX]![RepsSubformX]。表单![Pack Rank]
到达子窗体上的控件

表单![PartsDatabaseX]![RepsSubformX]。表单![Pack Rank].BeforeUpdate
到达控件的事件属性之前

我建议在函数(而不是子函数)中定义您的行为,因为这样您就可以使用语法直接从控件的事件属性调用该函数

Control.BeforeUpdate = "=MyFunction()"


这似乎可行,但我无法使函数正常工作。当我尝试分配属性时,它告诉我“对象不包含自动化对象‘MyFunction’。我找不到这意味着什么……请确保MyFunction定义为公共函数(默认为private)并且在引号中包含等号。仍然不起作用,下面是我正在测试的代码。我需要声明一些东西才能使其起作用吗?Forms![PartsDatabaseX]![RepsSubformX]。Form![Pack Rank]。BeforeUpdate=“=ToTracking()”公共函数ToTracking()MsgBox”成功“结束函数尝试将ToTracking代码移动到新的常规代码模块中,而不是在父窗体中。将新模块命名为ToTracking以外的任何名称。
Private Sub Assign_Before_Update()
Me.FormCtl.BeforeUpdate = "[Event Procedure]"
End Sub

Private Sub FormCtl_BeforeUpdate(Cancel As Integer)
'Do stuff
End Sub
Control.BeforeUpdate = "=MyFunction()"
Forms![PartsDatabaseX]![RepsSubformX].Form![Pack Rank].BeforeUpdate = "=MyFunction()"