子表单引用引发错误 2455:您输入的表达式对属性 Form/Report 的引用无效

Posted

技术标签:

【中文标题】子表单引用引发错误 2455:您输入的表达式对属性 Form/Report 的引用无效【英文标题】:Subform reference throws Error 2455: You entered an expression that has an invalid reference to the property Form/Report 【发布时间】:2015-04-23 17:18:01 【问题描述】:

昨天一个我用了很久的表单/子表单突然开始抛出Error 2455: You entered an expression that has an invalid reference to the property Form/Report.

以下是我对问题的诊断。感觉像个bug。

我的问题是:你们中有人见过这个吗?如果你有兴趣,可以尝试复制这个问题,并告诉我你发现了什么吗?

问题:

我有一个完美独立工作的表单,为它的每个子表单设置记录源 但表单在放入子表单控件时失败,当尝试设置 SubForm.Form.RecordSource 属性时,每个子表单都会抛出错误 2455(但同样,仅当表单本身一个子表单)

经过大量的实验,我把它缩小到这个:

    SubForm 控件太短,无法显示窗体的详细信息部分。只有标题可见。 由于表单的详细信息不可见,Access 默默地禁用该表单下的所有子表单!!!

我的解决方法: 始终确保表单的 Detail 部分至少有一部分在 SubForm 控件中可见。要么:

增加 SubForm 控件的高度 将控件从表单 Header 移至详细信息,并使 Header 更短或不可见,因此仅显示详细信息。

你能复制一下吗?这很奇怪,所以我想要独立确认这个问题。因此,如果您有一点时间,请尝试以下步骤:

    制作一个表格: 包含孙子窗体的子窗体控件 标题部分,高度 0.5 英寸 将此表单作为子表单添加到父子表单控件中 工作案例: 将父窗体的高度设置为 0.6 英寸,以便子窗体的详细信息部分可见 在代码中,引用子组件的 subform.Form.RecordSource 属性(孙子组件)。 预期:没有错误 失败案例: 现在,将父子窗体的高度设置为 0.4 英寸,因此细节不可见 重新运行触及孩子的 subform.Form.RecordSource 属性的代码。 预期: 运行时错误 2455

我的“孙子”表单在加载时没有 RecordSource。记录源在父/子表单加载后在代码中设置。

请说明您正在运行的 Access 版本以及您获得的结果。我正在运行 Access 版本 14.0.7128.5000,它似乎是最新的。

【问题讨论】:

PS,我是一名拥有 15 年经验的专业 Access 开发人员,我以前从未见过这种情况。我把它展示给了一位经验丰富的 Access 顾问,他以前也没有见过它。所以,我要把它踢到小组里。 您好,kismet,我无法重现此内容,您可以提供文件吗?当我明确地将细节设置为不可见时,我只会收到此错误。我构建了一个包含多个子表单的表单,总共有 5 个深度级别,即使每个子表单的高度为 0,我也不会收到错误。 嗨,Marek,感谢您查看!我会看看我是否可以让一个失败的小演示工作,这样你就可以测试它。如果可以的话,我会给你发私信。 我手边没有 2007,但它在 2013 年确实失败了(但不同)。此应用是 2010 年和 2013 年共同开发的。这是不好的做法吗? 这是描述您的问题吗? ***.com/questions/10401501/… 【参考方案1】:

即使这是一个旧线程并且 OP 的答案肯定是其他的,我还是分享这个,希望它可以帮助那些绊倒“错误 2455:您输入的表达式具有对属性表单/报告的无效引用”。这可能非常令人困惑,并且与错误的实际原因相去甚远。

今天在 Access 2016 上发生在我身上。在对项目进行一些更改时,其中一个表单开始突然在其 Form_Load() 事件中抛出错误 2455,其中包含一行代码:

Private Sub Form_Load()
    Set mevtReferenceToSubform = Me.frmASubform.Form
End Sub

正如问题的 cmets 中 ***.com/questions/5023631/... 指出的那样:

“当没有记录时,绑定到父表单记录源的控件(包括具有 LinkChild/LinkMaster 属性的子表单)不会加载。”

显然,未绑定的子表单也是如此。如果父表单的 RecordSource 查询不返回任何记录,则子表单的“.Form”属性将无法从其父表单访问!

在我的例子中,罪魁祸首原来是一个 TempVar 声明,我用另一个解决方案替换了它,代码中的其他地方。但是没有注意到删除的 TempVar 甚至被现在失败的父表单的查询使用,它没有返回任何结果......

【讨论】:

观察力不错。子表单在没有记录时无法访问,这很烦人。您的代码中的修复方法是将子表单引用转换为返回访问表单的函数。我会输入代码,但 Stack Overflow cmets 无法正确格式化代码。 感谢您的提示!下次我会记住这一点。我发现在表单设计视图中从父表单 RecordSource 属性中删除查询引用时,错误消失了,而是使用代码设置 Form.Recordsource。然后表单按预期正确打开,如果查询没有返回任何结果,则没有数据,不会出现错误。 有趣。提醒:子窗体在其父窗体之前初始化。可能是您有一个引用父控件的子表单查询。当窗体初始化时,子窗体查询无效,因为父控件仍然无效。在 Form_Open 或 Form_Load 事件中设置 Form.Recordsource 是一种避免子表单中初始(无效)查询的方法。【参考方案2】:

我认为这与表单的 CurrentView 属性有关。我有一个类似的情况,只是避免了表单的 CurrentView 为 1(“表单”视图)的情况。这个解决方案对我有用:

If Me.CurrentView <> 1 Then
  Me.sfrWPCN.Form.RecordSource = strSQL
End If

【讨论】:

有趣。我需要对此进行测试。从我的角度来看,唯一的缺点是我真的必须在表单视图中更改 Recordsource。【参考方案3】:

我采用的解决方案是使用表单计时器,以确保首先加载报表和子报表。我正在修改子报告上的过滤器,并在添加计时器之前收到 2455 错误。

【讨论】:

好主意。听起来您有很多子表单要重新查询!【参考方案4】:

我知道这个问题很老,但我能够通过确保表单的Detail 属性设置为True 来解决这个问题。我有一个If 语句检查条件:

If Me.Detail.Visible = False Then Me.Detail.Visible = True.

【讨论】:

我得试试这个。你把这条线放在代码的什么地方? (父事件,子事件,...)

以上是关于子表单引用引发错误 2455:您输入的表达式对属性 Form/Report 的引用无效的主要内容,如果未能解决你的问题,请参考以下文章

使用输入表单标记中的onclick属性的JavaScript未捕获引用错误

VBA访问检查父表单是不是存在

Access 数据库窗体 ActiveX 控件错误

MS Access:数据表属性(作为子表单)- 表单未打开,错误:2489?

无法引用子窗体以重新填充记录源运行时错误 2450 无法找到主窗体

如何动态更改访问图表的行源