windows - VBA、FileSystemObject、Windows 排序顺序

标签 windows vba sorting filesystems

我打算在 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/

相关文章:

.net - .NET 的 SuppressKeypress 如何/为何工作?

vba - 从 Excel 读取缓慢

java - 使用比较器对对象的 ArrayList 进行排序,代码无法访问

在 Forth 中对字符串数组进行排序

Objective-C : Sorting NSMutableArray containing NSMutableArrays

windows - 如何从 Windows 命令行检索可用 RAM?

windows - 等待命令完成

适用于 Windows 7 的 Python GObject 自省(introspection)

python - xlwings - 获取和设置命名范围

vba - 使用 VBA 以编程方式删除 Access 宏