【发布时间】:2021-10-21 14:19:59
【问题描述】:
这是我之前的question 的后续行动,虽然我设法完成了我的想法(仍在争论我是否选择了最好的方法),但我现在有一个关于为我的文本框动态设置控制源。
当我使用 VBA 代码设置控件源时,我会收到 #Name? 错误,除非我将表添加到表单的记录源中。问题是,我正在处理大量数据并将我的所有表添加到记录源将导致“定义的字段过多”错误。
我使用下面的代码来设置控制源:
Set rst = db.OpenRecordset("feedersTBL", dbOpenDynaset)
rst.MoveFirst
Do While Not rst.EOF
If Me!subID = rst!stationID Then
i = i + 1
Me.Controls("Feeder" & i).Visible = True
Set rst2 = db.OpenRecordset("feedersLoadingTBL", dbOpenDynaset)
'Binding the textboxes.
For Each fld In rst2.Fields
If fld.Name = rst!feederId Then
Me.Controls("Feeder" & i).ControlSource = rst!feederId
Debug.Print Me.Controls("Feeder" & i).ControlSource
Exit For
End If
Next
rst.MoveNext
Loop
请注意,feedersLoadingTBL 表有 400 多列,我已将它们分成 4 个表。
我感谢我能得到的所有帮助。如果有人想尝试一下,这是我的访问文件(名称为波斯语)。
Google Drive link to the Access file
编辑:
我现在按照@June7 的建议使用 DLookUp 函数。它适用于静态字段(如日期),但我似乎无法让代码适用于动态字段。这是新代码:
[code and stuff]
⋮
Me.Controls("Feeder" & i).ControlSource = "=DLookup(""[fld.Name]"", ""[feedersLoadingTBL]"", ""[time] =1"")"
⋮
[code and stuff]
""[fld.Name]"" 是将在循环中更改的部分。这是 feedersLoadingTBL 表的样子:
【问题讨论】:
-
当然表格必须在表格记录源中才能将文本框绑定到字段。也许您应该考虑域聚合 DLookup 函数。
-
这里真正的问题是表中的字段数量 - 这不是唯一一次您必须更加努力地工作才能让事情正常工作。最好的办法是离开并重新设计数据库架构,以便正确规范化数据。
-
@June7 感谢 cmets。似乎可以将文本框绑定到不在记录源中的表。我使用 DLookUp 函数进行了尝试,并且成功了。我仍然需要帮助,请检查我的编辑。
-
那不绑定到字段。它正在使用表达式设置未绑定的文本框。 VBA 不是必需的。可以将 DLookup 表达式直接放在每个 ControlSource 属性中。
Date是保留字,建议不要使用保留字作为名称。 -
可能想在允许附加文件的论坛上发帖。 SO 礼仪要求所有数据来分析要包含在帖子中的问题。可以使用指向 SQLFiddle 的链接来演示查询。不鼓励使用图像。这里很少有人会从文件共享站点下载文件。无论如何,您的 Google 云端硬盘链接都需要登录,因此您的数据库甚至无法真正供审核。
标签: vba ms-access ms-access-2013 data-entry