在 VBA Access 中动态填充其他子表单的子表单

Posted

技术标签:

【中文标题】在 VBA Access 中动态填充其他子表单的子表单【英文标题】:SubForm that is dynamically filled with other subforms in VBA Access 【发布时间】:2017-11-03 19:44:38 【问题描述】:

我想创建一个包含动态创建的子表单列表的弹出表单。子表单的数量由用户在父表单中确定。

这是一个草图来说明我想要做什么。用户可以将“Num Branches”的值更改为 2 到 10。这个数字反过来反映在下面的可滚动框中创建的子表单的数量中。子表单都来自相同的,我用红色勾勒了它们。 我有几个关于如何做到这一点的问题

一个子表单可以有多个吗? 如果上面的问题是否定的,而且我必须动态创建每个控件,我是否需要关注这个答案https://***.com/a/31301469/7254514中提到的754个动态创建的控件限制? 谁能给我一个循环示例,演示如何在可滚动框内动态创建这些子窗体?我想在每个 for 循环中唯一会改变的属性是“top”属性。

【问题讨论】:

【参考方案1】:

您可能不想动态创建子窗体控件(因为创建控件 = 切换到设计视图,需要对数据库进行排他锁等)

您不能使用具有多个子表单实例的连续表单之类的东西,因为 Access 不允许对连续表单进行子表单控件。

我的方法是在表单上有 10 个(最多)子表单控件,将它们全部隐藏,然后动态地将它们分配给特定的源对象。

伪代码:

Dim numBranches As Long
Dim i As Long

For i = 1 to numBranches
   Me.Controls("subform" & i).Visible = True
   Me.Controls("subform" & i).Form.Filter = "branch = " & i 'Appropriate filter here
   Me.Controls("subform" & i).Form.FilterOn = True
Next i

【讨论】:

我喜欢这种方法,但让我看看我是否理解它。所以在我的主弹出窗体中,我将有 10 个隐藏的空子窗体控件。在您的伪代码中,这些将被命名为 subform1、subform2 等。然后,当弹出表单打开或 NumBranches 值更改时,我将填充这些空子表单。填充的设置为可见。子表单源对象中到底发生了什么?这会是我在设计视图中创建的静态表单吗? 啊,您多次显示同一个表单。我在想多种形式。在这种情况下,您不需要 .SourceObject 部分(通常是表单名称),但您可以使用过滤器。请注意,您可以清除所有表单的.SourceObject,并仅为您显示的表单设置它以优化性能。我已将答案调整为更合适的内容 好吧,酷。所以过滤器就像数据库中的一条记录,您希望该特定子表单控件表示? 是的,它只是一个 SQL WHERE 子句,减去 WHERE

以上是关于在 VBA Access 中动态填充其他子表单的子表单的主要内容,如果未能解决你的问题,请参考以下文章

Access VBA:未绑定的子窗体控件不可点击

Access 子表单中的字段名称填充了 vba 记录集

在子表单中搜索值 (vba Access 2013)

使用 VBA 在 Access 中重新查询子表

使用 Access VBA 使用循环填充 Word 表单

MS Access VBA - 在数据表子窗体中显示动态构建的 SQL 结果