【问题标题】:Excel VBA to get a file list by multiple file extensions and last modified dateExcel VBA通​​过多个文件扩展名和最后修改日期获取文件列表
【发布时间】:2015-03-02 15:26:27
【问题描述】:

在我的文件夹中,我有不同类型的文件:

.mp4 .wav .out .outreview

我在 excel 中使用 VBA 代码根据文件扩展名列出所有文件。如屏幕截图所示:



为此,我使用以下代码四次,每次替换文件扩展名并调整列引用:

这是第一列,视频文件,.mp4 的示例代码:

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

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

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



我对 .wav 和 .outreview 文件重复一遍。 但是我将以下代码用于 .out 文件,因为否则它会提取所有 .out 和 . .out 列中的 outreview 文件,这是我不想要的。

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

Desired = ".out"

strDirectory = Application.ActiveWorkbook.Path & "\"
i = 1
flag = True
varDirectory = Dir("C:\Users\Folder\", vbNormal)

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



问题:如何提取 .out 文件的最后修改日期,并将它们放在 列中的相应单元格中D

我怎样才能将所有这些代码组合成一个代码,这样我就不会为每个文件扩展名重复这个? 谢谢



更新



此更新是在 Jeanno 提供的答案之后进行的:

这回答了我的问题。这是 Jeanno 的修正版代码。



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

    strDirectory = Application.ActiveWorkbook.Path & "\"
    i = 1
    flag = True
    varDirectory = Dir("C:\Users\folder\*", vbNormal)
    Range("A5:E100").clear

While flag = True
        If varDirectory = "" Then
            flag = False
        Else
        If varDirectory Like "*.mp4" Then
            Cells(i + 4, 1) = varDirectory
        End If
        If varDirectory Like "*.wav" Then
            Cells(i + 4, 2) = varDirectory
            i = i + 1
        End If
        If varDirectory Like "*.outreview" Then
            Cells(i + 4, 5) = varDirectory
        End If
        If varDirectory Like "*.out" Then
            Cells(i + 4, 4) = varDirectory
            Cells(i + 4, 3) = FileDateTime("C:\Users\folder\" & varDirectory)
        End If
        varDirectory = Dir
        End If
Wend
End Sub



【问题讨论】:

    标签: vba excel


    【解决方案1】:

    这将一次性完成所有操作。我还没有测试过。基本上我使用Like 运算符和FileDateTime 函数。让我知道这是否对你有用

    Sub getfilelistfromfolder()
        Dim varDirectory As Variant
        Dim flag As Boolean
        Dim i As Long
        Dim strDirectory As String
        Dim Desired As String
    
        strDirectory = Application.ActiveWorkbook.Path & "\"
        i = 1
        flag = True
        varDirectory = Dir("C:\Users\Folder\*", vbNormal)
        Range("A5:D100").Clear
    
        While flag = True
            If varDirectory = "" Then
                flag = False
            ElseIf varDirectory Like "*.mp4" Then
                Cells(i + 4, 1) = varDirectory
                Cells(i + 4, 3) = FileDateTime("C:\Users\Folder\" & varDirectory)
                varDirectory = Dir
                i = i + 1
            ElseIf varDirectory Like "*.wav" Then
                Cells(i + 4, 2) = varDirectory
                Cells(i + 4, 3) = FileDateTime("C:\Users\Folder\" & varDirectory)
                varDirectory = Dir
                i = i + 1
            ElseIf varDirectory Like "*.outreview" Then
                Cells(i + 4, 5) = varDirectory
                Cells(i + 4, 3) = FileDateTime("C:\Users\Folder\" & varDirectory)
                varDirectory = Dir
                i = i + 1
            ElseIf varDirectory Like "*.out" Then
                Cells(i + 4, 4) = varDirectory
                Cells(i + 4, 3) = FileDateTime("C:\Users\Folder\" & varDirectory)
                varDirectory = Dir
                i = i + 1
            End If
        Wend
    End Sub
    

    【讨论】:

    • 我试过了,但是没有用。除此之外,我没有得到任何结果,最后一个 'Cells(i + 4, 3) = FileDateTime(varDirectory) 出现错误。如何解决这个问题?你能自己测试一下吗?
    • 哦,它没有响应。我认为它是无限的,我们必须在某个地方停下来。你能建议解决这个问题吗?
    • 我在进行了几次清理后尝试了您的代码。请在我的问题更新部分找到清理后的版本。但是,我在 B5 中得到一个空单元格。我的第二列在一个空单元格之后开始(跳过一个单元格)。请帮助解决这个问题。
    • 你为什么只在 B 列增加 i。我的问题如下?您是否总是希望拥有相同数量的文件类型。例如 2 mp4、2 wav、2 out、2 outreview?此外,我不确定在尝试对齐同一行上的文件时它会如何工作。
    • 这很奇怪。但是我放在更新部分的代码是我正在寻找的确切行为。每种文件类型我可能有不同数量的文件,5 mp4、4 wav 3out 1outreview。
    【解决方案2】:

    不确定问题的修改日期部分,但是,对于另一个,只需在列标题附近的一行中包含扩展名。然后用它来喂另一个循环。

    例如:

    1) 在第 3 行和第 4 行之间创建一个新行。 2) 在这个新的第 4 行 A 列中,存储“.mp4”。在 B 中,“.wav”等。 3)更改您的代码以添加另一个循环: (并使用该循环 # 来引用正确的列)

      Sub getfilelistfromfolder()
          Dim varDirectory As Variant
          Dim flag As Boolean
          Dim i As Long
          Dim strDirectory As String
          Dim Desired As String
    
      for x = 1 to 3
    
      Desired = Cells(4,x).Value
    
      strDirectory = Application.ActiveWorkbook.Path & "\"
      i = 1
      flag = True
      varDirectory = Dir("C:\Users\Folder\", vbNormal)
    
      While flag = True
          If varDirectory = "" Then
              flag = False
          Else
              If Right(varDirectory, 4) = Desired Then
                  Cells(i + 4, x) = varDirectory
                  i = i + 1
              End If
              varDirectory = Dir
          End If
      Wend
      next x
    
      End Sub
    

    【讨论】:

    • 你能写出完整的代码吗?当我将您的代码集成到我自己的代码中时,我遇到了问题。谢谢
    • 是的,它有效。但我仍在寻找上次修改的日期/时间。我将尝试其他用户的答案,看看结果如何。谢谢
    【解决方案3】:

    另一种方法:

    Sub M_snb()
     c00 = "C:\Users\Folder\"
     sn = Split(CreateObject("wscript.shell").exec("cmd /c Dir """ & c00 & "*.*"" /b/a-d").stdout.readall, vbCrLf)
    
     ReDim sp(1 To UBound(sn), 5)
    
     With CreateObject("scripting.filesystemobject")
      For j = 0 To UBound(sn)
       c01 = lcase(.getextensionname(c00 & sn(j)))
       If c01 <> "" And InStr("mp4wavoutoutreview", c01) Then sp(j, Application.Match(c01, Array("mp4", "wav", "out", "", "outreview"), 0)-1) = sn(j)
       If c01 = "out" Then sp(j, 4) = FileDateTime(c00 & sn(j))
      Next
     End With
    
     sheet1.cells(1).resize(ubound(sp),ubound(sp,2))=sp
    End Sub
    

    【讨论】:

    • 我在 sp(j, Application.Match(c01,....
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-30
    • 1970-01-01
    • 2019-02-26
    相关资源
    最近更新 更多