【问题标题】:How to set the Before Update property via VBA in Access 2007如何在 Access 2007 中通过 VBA 设置更新前属性
【发布时间】:2014-09-13 19:10:00
【问题描述】:

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

Forms![PartsDatabaseX]![RepsSubformX]![Pack Rank].BeforeUpdate = "[Event Procedure]"

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

Forms![PartsDatabaseX]![RepsSubformX]![Pack Rank].BeforeUpdate = "Tracker"

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

Forms![PartsDatabaseX]![RepsSubformX]![Pack Rank].BeforeUpdate(Tracker)

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

Forms![PartsDatabaseX]![RepsSubformX]![Pack Rank].BeforeUpdate  "Tracker"

错误 438 = “对象不支持此属性或方法”

编辑-

在玩了更多之后,我可以将BeforeUpdate 属性分配给表单中的控件,假设存在相应的更新前事件:

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

Private Sub FormCtl_BeforeUpdate(Cancel As Integer)
'Do stuff
End Sub

不幸的是,这个方法在子表单中仍然失败......

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

【问题讨论】:

    标签: vba ms-access ms-access-2007 subform beforeupdate


    【解决方案1】:

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

    Forms![PartsDatabaseX] 到达主窗体。

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

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

    Forms![PartsDatabaseX]![RepsSubformX].Form![Pack Rank] 到达子窗体上的控件。

    Forms![PartsDatabaseX]![RepsSubformX].Form![Pack Rank].BeforeUpdate 到达控件的事件属性。

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

    Control.BeforeUpdate = "=MyFunction()"
    

    Forms![PartsDatabaseX]![RepsSubformX].Form![Pack Rank].BeforeUpdate = "=MyFunction()"
    

    【讨论】:

    • 这似乎有效,但我无法让该功能正常工作。当我尝试分配属性时,它告诉我“该对象不包含自动化对象'MyFunction'。但我找不到这意味着什么......
    • 确保将 MyFunction 定义为公共函数(默认为私有)并且在引号内包含等号。
    • 仍然无法正常工作,我正在测试的代码如下。我需要声明一些东西才能让它工作吗? Forms![PartsDatabaseX]![RepsSubformX].Form![Pack Rank].BeforeUpdate = "=ToTracking()" Public Function ToTracking() MsgBox "Success" End Function
    • 尝试将 ToTracking 代码移动到新的常规代码模块中,而不是在父表单中。将该新模块命名为 ToTracking 以外的任何名称。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多