【问题标题】:Sequential reading of file names in a folder using excel VBA使用excel VBA顺序读取文件夹中的文件名
【发布时间】:2020-02-10 01:07:04
【问题描述】:

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

Application.ScreenUpdating = False
    With Application.FileDialog(msoFileDialogFolderPicker)
        .Title = "Please select a folder"
        .ButtonName = "Pick Folder"
        If .Show = 0 Then
            MsgBox "Nothing was selected"
            Exit Sub
        Else
            FileDir = .SelectedItems(1) & "\"
        End If
    End With
FiletoList = Dir(FileDir & "")
    Do Until FiletoList = ""

【问题讨论】:

  • 所有文件是否一致命名为_1、_2、_3、..._10、_11、_12、..._997、_998、_999、_1000?
  • 是的,所有文件都统一命名

标签: excel vba


【解决方案1】:

Dir 不保证以任何特定顺序返回文件(see herehere)。

要使它们按排序顺序排列,您需要将所有文件读入某种数据结构,并在将它们返回到列表之前对其进行排序。

正如 Matthew 所描述的,您的排序方式将取决于文件名结构和您的排序规则。

【讨论】:

  • 感谢您的指点,克里斯。直到现在我才知道 Dir “没有特别的顺序”返回。非常感激。 +1
【解决方案2】:
Option Explicit

Sub test()

    Dim folder
    With Application.FileDialog(msoFileDialogFolderPicker)
        .Title = "Please select a folder"
        .ButtonName = "Pick Folder"
        If .Show = 0 Then
            MsgBox "Nothing was selected"
            Exit Sub
        Else
            folder = .SelectedItems(1) & "\"
        End If
    End With
    With CreateObject("Scripting.FileSystemObject")
        Dim i
        For i = 1 To 1000
            Dim path
            path = folder & "Dummy3_" & i
            If .FileExists(path) Then
                '
                ' your code here
                Debug.Print path
                '
                '
            End If
        Next
    End With

End Sub

【讨论】:

  • 谢谢。我将更新代码以避免由于'Dir'不保证文件顺序而可能弹出的任何错误
  • @NithinSudarsanan 如果解决了问题,请接受答案。
【解决方案3】:

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_)和“数字”部分(_ 之后的所有内容),然后自己按数字顺序对列表进行排序。这需要做一些工作。

希望对你有帮助。

【讨论】:

  • re your option 1 - Dir does not gaurantee the order of return files,因此 OPs 代码可能不会按排序顺序返回文件
  • 好的,谢谢。我编辑了我的答案以反映您的链接。非常感谢。
  • 谢谢。根据建议重命名所有文件后,代码将按顺序读取文件。
  • 如果您喜欢这个答案,如果您接受它,我们将不胜感激,或者支持它。很高兴我们能提供帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-03
相关资源
最近更新 更多