2011-12-31 62 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