【问题标题】:Access VBA Subscript out of range loading DAO.Recordset访问 VBA 下标超出范围加载 DAO.Recordset
【发布时间】:2020-05-25 17:08:44
【问题描述】:

当我尝试从 Access 查询中加载和使用记录集时,我看到不一致的结果并得到下标超出范围错误。我正在从这个查询中加载: record source

这是我的代码的相关部分:

Option Compare Database
Option Explicit

Function StoreStockoutEmail()
Dim objOutlook As Outlook.Application
   Dim objOutlookMsg As Outlook.MailItem
   Dim objOutlookRecip As Outlook.Recipient
   Dim dtStr As String
   Dim rstData    As DAO.Recordset
   Dim v  As Variant
   Dim i, j, k, x, y As Integer
   Dim mymsg As String

   mymsg = ""

    Set rstData = CurrentDb.OpenRecordset("Select * From Store_Stockouts")
    v = rstData.GetRows(rstData.RecordCount)
    If Not rstData.EOF And Not rstData.BOF Then
    rstData.MoveLast
    i = rstData.RecordCount
    rstData.MoveFirst


    MsgBox (v(0, 2))
   ...

MsgBox 是我得到运行时错误 9“下标超出范围”的地方,但我的数据源的数据点位于 0,2(和 2,0)。 (我根据另一个答案添加了 EOF 和 BOF 运动,但没有帮助。)我觉得这可能是一个错误,因为这对某些记录集有效,而对其他记录集无效。适用于 Micosoft 365 32 位的 MS Access。为 MS DAO 3.6 对象库添加了参考。谢谢!

【问题讨论】:

  • CurrentDb 来自哪里?这段代码中没有定义,我想知道它是否被正确回收。
  • 在运行 GetRows 之前尝试 Debug.Print rstData.RecordCount - 输出是什么?

标签: vba ms-access dao


【解决方案1】:

正如蒂姆·威廉姆斯暗示的那样,rstData.RecordCount 可能不正确,直到你跳了.MoveLast / .MoveFirst 舞。 (见注2)

rstData.EOF 的检查应直接跟随.OpenRecordset。在这里检查.BOF 是不必要的(货物崇拜)。

所以代码应该是:

Set rstData = CurrentDb.OpenRecordset("Select * From Store_Stockouts")
If Not rstData.EOF Then
    rstData.MoveLast
    i = rstData.RecordCount
    rstData.MoveFirst

    v = rstData.GetRows(i)

旁注:

   Dim i, j, k, x, y As Integer

这将所有内容声明为 Variant,只有 y 将是 Integer。


注2:

我觉得这可能是一个错误,因为这对某些记录集有效,而对其他记录集无效。

这是设计使然。 Allen Browne 在 4. 中对此进行了解释:http://allenbrowne.com/ser-29.html

对于基于查询、SQL 语句和附加表的记录集,RecordCount 属性返回到目前为止访问的记录数。当您第一次使用 OpenRecordset() 时,Access 会抓取第一条记录,并在其他代码加载时继续处理您的代码。
因此,如果您在 OpenRecordset 之后立即测试 RecordCount,您通常会得到 0(如果没有记录)或 1(如果有,无论加载多少)。
这不适用于 dbOpenTable 类型的记录集(本地表的默认值)。

解决方案:

如果您需要知道 RecordCount,请先使用 MoveLast 方法。这会强制 Access 在加载所有记录时等待,因此 RecordCount 反映了整个记录集。

【讨论】:

  • 如果答案解决了您的问题,您可以accept它,这也标志着问题已解决。 @SandySmyth
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多