VB6 和 COM 混合使用基于 0 和 1 的索引(数组是基于 0 的,除非您使用 Option Base 更改它或以其他方式显式声明它们)。
COM 集合在早期的 COM 对象模型中通常是从 1 开始的,但有时是从 0 开始的......
Dim/Redim data(1 To N) 是从 1 到 N 索引的 N 个元素的数组
Dim/Redim data(0 to N-1) 是从 0 到 N-1 索引的 N 个元素的数组
Dim/Redim data(N) 是从 0 到 N 索引的 N+1 个元素的数组(如果 Option Base 为 0)
最后一种情况有时会令人困惑,data(N) 通常表示 data(0 To N),它是 N+1 个元素的数组。
就我个人而言,我总是将数组显式声明为 (0 To N-1) 并且不依赖 Option Base,这对于使用一种以上语言的开发人员来说更熟悉。
有一种极端情况:VBA 不支持零长度数组,您必须始终至少有一个元素(对于多维数组中的每个维度)。因此,您可以声明的最小数组是具有一个元素的 data(0 To 0) 或 data(1 To 1)。
在您的情况下,我怀疑您正在创建一个包含一个元素的数组,然后每次通过循环添加一个元素:
ReDim data(1 To 1)
While Cells(ndx, 1).Value <> vbNullString
ReDim Preserve data(1 To (UBound(data) + 1))
ndx = ndx + 1
Wend
相反(暂时不考虑在循环中调用 ReDim Preserve 的效率),您应该使用:
ReDim data(1 To 1)
nStartIndex = ndx
While Cells(ndx, 1).Value <> vbNullString
' On the first iteration this does nothing because
' the array already has one element
ReDim Preserve data(1 To ndx - nStartIndex + 1)
ndx = ndx + 1
Wend