通过文件夹代码循环下标超出范围

我正在尝试通过以下代码循环访问该文件夹。 但是,我不断收到下标超出范围的错误。 任何人都可以解释我能做些什么来解决这个问题?

Sub LoopThroughFolder() Const FileSpec As String = "*.xls" Dim y As Integer Dim MyFolder As String Dim MyFile As String Dim iDot As Integer Dim FileRoot As String Dim FileExt As String Dim ArrayData() As Variant For y = 2009 To 2030 ReDim Preserve ArrayData(y, 12) MyFolder = ActiveWorkbook.Path & "\" & y & "\" i = 1 MyFile = Dir(MyFolder & FileSpec) Do While Len(MyFile) > 0 iDot = InStrRev(MyFile, ".") If iDot = 0 Then FileRoot = MyFile FileExt = "" Else FileRoot = Left(MyFile, iDot - 1) FileExt = Mid(MyFile, iDot - 1) End If MyFile = Dir ArrayData(y, i) = FileRoot MsgBox ArrayData(y, i) i = i + 1 Loop Next y End Sub 

根据这个msdn 链接 ,你只能在数组的最后一个维上使用ReDim Preserve ,在你的情况下,你只能改变ReDim Preserve ArrayData(y, 12) 。 更改数组参数的顺序将解决此问题。

首先,正如@TheGreatCo提到的那样,你只能修改数组的最后一个维度。

ReDim Preserve ArrayData(y, 12)正在抛出错误,因为您正试图重新初始化第一个维度。

尝试更改为:

ReDim Preserve ArrayData(12,y)

而限制i ,改变你说的Loop说:

Loop While i <=12

但是,这似乎仍然是矫枉过正的。 尽pipe这不会造成任何错误,但这当然是无效的。 你不需要y列(2030列!!!),因为你永远不会分配任何东西,例如ArrayData(12,1955)。

您需要修改迭代项目的方式并更有效地分配给数组。

我会build议:

ReDim Preserve ArrayData(12,y-2009)

您将需要更改:

 ArrayData(i,y) = FileRoot MsgBox ArrayData(i,y-2009) 

既然你知道y的最大价值是什么,为什么要使用ReDim呢? 这是非常低效的,因为如果没有额外的(连续的)可用空间,以及复制内容,它涉及重定位所有的数据。 相反,做

 ArrayData(2009 To 2030, 1 To 12) As Variant 

不要做任何重新调整。

这并不能真正解决问题 ,因为你的i值实际上是无限增长的值,你的ReDim从不考虑改变i维(它总是12)。

根据你想要做什么,你可以考虑使用“收集”。 使用集合,您可以指定任何string作为索引; 因此你可以用CStr(y)&"-"&CStr(i)来索引…

或者,用初始维数(2,12)声明Varianttypes的数组。 find文件根目录时,将相应的年份分配给(1,i),并将文件根目录分配给(2,i)。 现在你有一个不包含大量空元素的数组(高效),可以重新定义(第二维),并捕获原始数据。 实际上你已经创build了你自己的“稀疏数组”。

另外一个:

与我在上面的评论中提到的相反,当我尝试使用To构build在Excel VBA中,然后检查这个variables时,它看起来完全符合你所期望的 – 但是一旦它有了,就不可能重新设置一个数组已被上下限声明。