【问题标题】:excel vba dir function to find doc not docxexcel vba dir函数查找doc而不是docx
【发布时间】:2015-03-02 11:12:32
【问题描述】:

我在 excel 中使用此 vba 代码从特定文件夹中获取文件名:

Sub getfilelistfromfolder()
Dim varDirectory As Variant
Dim flag As Boolean
Dim i As Integer
Dim strDirectory As String


strDirectory = Application.ActiveWorkbook.Path & "\"
i = 1
flag = True
varDirectory = Dir("C:\Users\USER\Documents\*.doc", vbNormal)
Range("A2:A100").Select
Selection.ClearContents

While flag = True
    If varDirectory = "" Then
        flag = False
    Else
        Cells(i + 2, 1) = varDirectory
        varDirectory = Dir
        i = i + 1
    End If


Wend
End Sub



但是,我只想获取 .doc 而不是 .docx。
如何修改此代码以仅获取 .doc 文件?

注意:这是我给出的一个例子。我真正的文件扩展名是我们程序特定的文件类型:.out 和 .outreview 我只想获取 .out 文件和 not .outreview 文件的列表。 示例文件名:
file1.out
file2.outreview
file3.out
file4.outreview

我只想列出 .out 文件。



谢谢

【问题讨论】:

  • 好吧,如果你使用相同的*.out 而不是*.out**.*,你应该只得到文件。但是,如果没有看到您的真实代码和一些文件名,就很难得到正确的答案。
  • @PaulFrancis:添加了示例文件名。否则,我认为我的问题很清楚。
  • 我从来没有说过你的问题不清楚。有时,您遵循的逻辑实际上可能不是您的代码指示编译器执行的操作。所以最好提供实际的代码。您提供的 PSEUDO 代码只会给出 .doc 而不是 .docx
  • @PaulFrancis:代码与我使用的完全相同。我将 .doc 放在示例代码中,而 .out 在我自己的代码中。我替换它的原因是为了网站的 SEO 目的,以便未来的用户可以轻松找到这个问题。如果我在标题中添加了 .out 和 .outreview,那么没有人会输入这些未知的文件扩展名。这些扩展仅用于我们的私有软件。

标签: vba excel


【解决方案1】:

如果您检查对“Microsoft Scripting Runtime”的引用(Menu Extras -> References),则可以使用 FileSystemObject:

dim fso as FileSystemObject
dim folder as Scripting.Folder
dim file as Scripting.File
dim extension as String 

set fso = new FileSystemObject
set folder = fso.getFolder("C:\Users\USER\Documents\")
extension = ".doc"

for each file in folder.Files
    if Right(file.shortname, 4) = extension then
        ' do stuff
    end if
next file

请注意,file.Type-Attribute 生成的表达式如“Word 文档”,在不同的 PC 和语言上可能会有所不同。

【讨论】:

  • 您可以使用后期绑定来避免设置引用。并且专门针对正确扩展名测试每个文件的技术也可以与 OP 的原始方法一起使用。
【解决方案2】:

只需测试所需的扩展:

Sub getfilelistfromfolder()
    Dim varDirectory As Variant
    Dim flag As Boolean
    Dim i As Long
    Dim strDirectory As String
    Dim Desired As String

    Desired = ".doc"
    i = 1
    flag = True
    Range("A2:A100").Select
    Selection.ClearContents

    While flag = True
        If varDirectory = "" Then
            flag = False
        Else
            If Right(varDirectory, 4) = Desired Then
                Cells(i + 2, 1) = varDirectory
                i = i + 1
            End If
            varDirectory = Dir
        End If
    Wend
End Sub

【讨论】:

    【解决方案3】:

    似乎 dir 函数会默默地忽略超过三个字符的扩展名,并将它们视为三个字符(它使用 8.3 char DOS 名称 - 也许它使用一些较旧的 Windows API),很像 DOS dir 命令会,在命令提示符下尝试dir /X *.doc

    一种解决方法可能是测试扩展,这样应该可以工作:

    IF (UCase(Right(varDirectory, 3)) = "DOC")
    

    【讨论】:

      【解决方案4】:

      您可以替换相应的代码行以仅使用“.Doc”搜索文件扩展名;有以下几行/几行。

      If UCase(Right(Trim(varDirectory), 4)) = ".DOC" Then
      'Your Code here
      End If
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-02
        • 2012-07-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多