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

Vba 使用Dir按文件系统顺序从文件夹返回文件,vba,Vba,PixPath是指向jpg文件夹的完整路径,我使用如下代码来处理每个jpg fileName = Dir(PixPath) Do Until fileName = "" If Right$(fileName, 4) = ".jpg" Then fileName = Dir() <process this jpg> End If Loop fileName=Dir(PixPath) 直到fileName=“”为止 如果右$(文件名,4)=

PixPath是指向jpg文件夹的完整路径,我使用如下代码来处理每个jpg

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

      <process this jpg>

   End If
Loop
fileName=Dir(PixPath)
直到fileName=“”为止
如果右$(文件名,4)=“.jpg”,则
fileName=Dir()
如果结束
环

除了文件以字母数字顺序返回,而不是以文件在文件夹中列出的顺序返回外,此操作正常。有什么办法可以解决这个问题吗?

你不能用
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
    的更多信息,请参阅

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

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

      要生成自定义列表,请执行以下操作:

      在工作列的第1行中,输入

       =ROW() & ".jpg"
      
      然后填到任何合适的位置。在我的例子中,我在自定义列表中使用了1000个项目,因为这是我在任何文件夹中期望的最大jpg数量

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

       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上,直到被删除。

      您的文件如何显示在文件夹中(按修改日期等)?文件名都由一个数字组成,例如“1”、“2”等。因此文件将是“1.jpg”等,并且每个文件夹中的数字可以无限增加。这些文件在Windows资源管理器中按“1.jpg”、“2.jpg”、“3.jpg”等顺序排序,这是所需的顺序,但Dir返回“1.jpg”、“10.jpg”等。我过去曾用前导零命名过这些文件。感谢您不厌其烦地发布这样一个全面的后续路径。虽然我曾短暂考虑过在VBA内部使用Excel进行排序,但Excel排序也可以工作。看起来您的自定义列表提供了一个很好的解决方案(+1 btw)。小更正。如我在上面的回答中所建议的,将OrderCustom:=设置为False将产生错误。应为OrderCustom:=1