VBA - 在sub中调用Dir()时使用Dir()循环

时间:2017-07-31 16:03:13

标签: excel vba excel-vba file directory

我正在使用:

循环浏览文件夹
Dim file As Variant
file = Dir(myFolder)

While (file <> "" )
    mySub file       '<= this sub use Dir() hundreds of times  !!!
    file = Dir()
Wend

mySub会中断Dir loop,因为它会为我提供不同文件夹的下一个文件。

是否有一种解决此限制的简单方法?如果没有,您将如何处理?

当前解决方案

我目前正在使用运行第一个循环来存储Array中的文件名,然后运行第二个循环来处理来自Array的mySub:

Dim file As Variant
file = Dir(myFolder)

Dim myArray() as String
Redim myArray(0)

While (file <> "" )
    Redim Preserve myArray(Ubound(myArray) + 1)
    myArray(Ubound(myArray)) = file
    file = Dir()
Wend

Dim n as Integer
For n = 1 to Ubound(myArray)
    mySub myArray(n)
Next

1 个答案:

答案 0 :(得分:1)

函数Dir使用静态迭代器。因此,如果您在子函数中调用它,它将从main函数初始化它。

要在子函数中再次使用Dir,您需要在调用子函数之前使用main函数的所有结果,这是您当前的解决方案。

但是,调用Redim Preserve附加新项目的效率相当低。 而是定义数组的初始大小,并在需要时将大小增加2:

Dim file As String, n As Long, i As Long
ReDim myArray(0 To 25)

file = Dir("c:\")

Do While Len(file)
  If n = UBound(myArray) Then ReDim Preserve myArray(n * 2)
  myArray(n) = file
  n = n + 1
  file = Dir()
Loop

For i = 0 To n - 1
  mySub myArray(i)
Next

请注意,您还可以使用Scripting.FileSystemObject的实例,但它的效率低于Dir(),并且仅适用于Windows。