通过文件夹代码循环下标超出范围
我正在尝试通过以下代码循环访问该文件夹。 但是,我不断收到下标超出范围的错误。 任何人都可以解释我能做些什么来解决这个问题?
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时,它看起来完全符合你所期望的 – 但是一旦它有了,就不可能重新设置一个数组已被上下限声明。