我正在尝试清理一些现有代码
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 algorithm和returns 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
答案 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
我希望它很清楚。