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

Posted

技术标签:

【中文标题】Access VBA:更改子表单的记录源【英文标题】:Access VBA: Changing record source of subform 【发布时间】:2015-06-15 18:15:57 【问题描述】:

我有一个带有子表单的表单,我希望填充子表单的子表单记录源根据主表单中某些组合框上的输入进行更改。

使用 VBA,我构建了一个函数,该函数生成我想要填充子表单的 SQL 语句。我知道这是可行的,因为我已经用 msgbox 对其进行了测试,它给了我想要的 SQL 语句。 sql 语句使用聚合函数,因此结果表的结构与其查询的表不同。

我用来更改子表单记录源的代码是:

me![subformname subform].form.recordsource=myfunction()

这在过去对我有用,但在这里不起作用,我只是得到“#Name?”在我的表格的子表格中。

当我单独打开子表单时,我得到“#Name?”但是当我打开记录源并从记录源运行查询时,我得到了一个值,所以我很困惑。

有什么想法吗?

【问题讨论】:

您的新RecordSource 是否包含您的子表单所需的所有字段?例如,如果您有一个Textbox 和一个ControlSourceStreet_Address,那么您的新RecordSource 中是否有一列显示Street_Address 你试过了吗:Forms!frmMyMainFormName.frmMySubName.Form.RecordSource = myfunction() 我认为我的问题是我在更改记录源时试图更改子表单的结构。我最初有两列,位置和人口,在我更改 Recourd 源后,我有一个聚合函数,可以对我想要的位置的人口进行求和,因此新表只有“位置中的人数”列 所以您的RecordSource 缺少所需的ControlSource 确保您的查询返回要在子表单文本框中使用的相同名称的字段——并且您拥有正确数量的字段。如果旧的 RS 生成了位置和计数列表,那么只要您保留位置和“计数”字段,聚合就可以了。 【参考方案1】:

尝试设置两个子表单 - 一个用于您需要的每种格式 - 当您交换基础记录集时,也会交换或隐藏/取消隐藏相关的子表单。然后可以将相关控件的控件源设置为当前记录集中实际可用的字段。

【讨论】:

【参考方案2】:

我通过更改要更改的子表单的结构来使其工作,以便在更改记录源时结构保持不变。教训是,您可以在 VBA 中更改记录源,但不能更改子表单的结构。

【讨论】:

【参考方案3】:

我的问题发生是因为我在子表单记录源SELECT 查询中使用了别名。当我用 VBA 代码中的实际数据库表名替换别名表名时,.recordsource = strSQL01 语句起作用并且数据出现在我的子表单中。

【讨论】:

以上是关于Access VBA:更改子表单的记录源的主要内容,如果未能解决你的问题,请参考以下文章

vba access 2010更新过滤子表单

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

从 Access 中的另一个子窗体更改子窗体的记录源

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

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

在按钮单击 MS Access 2013 VBA 在子窗体中创建新记录