使用 VBA 从主窗体设置子窗体上的窗体属性

Posted

技术标签:

【中文标题】使用 VBA 从主窗体设置子窗体上的窗体属性【英文标题】:Set Form Properties on SubSubform from the Main Form with VBA 【发布时间】:2012-09-14 03:49:14 【问题描述】:

在 Access 2007(或 2010)中,我需要使用 VBA 从主窗体设置嵌入在第一个子窗体中的子窗体的属性。为了清楚我说的是哪个表单,我将这个表单称为“subSubform”,就像我在代码中所做的那样(嗯,subSubform 实际上是子子表单控件的名称)。

当表单加载时,我的第一个子表单上有一个子表单控件,它是空白的(不包含表单源对象)。如果需要,我会使用有效表单的名称以及 LinkMasterFields 和 LinkChildFields 属性填写此控件的 SourceObject 属性。这一切似乎都很好,因为我确实得到了一个可扩展的加号,否则就不会出现。

接下来我尝试为 subSubform 设置 RecordSource,但出现错误:

2455 您输入的表达式对属性 Form/Report 的引用无效。

这是我正在使用的代码:

Me!subform1.Form!subSubform.Form.RecordSource = sSubformSQL
'and I've tried this with the same bad results
Me.subform1.Form.subSubform.Form.RecordSource = sSubformSQL
'and this too
Forms("frmQuery").subform1.Form.subSubform!Form.RecordSource = sSubformSQL

'And I've tried this. It fails too, on the last line with the same error:
    Dim frm As Form
    Set frm = Forms("frmQuery").subform1.Form
    Dim frm2 As Form
    Set frm2 = frm.subSubform.Form

我尝试设置一个计时器并等待一秒钟来运行上述代码,以防表单加载需要一些时间。但这并没有什么区别。

我尝试从第一个子窗体而不是主窗体运行代码,但这也无济于事。仍然失败并出现同样的错误。

FWIW,我的子表单和子子表单都是 DataSheet 视图。我认为这与我在这里尝试做的事情没有什么不同(尽管我很清楚所涉及的性能问题,所以不要对我大喊大叫)。

我知道这可能是一个非常奇怪的要求。但我正在创建一个需要这个的动态查询界面。

知道如何在子子表单上设置表单属性吗?

【问题讨论】:

有关此问题的实际答案,请参阅下面 Albert 回答下方的注释。 【参考方案1】:

问题不在于您设置了子表单的属性。格式:

me.subform1.form.subform2.form.RecordSource = sql

s+应该可以正常工作。

问题是您试图在 continue for(或数据表)旁边嵌套一个 continue 表单(或数据表)。这是不允许的。

解决方法是简单地将两个子窗体并排放置,不要嵌套。

您仍然可以通过使用链接主设置来获取第二个(子子)表单。

在子 1 的链接子/主设置中,您放置:

linkChildFields main_id(无论在 此子表单用于关联回父表) LinkMasterFields [ID]

在您放置的子 2 表单的链接子/主设置中

linkChildFields main_id(无论在 此子表单用于关联回父表) LinkMasterFields [child1].[form].[ID](“masterForm”是 您用来保存主窗体的控件。

因此,您可以对多对多进行建模,但不能嵌套,但如上所述,无论如何都会为您提供相同的结果。所以一个表格看起来像这样:

您也很可能在左侧(子 1)的当前事件中,希望在导航时重新查询右侧 - 因为它通常不会为您自动更新。

所以:

me.parent.Child2.Requery

【讨论】:

你必须早起。感谢您的答复。实际上,我并不是要嵌套连续形式。我正在嵌套数据表视图,这确实有效。您的建议当然是一个很好的解决方法,但我需要宽度非常大的视图,有时最多显示 20 或 30 列。因此,并排拥有两个视图是行不通的。上下会更好,但即使这样也会占用太多的房地产。我想我找到了一种解决方法,我将代码放在 subSubform 中并在 Form_Open 上运行它或使用 Timer 和 Global Variables。 好的,重要的是要注意,当您嵌套数据表时,子表单在展开之前无法引用。所以,是的,您可以下一个数据表,但是扩展表单(在您的情况下为子子表单)不存在或更正确地说明尚未创建实例。所以你必须使用on-open(或on-load)。 load 事件在用户第一次展开并点击 + 符号时触发,我不相信可以通过编程强制执行此操作。 这回答了我的问题。我刚刚在过去一个小时左右发现了同样的事情。【参考方案2】:

通常,子窗体控件的Form 属性仅在显示子窗体后才会获得“有效引用”。因此,如果您想像在

中那样执行subSubform.Form 访问

Me.subform1.Form.subSubform.Form.RecordSource = ...

您必须确保在执行访问之前 subSubform 是可见的。最简单的方法是让 subSubform 在加载时自行设置它的源(在它的 Form_Load 子中)。

有关更多详细信息和解释,请参阅我在Microsoft Access runtime error 2455 when trying to access grandchildren forms from child form 中的问题相同的答案。

【讨论】:

以上是关于使用 VBA 从主窗体设置子窗体上的窗体属性的主要内容,如果未能解决你的问题,请参考以下文章

VBA迭代主窗体上的控件,同时忽略子窗体

将值从主窗体传递到子窗体

如何从主窗体更新子窗体中的图像框控件源

单击父窗体时不会触发访问 VBA 子窗体事件

从主窗体引用子窗体错误

使用 VBA:为用户窗体上的标签控件分配值