Dir()是否对退回的文件的顺序做出任何保证?

时间:2010-11-26 06:18:31

标签: excel vba

我正在尝试清理一些现有代码

Sheets("Control").Select
MyDir = Cells(2, 1)
CopySheet = Cells(6, 2)
MyFileName = Dir(MyDir & "wp*.xls")

' when the loop breaks, we know that any subsequent call to Dir implies
' that the file need to be added to the list
While MyFileName <> LastFileName
    MyFileName = Dir
Wend

MyFileName = Dir

While MyFileName <> ""
    Cells(LastRow + 1, 1) = MyFileName
    LastRow = LastRow + 1
    MyFileName = Dir
Wend

我的问题涉及Dir如何返回结果以及结果顺序是否有任何保证。在上面的循环中使用Dir时,代码意味着对Dir的结果调用按名称排序。

除非Dir保证这一点,否则这是一个需要修复的错误。问题是,Dir()是否对返回文件的顺序做出了任何保证,还是隐含的?

解决方案

根据@ Frederic的回答,这是我提出的解决方案。

结合使用此quicksort algorithmreturns all files in a folder ...

的函数
Dim allFiles As Variant
allFiles = GetFileList(MyDir & "wp*.xls")
If IsArray(allFiles) Then
    Call QuickSort(allFiles, LBound(allFiles), UBound(allFiles))
End If

Dim x As Integer
Dim lstFile As String
x = 1

' still need to loop through results to get lastFile
While lstFile <> LastFileName 
    lstFile = allFiles(x)
    x = x + 1
Wend

For i = x To UBound(allFiles)
    MyFileName = allFiles(i)
    Cells(LastRow + 1, 1) = MyFileName
    LastRow = LastRow + 1
Next i

2 个答案:

答案 0 :(得分:8)

无法保证Dir()将以任何特定顺序返回文件。 MS Access VBA documentation甚至说:

  

提示因为文件名是   你没有特别的顺序检索   可能想存储返回的文件名   在array中,然后   对数组进行排序。

答案 1 :(得分:0)

我知道这篇文章很旧,但我分享了我为那些也在寻找简短解决方案的人找到的解决方案。

我将所有文件名写在 Excel 工作表列中,并使用一个变量来获取文件名。然后我运行一个循环,根据变量检索到的名称,按照它们在列中写入的顺序打开每个文件。

For Row_Value = 1 To 10 
    NameFile= Range("N" & Row_Value).Value 'NameFile = "Worbook1"
    MyFile = Dir("C\Desktop\Folder1\" & NameFile & ".xlsm")
Next Row_Value 

我希望它很清楚。