使用Excel VBA按顺序读取文件夹中的文件名

12 浏览
0 Comments

使用Excel VBA按顺序读取文件夹中的文件名

我正在尝试使用VBA读取一个文件夹中的近1000个文件。我希望代码按照递增的顺序选择文件名,例如Dummy3_1,Dummy3_2,Dummy3_3等。但是,当前的代码在Dummy3_1之后选择了Dummy3_10。我该如何使代码按顺序读取文件名。谢谢。

Application.ScreenUpdating = False
    With Application.FileDialog(msoFileDialogFolderPicker)
        .Title = "请选择一个文件夹"
        .ButtonName = "选择文件夹"
        If .Show = 0 Then
            MsgBox "未选择任何内容"
            Exit Sub
        Else
            FileDir = .SelectedItems(1) & "\"
        End If
    End With
FiletoList = Dir(FileDir & "")
    Do Until FiletoList = ""

0
0 Comments

问题的原因是使用VBA读取文件夹中的文件名时,由于使用了Dir函数,无法保证文件名的顺序,可能会出现错误。解决方法是改为使用CreateObject("Scripting.FileSystemObject")来遍历文件夹中的文件,并使用FileExists方法判断文件是否存在。通过这种方式可以按顺序读取文件名,避免出现错误。作者表示会更新代码以避免可能出现的错误,并希望提问者接受这个答案。

0
0 Comments

问题出现的原因是使用Dir命令返回的文件名是“没有特定顺序的”(请参见Chris Neilsen的回答中的链接),所以不能保证获得希望的顺序。此外,当处理字符串时,计算机会使用字母顺序进行排序。对于字母,您应该能够看到以下是按字母顺序排列的:

b

ba

c

当数字是字符串时,也不例外。这些数字的正确字母顺序是:

1

10

2

如果您希望数字在字符串中自动以数值顺序进行“正确”排序,您需要在数字前面填充前导零,因此这些数字既按字母顺序(像字符串)排列,又按数字顺序排列。

01

02

10

在您的情况下,您有两个选项。(根据Dir命令的行为,选项#1并不像我认为的那么容易)

1)如果您控制输入文件,则处理这个问题最简单(也是最佳实践)的方法是使用填充的数字创建文件,因此不仅在Dummy3_1,Dummy3_10等文件名中选择可以容纳最多文件的零数(您说多于1000个,并且我将假设小于10k),并填充名称,因此将文件命名为Dummy3_0001,Dummy3_0010等。如果您能够这样做,您的代码应该可以直接开始工作,无需修改。

2)如果您无法控制文件名,则无法使用Dir命令。您必须将文件读入数组中,将其拆分为“标题”部分(在您的情况下为Dummy3_)和“数字”部分(在_之后的所有内容),然后自己按数值顺序对列表进行排序。这需要一些工作。

希望这对您有所帮助。

关于您的第一种选择-Dir不保证返回文件的顺序,因此OP的代码可能不会按排序顺序返回文件。

是的,谢谢您提供的链接。我已经编辑了我的答案以反映您的链接。非常感谢。

谢谢。一旦我按照建议重命名所有文件,代码就会按顺序读取文件。

如果您喜欢这个答案,请接受它或点赞。很高兴我们能帮到您。

0
0 Comments

问题的原因是,VBA中的Dir函数不能保证按照特定顺序返回文件名。为了按照排序顺序返回文件名,需要将所有文件读入某种数据结构,并在将它们返回给列表之前对其进行排序。

解决方法是,首先使用Dir函数将文件名读入数组或集合中。然后,根据文件名的结构和排序规则,使用适当的方法对数组或集合进行排序。排序后,可以将排序后的文件名返回给列表。

感谢Chris的指点,直到现在我才知道Dir函数返回的文件名是“无特定顺序”的。非常感谢。+1

0