【问题标题】:VBA DIR command malfunctioningVBA DIR 命令出现故障
【发布时间】:2022-01-17 17:15:33
【问题描述】:

我试图在 VBA 中获取文件夹的文件列表,但在使用 DIR 命令时遇到了问题,它的作用就像 * 通配符弄乱了我输入的整个掩码。

这是我的文件列表:

  • NotAText.inf
  • Sample1.txt
  • Sample2.txt
  • Sample3.txt
  • Sample4.txt1
  • Sample5.txta

我尝试使用的原始掩码是“*.txt”,所以我应该获得 3 个文件。但我得到的是:3 个 .txt 文件以及 .txt1.txta 个文件。

我已经测试过其他文件名和扩展名,如果我只使用问号,它可以正常工作,例如: 掩码:“???????.txt”按原样返回 3 个 .txt 文件。

是否有人遇到与此处所述相同的故障?有谁可能知道导致此问题的现有问题? 尝试过的系统: 视窗 11; Excel版本:2112 视窗 10; Excel版本:2102 视窗 98; Excel 97

我可能遗漏了一些非常蹩脚的东西,但如果有人可以提供帮助,我将非常感激。 :)

Sub test()

    Dim i As Integer
    Dim s As String
    
    i = 1
    
    s = Dir("*.txt")
    
    Do While (s <> "")
        Cells(i, 1) = s
        s = Dir
        i = i + 1
    Loop

End Sub

新鲜发现:如果我使用超过 3 个字符的文件扩展名作为过滤器,它可以正常工作,它只返回所需的文件。我在 Windows 98 的命令提示符下发现,Windows 将 3 个字符的文件扩展名过滤器视为“基础”,并将类似文件(以该过滤器开头)视为“TXT”,我想这对于现代 Windows 版本也是如此,这就是故障存在的原因。我的猜测是,当使用 3 字符扩展过滤器时,它使用 8.3 文件名格式进行搜索,当使用更长的文件名格式时,它使用正确的长文件名进行搜索。我是不是发现了一个古老的 Windows 漏洞???

SAMPLE1  TXT             0  21.12.14  12.04 Sample1.txt
SAMPLE2  TXT             0  21.12.14  12.04 Sample2.txt
SAMPLE3  TXT             0  21.12.14  12.04 Sample3.txt
SAMPLE~1 TXT             0  21.12.14  12.04 Sample4.txt1
SAMPLE~2 TXT             0  21.12.14  12.04 Sample5.txta

有趣的事实:在 PowerShell 下,该命令使用 3 个字符的扩展名过滤器可以正常工作。

【问题讨论】:

  • 这不是一个古老的错误,它是一个功能,Dir(在命令行和 VBA 中)还查看 Windows 出于兼容性原因保留的文件短名称(8.3 格式)。见stackoverflow.com/q/66674420/7599798stackoverflow.com/q/68287857/7599798
  • FWIW,使用Application.GetOpenFileName 不会发生这种现象:例如Application.GetOpenFilename("Text Files (*.txt), *.txt") 将只返回.txt 文件而不是.txt1
  • 考虑使用 FSO(文件系统对象),允许您直接访问文件扩展名,因此您不需要通配符。
  • @FunThomas 确实如此。我没有找到这个,自动建议也没有返回它。非常感谢!

标签: excel vba windows file directory


【解决方案1】:

我从来没有遇到过 Dir 的问题,但为了您的需要,请尝试这样的方法 -

Dim i As Long
Dim s As String, sPath As String, sFilter As String
    
    i = 1
    sPath = CurDir & "\"
    sFilter = "*.txt"    
    s = Dir(sPath, 15)
    
    Do While Len(s)
        If LCase(s) Like sFilter Then
            Cells(i, 1) = s
            i = i + 1
        End If
        s = Dir
    Loop

End Sub

【讨论】:

  • 这可能是我们将使用的最终和最简单的解决方案。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-23
相关资源
最近更新 更多