2017-01-13 39 views
0

我有一個文件結構,其中重複的文件附加了字母表中的字母。例如,如果File.txt已存在,則會創建File-A.txt。訪問VBA按字母順序排列附加字母表的文件名

我需要加載一個特定名稱的所有文件列表到一個數組中,並排序使得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

問題是,你比較整個文件名file.txtfile-a.txt之前排序的原因是因爲它正逐字符地檢查並在第一個文件中發現一個高於第二個文件中相應ASCII值的ASCII值時立即退出。我這種特殊情況下,file.txt < file-a.txt只要它因爲.是ASCII 46 -是ASCII 45

假設你只關心.txt文件比較5位返回False,該解決方案是將文件進行比較,而不擴展。您可以使用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