Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 通过文件夹代码循环的下标超出范围_Excel_Vba - Fatal编程技术网

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

Excel 通过文件夹代码循环的下标超出范围,excel,vba,Excel,Vba,我正试图用下面的代码在文件夹中循环。然而,我不断得到下标超出范围的错误。有人能解释一下我能做些什么来解决这个问题吗 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

我正试图用下面的代码在文件夹中循环。然而,我不断得到下标超出范围的错误。有人能解释一下我能做些什么来解决这个问题吗

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 ArrayDatay中的12,12。更改数组参数的顺序将解决此问题。

根据此msdn,您只能在数组的最后一个维度上进行ReDim Preserve,在您的情况下,您只能在ReDim Preserve ARRARYDATAY中更改12。更改数组参数的顺序将解决此问题。

首先,正如@TheGreatCo提到的,您只能重新定义数组的最后一个维度


ReDim Preserve ArrayDatay,12正在抛出错误,因为您正在尝试重新dim第一个维度

尝试更改为:

雷迪姆保留阵列数据12,y

为了限制我,把你的循环线改成:


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


ReDim Preserve ArrayDatay,12正在抛出错误,因为您正在尝试重新dim第一个维度

尝试更改为:

雷迪姆保留阵列数据12,y

为了限制我,把你的循环线改成:


当i时循环既然你知道y的最大值是什么,为什么要使用ReDim呢?这是非常低效的,因为它涉及到在没有额外的连续空间可用时重新定位所有数据,以及复制内容。相反,你应该这样做

ArrayData(2009 To 2030, 1 To 12) As Variant
不要做任何重新测量

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

取决于你想做什么,你可以考虑使用一个集合。对于集合,您可以指定任何字符串作为索引;因此,您可以使用CStry&&CStri索引

或者,声明初始维度为2,12的类型Variant的数组。找到文件根目录后,将相应的年份指定为1,i,并将文件根目录指定为2,i。现在您有了一个数组,它不包含大量的空元素,可以沿第二维度重新标注维度,并捕获原始元素的所有数据。实际上,您已经创建了自己的稀疏数组

还有一点:


与我在上面的评论中提到的相反,当我尝试在Excel VBA中使用来构造iin,然后检查变量时,它似乎完全符合您的预期-但一旦声明了数组的上限和下限,就不可能对其进行重新定义。

因为您知道y的最大值将是什么,为什么要使用ReDim呢?这是非常低效的,因为它涉及到在没有额外的连续空间可用时重新定位所有数据,以及复制内容。相反,你应该这样做

ArrayData(2009 To 2030, 1 To 12) As Variant
不要做任何重新测量

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

取决于你想做什么,你可以考虑使用一个集合。对于集合,您可以指定任何字符串作为索引;因此,您可以使用CStry&&CStri索引

或者,声明初始维度为2,12的类型Variant的数组。找到文件根目录后,将相应的年份指定为1,i,并将文件根目录指定为2,i。现在您有了一个数组,它不包含大量的空元素,可以沿第二维度重新标注维度,并捕获原始元素的所有数据。实际上,您已经创建了自己的稀疏数组

还有一点:


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

哪一行将索引抛出范围之外?如果让我猜是你将ArrayData调暗到y,12,但你从未将I加上限并阻止它超过12。ReDim Preserve ArrayData,12将其抛出范围之外。对不起,我该如何限制I?For循环中的第一行是抛出IOR?根据msdn,您只能在数组的最后一个维度上进行ReDim Preserve,在您的情况下,您只能更改ReDim Preserve ArrayDatay中的12,12Hmm,我想现在的解决方案是将y,12的顺序更改为12,y。让我试一试。是哪条线把指数抛到了范围之外?如果让我猜是你将ArrayData调暗到y,12,但你从未将I加上限并阻止它超过12。ReDim Preserve ArrayData,12将其抛出范围之外。对不起,我该怎么说呢?第一行
在For循环内部是否抛出IOR?根据msdn,您只能在数组的最后一个维度上保留ReDim,在您的情况下,您只能更改ReDim Preserve ArrayDatay中的12,12Hmm,我想现在的解决方案是将y,12的顺序更改为12,y。让我试一试。+1是解决眼前问题的好参考。我还注意到数组的尺寸过大,即从2009年的上限开始,那时没有数据分配给2008、2007、1955等。@DavidZemens是的,我也注意到了,但用户似乎对该部分没有任何问题,所以我让它滑动。是的。不会导致任何错误,只是效率不高,仅此而已:+1作为当前问题的参考。我还注意到数组的尺寸过大,即从2009年的上限开始,那时没有数据分配给2008、2007、1955等。@DavidZemens是的,我也注意到了,但用户似乎对该部分没有任何问题,所以我让它滑动。是的。不会导致任何错误,只是效率不高,仅此而已: