应用程序定义或对象定义的错误设置子表单记录源

Posted

技术标签:

【中文标题】应用程序定义或对象定义的错误设置子表单记录源【英文标题】:Application-defined or object defined error setting subform record source 【发布时间】:2019-03-03 04:30:02 【问题描述】:

我正在尝试设置作为父表单一部分的子表单的记录集。

我使用的代码是:

docmd.openform "mainFrm"
Forms!mainFrm.subFrm.Form.RecordSource = "SELECT * FROM table1 WHERE ID = 24;"

我收到以下错误:

应用程序定义或对象定义错误

如果我将 vba 更改为:

docmd.openform "subFrm"
Forms!subFrm.RecordSource = "SELECT * FROM table1 WHERE ID = 24;"

子窗体可以正常打开。

我注意到的一件事是,即使SubFrmmainFrm 的一部分。即使mainFrm 已打开:

?CurrentProject.AllForms("SubFrm").IsLoaded 

返回假

虽然

 ?CurrentProject.AllForms("MainFrm").IsLoaded 

返回真

有没有办法在主窗体打开时更改作为主窗体一部分的子窗体的记录集?

【问题讨论】:

为什么?如果您链接主表单和子表单,则没有理由这样做。 子窗体本身的名字和主窗体上的子窗体控件的名字看起来一样。也许这就是原因? @June7 你是对的。容器控件的名称是 child0。我将其名称更改为 SubFrm,现在一切正常。谢谢! 【参考方案1】:

子表单不会作为独立表单打开,因此不能包含在活动表单集合中。 Forms 集合中仅列出活动的独立表单,并通过 IsLoaded 属性返回 True。

引用子表单及其控件和属性必须通过包含对象(表、查询、表单、报表)的子表单容器控件来完成。如果 subFrm 是表单的名称,那么保存表单的容器控件的名称是什么?我通常将容器命名为与其持有的对象不同的名称,例如 ctrDetails。然后从该子表单外部的代码中引用子表单 RecordSource 属性将是:

Forms!mainFrm.ctrDetails.Form.RecordSource = "SELECT * FROM table1 WHERE ID = 24;"

【讨论】:

以上是关于应用程序定义或对象定义的错误设置子表单记录源的主要内容,如果未能解决你的问题,请参考以下文章

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

WinForms C#中自定义对象类型的跨进程拖放

通过 VBA 设置表单的记录集也是设置其记录源

word不能启动此对象的源应用程序怎样插件

在表单加载之前捕获记录源错误 - 访问

Access VBA:更改子表单的记录源