可以通过 VBA 更改 MS Access 子表单字段吗?

Posted

技术标签:

【中文标题】可以通过 VBA 更改 MS Access 子表单字段吗?【英文标题】:Possible to change MS Access subform fields through VBA? 【发布时间】:2016-06-07 10:27:07 【问题描述】:

我可以找到很多示例,说明如何通过更改代码中的基础源查询并重新查询来返回子表单中的特定记录,但我正在努力使用相同的原则来更改返回的字段。

我有以下情况:

用于选择 5 个字段中的 1 个的组合框。子表单应该显示选定的字段以及几个静态字段,我们称它们为字段 6 和 7

因此,如果用户从下拉列表中选择字段 1,子表单应显示字段 1、6 和 7。如果他们选择字段 4,子表单应显示字段 4、6 和 7 等。

这是我尝试过的(除其他外):

通过向导以查询(选择字段1,字段6,字段7)为源设置子表单,在选择组合框后修改所述查询:

Set qd = CurrentDb.QueryDefs("myqueryname")
qd.SQL = "Select " & mycomboboxselection & ",field6,field7 from mytablename"
Form_mymainformname.mysubformname.Requery

如果我在更改后独立运行,查询本身会更新得很好,但是主表单中的子表单没有更改,当我从导航窗口单击子表单本身时,它似乎一直在寻找字段 1 作为它要求我输入一个参数值

谁能帮忙解决这个问题?

【问题讨论】:

【参考方案1】:

将子表单的RecordSource设置为SQL:

Dim SQL As String

SQL = "Select " & mycomboboxselection & ",field6,field7 from mytablename"
Me!YourSubformControl.Form.RecordSource = SQL

它将强制重新查询子表单。

【讨论】:

恐怕这不起作用,如果我选择使用初始源对象设置的字段就可以了,但是如果我选择任何其他字段,子表单中的字段名保持不变并且它只是用#name 填充字段中的所有记录? @HelloWorld 这是因为如果您将控件绑定到名为mycomboboxselection1 的字段并且您将查询更改为mycomboboxselection2,则第一个字段不再存在,因此控件不知道要显示什么,因此#Name?您也需要适当地更改控制源。 @Brad,这可能应该是一个独立的答案,如果我有正确的一端,则无需每次更新记录源即可将其更新为 .* 一次并更改通过该字段单独控制源的字段,即Me!MySubForm.Form!MyField.ControlSource = Me!MyComboBoxSelection。谢谢,很好用【参考方案2】:

好的,经过几个小时的搜索和反复试验,我找到了解决方案。

这里有两个单独的问题。首先创建子表单使用新创建的表单作为源对象而不是直接使用查询,并且似乎无论您如何尝试操作所述表单的记录源,它都不喜欢更改它构建的字段.

因此,创建子表单,将源对象从表单更改为您的查询(并删除现在毫无意义的新创建的表单),然后您可以使用我开始使用的代码:

Set qd = CurrentDb.QueryDefs("myqueryname")
qd.SQL = "Select " & mycomboboxselection & ",field6,field7 from mytablename"

哪个有效!有点……

您必须每次都关闭并重新打开表单才能看到实际的更新,这显然不是我们想要的

另一行什么都不做:

Form_mymainformname.mysubformname.Requery

它适用于更改记录,但显然不适用于更改字段。我怀疑这有点像微软的怪癖

然而,下面的代码行得通,尽管我觉得它应该与上面的代码行完全相同:

Form_MyForm.MySubForm.SourceObject = Form_MyForm.MySubForm.SourceObject

【讨论】:

如果您将字段名称与表单文本框名称分开,如下所示:SQL = "Select " & mycomboboxselection & " AS Text0, field6 AS Text1,field7 AS Text2 from mytablename。将您的来源更改为:SQL = "Select " & mycomboboxselection & ",field3 AS Text1,field4 AS Text2 from mytablename 将顺利进行,因为您不再绑定字段本身,而只是绑定它们的别名,因此您不必在重新查询时更改绑定

以上是关于可以通过 VBA 更改 MS Access 子表单字段吗?的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

什么可以阻止 MS Access 2000 表单关闭?

专家 - 表单打开方式不同于设计视图与 MS Access 对象列表

MS Access - 更改表单中的值后立即写入表