【问题标题】:VBA dynamic array assigns only one dimensionVBA 动态数组只分配一维
【发布时间】:2016-09-04 17:00:01
【问题描述】:

我对动态数组有一些奇怪的行为。似乎 VBA 拒绝为变量赋值。代码如下:

Private Sub Report_Load()
    Dim db As Database
    Dim reportArray() As Variant
    Dim structre As Recordset
    Dim columns, rows, i As Integer

    'Open recordset
    Set db = CurrentDb
    Set structure = db.OpenRecordset("SELECT * FROM [tblstructure] ORDER BY [Rank]")

    'Change array size dynamically
    rows = structure.RecordCount
    columns = 4
    ReDim reportArray(rows, columns)

    'Populate array
    i = 0
    Do Until structure.EOF
        reportArray(i, 0) = structure![Name]
        i = i + 1
        structure.MoveNext
    Loop
End Sub 

当我打开报告时,我收到下标超出范围的错误。当我调试我的代码时,我可以看到循环中 i 的值为 2,所以我的数组必须小于那个值。当我将鼠标悬停在 rows 变量上时,我看到它的值为 1。所以确实我正在尝试访问超出范围的内容。但奇怪的是structure.RecordCount的值是23。 截图:

即使我使用这样的代码:

ReDim reportArray(structure.RecordCount, columns)

我得到一个大小为 (1, 4) 的数组。为什么 VBA 不将值 23 分配给变量“行”,或者为什么 ReDim 将正确的值分配给第二维,而不是第一维?

【问题讨论】:

  • 你应该学习DAO.Recordset的GetRows()方法。

标签: arrays vba ms-access


【解决方案1】:

阅读:https://support.microsoft.com/en-us/kb/105976

原因

对于记录集和快照,Microsoft Access 不 自动返回存在的记录数 记录集。相反,它返回访问的记录数。

分辨率

要确定记录集或快照中的确切记录数, 在检查 RecordCount 属性之前使用 MoveLast 方法。

状态

此行为是设计使然。

根据 microsoft ,RecordCount 返回访问的记录数,而不是总记录数。

所以,在你的情况下,这应该可以工作

 structure.MoveLast
 rows = structure.RecordCount
structure.MoveFirst

【讨论】:

    【解决方案2】:

    自从我使用 Access 以来已经有一段时间了,但我似乎记得 RecordCount 不能正常工作,除非您实际上已经枚举了整个结果集,首先执行structure.MoveLast 之类的操作(请记住执行structure.MoveFirst在循环之前)。当然,这需要一个能够双向移动的记录集。

    或者,您可以将 ReDim 放入循环中,每次只增加一。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-18
      • 1970-01-01
      • 2016-01-28
      • 2021-02-03
      • 2013-11-24
      • 2020-04-24
      • 1970-01-01
      相关资源
      最近更新 更多