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

时间:2015-04-23 17:18:01

标签: ms-access access-vba ms-access-2007 ms-access-2010

昨天,一段对我很有效的表格/子表格突然开始投掷Error 2455: You entered an expression that has an invalid reference to the property Form/Report.

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

我的问题是:有没有人见过这个?如果您有兴趣,可以尝试复制问题,让我知道你发现了什么吗?

问题:

  • 我有一个完全完全独立的表单,为每个子表单设置记录源
  • 但是当表单放入子表单控件时,表单失败,在尝试设置SubForm.Form.RecordSource属性时,为每个子表单抛出错误2455(但同样,仅当表单本身是一个子表格)
经过大量的实验,我把它缩小到了这个范围:

  1. SubForm控件太短以显示表单的详细信息部分。只有标题可见。
  2. 由于表单的详细信息不可见,因此默认禁用表单下的所有子表单!!!
  3. 我的解决方法:始终确保至少部分表单的“详细信息”部分在SubForm控件中可见。之一:

    • 增加SubForm控件的高度
    • 将控件从表单标题移动到详细信息,并使标题更短或不可见,因此只显示详细信息。

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

    1. 制作表格:
      • 包含孙子表单的子表单控件
      • 标题部分,高度0.5英寸
    2. 在父子窗体控件中将此窗体添加为子窗口
    3. 工作案例:
      • 将父级的子窗体高度设置为.6英寸,以便显示子级的详细信息部分
      • 在代码中,请参阅子代的subform.Form.RecordSource属性(孙子)。
      • 期望:没有错误
    4. 失败案例:
      • 现在,将父子窗体高度设置为.4英寸,因此细节不可见
      • 重新运行触及子项的subform.Form.RecordSource属性的代码。
      • 期望:运行时错误2455
    5. 我的'孙子'表单在加载时没有RecordSource。在父/子表单加载后,记录源在代码中设置。

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

4 个答案:

答案 0 :(得分:2)

尽管这是一个老线程并且OP的答案肯定是其他的东西,但我希望它能帮助为那些陷入困境的其他人提供一些启示“错误2455:你输入了一个表达式对表格/报告的无效引用“。这可能相当混乱,并且远离错误的实际原因。

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

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

正如stackoverflow.com/questions/5023631/...在对该问题的评论中所指出的那样:

  

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

显然,对于未绑定的子表单也是如此。如果父窗体的RecordSource查询没有返回任何记录,则子窗体'.Form'属性将无法从其父窗体访问!

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

答案 1 :(得分:1)

我认为这与Form的CurrentView属性有关。我有一个类似的案例,当Form的CurrentView为1(" Form" view)时,我只是避免了这种情况。这个解决方案对我有用:

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

我知道这个问题很旧,但是我可以通过确保表单的Detail属性设置为True来解决此问题。我有一个If语句正在检查条件:

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