使用Dir以文件系统顺序从文件夹返回文件

时间:2011-12-31 22:03:06

标签: vba

PixPath是jpg文件夹的完整路径,我正在使用以下代码来处理每个jpg。

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

      <process this jpg>

   End If
Loop

除了以字母数字顺序返回文件,而不是文件夹中列出的文件显示顺序外,此方法正常。有没有办法解决这个问题?

2 个答案:

答案 0 :(得分:4)

您无法使用Dir执行此操作。

另一种选择是:

  • 使用FileSystemObject访问目录中的所有文件
  • 将所有.jpg个文件读入数组 X
  • 使用Val比较.jpg s值以按数字升序排序
  • 最终数组 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
    

    有关使用FileSystemObject

  • 的详情,请参阅here

答案 1 :(得分:2)

来自brettdj(感谢brettdj)的答案效果很好,可能是我将使用的方法,但我发现了其他一些也有效的方法,并且可能在其他情况下提供优势。首先,它保留了使用Dir循环遍历文件夹的极其简单。

在Excel 11中,我使用Dir(如问题中所述)从每个文件夹(一次一个文件夹)创建jpg文件列表,在Col A中排序字母数字。然后我使用自定义列表使用(假)数字排序对Col A进行排序,以便我可以按顺序处理我的jpg。然后清除Col A,并重复下一个文件夹。

生成自定义列表:

在工作栏的第1行输入

 =ROW() & ".jpg"

并填写任何适合。在我的情况下,我在自定义列表中使用了1000个项目,因为这是我在任何文件夹中所期望的最大jpg数量。

自定义列表仅采用文本(或根据MS帮助“简单文本”),因此在导入为自定义列表之前,必须使用粘贴&gt;特殊&gt;值将新生成的公式列表转换为文本。列表中的每个项目都是预期的文件名之一。最终的自定义列表如下所示:

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

导入新的自定义列表(工具&gt;选项&gt;自定义列表&gt;导入)后,它将成为数据&gt;排序&gt;选项&gt;首键排序顺序的下拉菜单中的可用选项。

如果您使用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相关联,直到删除。