我打算在 VBA 中做一些事情,基本上会列出一个或多个目录中的所有文件,从根文件夹开始。长话短说,我正在使用 filesystemobject 遍历所有文件夹,然后获取这些文件夹中的所有文件。移动到下一个文件夹等。
我遇到的问题是我需要按照在 Windows 中可能找到的相同文件夹排序顺序吐出我的数据(到工作表上)。我知道这不是一个固定的概念,所以这里有一个简单的例子,它在 Windows 中显示(对我来说):
Windows 排序顺序:
FolderTest\000
FolderTest\0
FolderTest\0001
不足为奇,当使用 FSO 时,它会以不同的(可能更符合逻辑的)顺序返回子文件夹:
FolderTest\0
FolderTest\000
FolderTest\0001
我希望有人知道可以做些什么来使它在 Windows 中显示时得到解决。这显然只是一个示例,文件可以命名为任何名称,但在名称中使用字母字符似乎表现得更好。我不一定愿意使用 FSO,但我什至不知道还能去哪里寻找替代方案。我知道我可能会在一个数组中求助于这些,但我不确定需要什么样的魔法才能使其按“正确”顺序排序。据我所知,有一些方法或东西可以让这一切变得更好。在此先感谢您的帮助!
最佳答案
无论它最终可能对谁有所帮助,下面的代码看起来都给了我我正在寻找的结果,将子文件夹列表转换为您(可能)在 Windows 资源管理器中找到的相同排序顺序。从 Filesystem 对象输入子文件夹,它将结果吐出到一个数组 (fnames) 中。代码……它不漂亮。我将是第一个承认这一点的人。不要太严厉地评判我。非常感谢@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 Sub
关于windows - VBA、FileSystemObject、Windows 排序顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17538620/