【问题标题】:MS Access #Name? error on textbox with dynamically set control sourceMS Access #Name?动态设置控制源的文本框错误
【发布时间】: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 表的样子:

feedersLoadingTBL

【问题讨论】:

  • 当然表格必须在表格记录源中才能将文本框绑定到字段。也许您应该考虑域聚合 DLookup 函数。
  • 这里真正的问题是表中的字段数量 - 这不是唯一一次您必须更加努力地工作才能让事情正常工作。最好的办法是离开并重新设计数据库架构,以便正确规范化数据。
  • @June7 感谢 cmets。似乎可以将文本框绑定到不在记录源中的表。我使用 DLookUp 函数进行了尝试,并且成功了。我仍然需要帮助,请检查我的编辑。
  • 那不绑定到字段。它正在使用表达式设置未绑定的文本框。 VBA 不是必需的。可以将 DLookup 表达式直接放在每个 ControlSource 属性中。 Date 是保留字,建议不要使用保留字作为名称。
  • 可能想在允许附加文件的论坛上发帖。 SO 礼仪要求所有数据来分析要包含在帖子中的问题。可以使用指向 SQLFiddle 的链接来演示查询。不鼓励使用图像。这里很少有人会从文件共享站点下载文件。无论如何,您的 Google 云端硬盘链接都需要登录,因此您的数据库甚至无法真正供审核。

标签: vba ms-access ms-access-2013 data-entry


【解决方案1】:

不要将动态引用放在引号内 - 连接。可以使用撇号代替双引号。

Me.Controls("Feeder" & i).ControlSource = "=DLookup('" & fld.Name & "', '[feedersLoadingTBL]', '[time] =1')"

【讨论】:

  • 该代码返回 2465 错误,我稍作更改:从 '" & [fld.Name] & "''[" & fld.Name & "]' 现在文本框中显示了正确的数据,但无法编辑,因为它已绑定到表达。我不知道现在该怎么办。
  • 是的,我应该删除括号,编辑答案。如果字段名称包含空格或特殊字符,则在修改时需要括号,但包含肯定不会有什么坏处。带有表达式的未绑定控件永远不可编辑。如果用一个值设置未绑定控件,则每条记录将在连续或数据表表单上显示相同的值。你真正想要完成什么?表单应该用于单个表的数据输入/编辑。也许您应该使用表单/子表单排列。
  • 谢谢。我在上一篇中给出了一些解释。问题(链接)。基本上,我希望用户能够使用键盘上的左右箭头键(已经工作)通过每个变电站(其中有 50 个)并手动输入数据。然后将数据存储在用于报告/图表/等的表格中。我已经向我的同事保证,这将像他目前使用的 Excel 文件一样易于使用。子窗体的记录源可以独立于主窗体更改吗?我觉得我需要重新思考我设计数据库的方式。
  • 是的,代码可以更改子表单 RecordSource。在设计关系数据库时,忘记关于 Excel 的一切。我确实看过你的数据库。似乎与transTBL、feedersTBL、stationTBL有循环关系。
  • 关系数据库中的数据输入通常不会复制纸质表格或电子表格。如果您真的必须使用这 4 个表格的“电子表格”条目,那么最少的编码方法是构建 4 个表格用作子表格。也许还可以使用导航表单来加载它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-04
  • 1970-01-01
  • 2020-03-28
  • 1970-01-01
  • 2018-12-27
  • 2014-02-02
  • 2014-09-07
相关资源
最近更新 更多