我想在VBA中做一些东西,基本上列出一个或多个目录中的所有文件,从根文件夹开始。长话短说,我使用filesystemobject遍历所有文件夹,然后获取这些文件夹中的所有文件。移动到下一个文件夹,等等。
我遇到的问题是,我需要以与Windows中相同的文件夹排序顺序输出我的数据(在工作表上)。我知道这不是一个固定的概念,所以这里有一个简单的例子,因为它显示在Windows中(对我来说):
Windows排序顺序:
FolderTest\000
FolderTest\0
FolderTest\0001毫不奇怪,当使用FSO时,它以不同(可能更符合逻辑)的顺序返回子文件夹:
FolderTest\0
FolderTest\000
FolderTest\0001我希望有人知道该怎么做才能让它在Windows中显示出来。这只是一个例子,显然,文件可以命名为任何名称,但它的名称中肯定有字母字符的表现要好得多。我不一定喜欢使用FSO,但我甚至不知道还能去哪里寻找替代方案。我知道我可以在数组中对它们进行排序,但我不确定需要什么样的魔法才能使它以“正确”的顺序排序。据我所知,有一些方法或东西可以让这一切变得更好。提前感谢您的帮助!
发布于 2013-07-09 10:02:54
啊,我现在明白了。我做了一堆带有数字名称的目录,看看是怎么回事。Windows资源管理器对该值执行整数转换。排序规则如下:
numeric value : ascending
padding length : descending因此,如果有01和001,两者的计算结果都是整数1,但001将首先出现,因为它更长(有更多的补零)。这种情况下的' length‘仅指数字部分(即填充),不受后面出现的任何字符的影响(它们仅在数值和填充长度相同时才重要-然后正常排序适用):

发布于 2013-07-09 11:25:44
对于任何可能会有帮助的人来说,下面的代码看起来像是给了我我想要的结果,将子文件夹列表转换为您(可能)在Windows资源管理器中找到的相同排序顺序。从Filesystem对象进给子文件夹,它将结果输出到一个数组(Fname)中。代码..。这不是很漂亮。我会第一个承认这一点。别太苛刻地评判我。非常感谢@Paddy (见上文)为我指明了StrCmpLogicalW (http://msdn.microsoft.com/en-us/library/windows/desktop/bb759947(v=vs.85).aspx
Private Declare PtrSafe Function StrCmpLogicalW Lib "shlwapi" _
(ByVal s1 As String, ByVal s2 As String) As Integer
Sub filefoldersortWindows()
Dim folder As String
Dim fnames() As String, buffer As String, content As String
folder = "Your Path"
Set fsol = CreateObject("Scripting.fileSystemObject")
Set fold = fsol.GetFolder(folder)
FoldCount = fold.SubFolders.Count
ReDim fnames(FoldCount)
cFcount = 0
For Each fld In fold.SubFolders
cFcount = cFcount + 1
Namer$ = fld.Name
fnames(cFcount) = StrConv(Namer, vbUnicode)
Next
For AName = 1 To FoldCount
For BName = (AName + 1) To FoldCount
If StrCmpLogicalW(fnames(AName), fnames(BName)) = 1 Then
buffer = fnames(BName)
fnames(BName) = fnames(AName)
fnames(AName) = buffer
End If
Next
Next
For i = 1 To FoldCount
fnames(i) = StrConv(fnames(i), vbFromUnicode)
If i > 1 Then
content = content & "," & fnames(i)
Else
content = fnames(i)
End If
Next
End Subhttps://stackoverflow.com/questions/17538620
复制相似问题