VBA动态数组仅分配一个维度

时间:2016-09-04 17:00:01

标签: arrays vba ms-access

我对动态数组有一些奇怪的行为。看起来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。 截图: enter image description here

即使我使用这样的代码:

ReDim reportArray(structure.RecordCount, columns)

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

2 个答案:

答案 0 :(得分:2)

自从我使用Access以来已经有一段时间了,但我似乎记得RecordCount无法正常工作,除非您实际上枚举了整个结果集,例如{{{ 1}}首先(只记得在循环之前做structure.MoveLast)。当然,这需要能够在两个方向上移动的记录集。

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

答案 1 :(得分:2)

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

<强>原因

  

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

解决

  

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

状态

  

此行为是设计使然。

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

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

 structure.MoveLast
 rows = structure.RecordCount
structure.MoveFirst