1

我正在尝试使用以下代码遍历文件夹。但是,我不断收到下标超出范围错误。谁能解释我能做些什么来解决这个问题?

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
4

3 回答 3

4

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

于 2013-04-18T04:12:07.267 回答
0

首先,正如@TheGreatCo 所提到的,您只能重新调整数组的最后一个维度。

ReDim Preserve ArrayData(y, 12)正在抛出错误,因为您正在尝试重新调整第一个维度。

尝试更改为:

ReDim Preserve ArrayData(12,y)

为了限制i,改变你说Loop的那句话:

Loop While i <=12

然而,这似乎仍然是矫枉过正。虽然它可能不会给你带来任何错误,但它肯定是低效的。您不需要y列(2030 列!!!),因为您从未分配任何内容,例如,ArrayData(12,1955)。

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

我会建议:

ReDim Preserve ArrayData(12,y-2009)

然后,您将需要更改:

ArrayData(i,y) = FileRoot
MsgBox ArrayData(i,y-2009)
于 2013-04-18T04:12:09.813 回答
0

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

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

并且不要进行任何重新尺寸调整。

但这并不能真正解决问题,因为您的值i实际上是无限增长的值,并且您ReDim从不考虑更改i维度(始终为 12)。

根据您想要做什么,您可以考虑使用“集合”。使用集合,您可以指定任何字符串作为索引;CStr(y)&"-"&CStr(i)因此您可以使用...进行索引

或者,声明具有初始维度 (2,12) 的 Variant 类型的数组。当您找到文件根时,将相应的年份分配给 (1,i) 并将文件根分配给 (2,i)。现在您有一个不包含大量空元素的数组(高效),可以重新调整维度(沿第二维),并捕获原始数据的所有数据。实际上,您已经创建了自己的“稀疏数组”。

还有一个:

与我在上面的评论中提到的相反,当我尝试在ToExcel VBA 中使用构造然后检查变量时,它似乎完全符合您的预期 - 但是一旦数组被重新调整是不可能的用上限和下限声明。

于 2013-04-18T06:22:31.063 回答