我有一个文件结构,其中重复的文件附加字母表的字母。例如,如果File.txt已存在,则创建File-A.txt。
我需要将某个名称的所有文件的列表加载到一个数组中并进行排序,使得Arr(25)是按字母顺序排列的最后一个文件名(IE Arr(25)= File-Z.txt)并且我有以下内容排序算法,但它始终按字母顺序排列,以便File.txt是数组中的最后一个元素。
If filepath <> "" Then
Do Until filepath = ""
myArray(i) = filepath
filepath = Dir
i = i + 1
Loop
End If
'Alphabetize
For x = LBound(myArray) To UBound(myArray)
For y = x To UBound(myArray)
If UCase(myArray(y)) < UCase(myArray(x)) Then
TempTxt1 = myArray(x)
TempTxt2 = myArray(y)
myArray(x) = TempTxt2
myArray(y) = TempTxt1
End If
Next y
Next x
如何防止这种情况?
答案 0 :(得分:0)
问题是您要比较整个文件名。 file.txt
在file-a.txt
之前排序的原因是因为它逐个字符地检查,并在第一个文件中找到高于第二个文件中相应ASCII值的ASCII值时立即退出。在这个特殊情况下,file.txt < file-a.txt
在比较位置5后立即返回False
,因为.
是ASCII 46而-
是ASCII 45。
假设您只关心.txt
个文件,解决方法是比较没有扩展名的文件。您可以使用Scripting.FileSystemObject
执行此操作(这样也可以更轻松地阅读目录)...
'Add a reference to Microsoft Scripting Runtime
With New Scripting.FileSystemObject
'Alphabetize
For x = LBound(myArray) To UBound(myArray)
For y = x To UBound(myArray)
If UCase$(.GetBaseName(myArray(y))) < UCase$(.GetBaseName(myArray(x))) Then
TempTxt1 = myArray(x)
TempTxt2 = myArray(y)
myArray(x) = TempTxt2
myArray(y) = TempTxt1
End If
Next y
Next x
End With
...或者您可以使用Left$
:
'Alphabetize
For x = LBound(myArray) To UBound(myArray)
For y = x To UBound(myArray)
If UCase$(Left$(myArray(y), Len(myArray(y)) - 4)) < _
UCase$(Left$(myArray(x), Len(myArray(x)) - 4)) Then
TempTxt1 = myArray(x)
TempTxt2 = myArray(y)
myArray(x) = TempTxt2
myArray(y) = TempTxt1
End If
Next y
Next x