访问VBA按字母顺序排序附加字母表字母的文件名

时间:2017-01-13 22:22:19

标签: arrays vba sorting

我有一个文件结构,其中重复的文件附加字母表的字母。例如,如果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

如何防止这种情况?

1 个答案:

答案 0 :(得分:0)

问题是您要比较整个文件名file.txtfile-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