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是的,我也注意到了,但用户似乎对该部分没有任何问题,所以我让它滑动。是的。不会导致任何错误,只是效率不高,仅此而已: