Vba 使用Dir按文件系统顺序从文件夹返回文件
PixPath是指向jpg文件夹的完整路径,我使用如下代码来处理每个jpgVba 使用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)=
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
- 将所有
文件读入数组X.jpg
- 使用
按值比较Val
s,以数字升序排序.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
的更多信息,请参阅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