2011-12-31 67 views
4

PixPath是jpg文件夾的完整路徑,我使用類似以下的代碼來處理每個jpg。使用Dir按文件系統順序從文件夾中返回文件

fileName = Dir(PixPath) 
Do Until fileName = "" 
    If Right$(fileName, 4) = ".jpg" Then 
     fileName = Dir() 

     <process this jpg> 

    End If 
Loop 

這工作正常,除了文件返回字母數字順序,而不是文件在文件夾中列出的順序。有沒有辦法解決?

+0

你的文件如何顯示在文件夾中列出(按修改日期等)? – brettdj 2012-01-01 02:56:41

+0

文件名全部由一個數字組成,例如「1」,「2」等,所以文件將是「1.jpg」等,並且數字可以在每個文件夾中無限制地上升。這些文件在Windows資源管理器中按照「1.jpg」,「2.jpg」,「3.jpg」等排序,這是所需的順序,但是Dir返回「1.jpg」,「10.jpg」等。 – Roy 2012-01-01 03:52:13

+0

I過去通過命名帶有前導零的文件來解決這個問題。 – EFH 2014-08-20 17:14:06

回答

4

你不能用Dir來做到這一點。

另一種方法是:

  • 使用FileSystemObject訪問所有文件在目錄
  • 閱讀中的所有.jpg文件到一個數組X
  • 使用Val比較.jpg小號按值按數字升序排序
  • 最終陣列X包含排序文件

    Sub Test() 
    Dim objFSO As Object 
    Dim objFolder As Object 
    Dim objFiles As Object 
    Dim objFile As Object 
    Dim X 
    Dim lngFileCnt As Long 
    Dim lngCnt As Long 
    Dim i As Long 
    Dim j As Long 
    Dim strBuffer1 As String 
    Dim strFolder As String 
    
    Set objFSO = CreateObject("Scripting.fileSystemObject") 
    strFolder = "C:\temp" 
    Set objFolder = objFSO.getFolder(strFolder) 
    Set objFiles = objFolder.Files 
    lngFileCnt = objFiles.Count 
    ReDim X(1 To lngFileCnt) 
    
    'grab all jpg files   
    For Each objFile In objFiles 
        If Right$(objFile.Name, 3) = "jpg" Then 
         lngCnt = lngCnt + 1 
         X(lngCnt) = objFile.Name 
        End If 
    Next 
    
    'resize array to number of jpg files 
    ReDim Preserve X(1 To lngCnt) 
    
    'sort array by numeric value 
    For i = 1 To lngCnt 
        For j = (i + 1) To lngCnt 
         If Val(X(i)) > Val(X(j)) Then 
          strBuffer1 = X(j) 
          X(j) = X(i) 
          X(i) = strBuffer1 
         End If 
        Next 
    Next 
    MsgBox Join(X, ";") 
    End Sub 
    

    更多信息,請參見here使用FileSystemObject

2

從brettdj(謝客brettdj)工作得很好,可能是我使用的方法,但我發現別的東西也適用,並且可能在其他情況下提供了一個優勢答案。首先,它保留了使用Dir循環訪問文件夾的極端簡單性。

在Excel 11中,我使用Dir(如問題中所述)從每個文件夾(一次一個文件夾)中創建jpg文件列表,在列A中對排序的字母數字進行排序。然後,我使用自定義列表用一個(假的)數字排序排列列A,這樣我就可以按照連續的順序處理我的jpg。然後清除Col A,然後重複下一個文件夾。

要生成自定義列表:

在工作列的第1行中輸入

=ROW() & ".jpg" 

和向下填充到任何訴訟。在我的情況下,我在自定義列表上使用了1000個項目,因爲這是我期望在任何文件夾中的jpg的最大數量。

自定義列表僅接受文本(或根據MS幫助的「簡單文本」),因此在導入爲自定義列表之前,必須使用「粘貼」>「特殊」>「值」將新生成的公式列表轉換爲文本。列表中的每個項目都是預期的文件名之一。最終的自定義列表如下:

1.jpg 
2.jpg 
3.jpg 
… 
… 
1000.jpg 

我導入後,我的新的自定義列表(工具>選項>自定義列表>導入),它成爲在數據下拉菜單中可用的選項>排序>選項>第一關鍵排序順序。

如果你正在做這種用VBA那麼這裏就是記錄儀提供:

Range("A:A").Select 
Selection.Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlGuess, _ 
    OrderCustom:=6, MatchCase:=False, Orientation:=xlTopToBottom, _ 
    DataOption1:=xlSortNormal 

前5名自定義列表是內置到Excel,所以OrderCustom:= 6是新的自定義列表。請記住在進行正常排序時將其更改回OrderCustom:= False。自定義列表保持附加到他們創建的Wkb直到被刪除。

+0

感謝您不遺餘力地發佈如此全面的後續路徑。雖然我曾經簡單地考慮過在Excel中使用Excel進行排序,Excel排序還需[調整](http://www.eggheadcafe.com/microsoft/Excel/32870327/special-sorting-need-advice.aspx)到工作。它看起來像你的自定義列表提供了一個很好的解決方案(+1 btw)。 – brettdj 2012-01-02 00:44:08

+0

小修正。設置OrderCustom:= False正如我在上面的回答中所建議的那樣會產生一個錯誤。應該是OrderCustom:= 1 – Roy 2012-01-09 00:36:53

相關問題