我对动态数组有一些奇怪的行为。看起来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将正确的值分配给第二维,而不是第一维?
答案 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