【问题标题】:Why do I get Run-time Error 91 in this MS Access code?为什么我在这个 MS Access 代码中得到运行时错误 91?
【发布时间】:2012-08-30 21:04:51
【问题描述】:

所以,我有一个 MS Access 数据库应用程序。在这个应用程序中是一个主窗体,其中包含许多子窗体。特别是一个表单有一个下拉框,我用数据库查询中的日期填充它。选择其中一个日期时,我运行一个子例程,该子例程应该使用历史信息更新子表单上的记录集。下面是一些经过编辑的代码(只是从查询中删除了大量字段)

Private Sub pickdate_AfterUpdate()
'''''''''''''''''''''''''''''''''''''''''
'   Add review history by selected date
'''''''''''''''''''''''''''''''''''''''''
Dim rs As Recordset
Set rs = CurrentDb.OpenRecordset("SELECT model, entered_date FROM history WHERE entered_date=#" & Me.pickdate.value & "# ORDER BY model DESC", dbOpenDynaset, dbSeeChanges)

If rs.BOF = False Then rs.MoveFirst
While rs.EOF = False

    Forms!main!histories.Form.Recordset.AddNew
    Forms!main!histories.Form.Recordset![model] = rs![model]
    Forms!main!histories.Form.Recordset![entered_date] = rs![entered_date]
    Forms!main!histories.Form.Recordset.Update

    rs.MoveNext
Wend
End Sub

我在Forms!main!histories.Form.Recordset.AddNew 行收到错误。

我已经尝试过该行的以下版本:

Forms!main!histories.Form.Recordset.AddNew
main!histories.Form.Recordset.AddNew
histories.Form.Recordset.AddNew
Me.Form.Recordset.AddNew
Me.Recordset.AddNew
Me.AddNew
Me.main!histories.Form.Recordset.AddNew
Me!histories.Form.Recordset.Addnew
Me!main!histories.Form.Recordset.AddNew

我实在是束手无策,试图找出问题出在哪里。 该子表单具有存储信息的所有适当框。我给了他们标签以匹配他们将进入他们的数据库列。我尝试将它们的控制源设置为数据库列名,而不是将它们设置为任何内容。我查找了一百种不同的“解决方案”,似乎没有一个适合问题或工作。

我觉得我忽略了一些非常容易的事情。

【问题讨论】:

  • 为什么不只是运行附加查询?为什么要遍历记录集?
  • 我同意@Remou-将行添加到基础数据集,而不是通过表单
  • 我对 Access 和 VBA 编程非常陌生。这个项目实际上是我必须维护和添加功能的旧代码。应用程序的其余部分使用记录集遍历几乎所有内容。我不知道如何进行追加查询。
  • 支持表单的记录集必须是正确的类型;它应该是 DynaSet,而不是 ForwardOnly 或 Snapshot。错误 91 是“未设置对象变量”。
  • 表单需要是可写的,并且具有添加新记录的能力。表单属性中的 CanWrite、CanRead、CanAdd 等标志是否都设置为 Yes?

标签: vba ms-access


【解决方案1】:

我认为你的名字有问题。检查所有这些。不要忘记子表单由两部分组成,子表单控件和包含的表单。这些通常具有相同的名称,但并非总是如此。在您使用的代码中,您必须具有子窗体控件的名称,而不是包含的窗体。如果手动向子表单输入数据无法正常工作,则说明您的控件未绑定。

这适用于我的示例表。

Dim rs As Recordset
Set rs = CurrentDb.OpenRecordset("SELECT atext from table1 WHERE akey=21")

If rs.BOF = False Then rs.MoveFirst
While Not rs.EOF '= False
    Me.Table1_subform1.Form.Recordset.AddNew
    Me.Table1_subform1.Form.Recordset!AText = rs!AText
    Me.Table1_subform1.Form.Recordset.Update

    rs.MoveNext
Wend

要运行查询,您可以说:

sSQL="INSERT INTO NameOfTable (model, entered_date) " _
& "SELECT model, entered_date FROM history WHERE entered_date=#" _
& Me.pickdate.value & "#"

CurrentDB.execute, dbfailOnError

您可以在查询设计窗口中检查 sql 的工作情况。

【讨论】:

  • 是的,这可能就是问题所在。你能重现错误 91 吗?
  • 不,但我没有那么努力:)
  • @Remou:感谢您的帮助。在更改所有内容的名称并重写所有查询后,我仍然遇到问题。直到我在子表单的属性表上打开“获取默认值”。我认为你的想法和改变的结合最终解决了它。
  • 很高兴您解决了这个问题。如果您有获取默认值,那么您似乎正在使用 ADP。如果是这样的话,如果您有任何其他问题,那将是值得一提的。
猜你喜欢
  • 2020-11-11
  • 1970-01-01
  • 1970-01-01
  • 2019-02-14
  • 2019-10-08
  • 1970-01-01
  • 2016-11-25
  • 2017-09-18
  • 1970-01-01
相关资源
最近更新 更多