VBA在文件夹中生成最近修改的.XLS文件

VBA在文件夹中生成最近修改的.XLS文件,vba,excel,last-modified,Vba,Excel,Last Modified,我可以使用什么VBA代码使用单元格中显示的文件夹路径来检索该文件夹中最近修改的.xls文件?到目前为止,我有文件名显示但不是正确的文件: Function GetFileNames(ByVal FolderPath As String) As Variant Dim Result As Variant Dim i As Integer Dim MyFile As Object Dim MyFSO As Object Dim MyFolder As Object Dim MyFiles As Ob

我可以使用什么VBA代码使用单元格中显示的文件夹路径来检索该文件夹中最近修改的.xls文件?到目前为止,我有文件名显示但不是正确的文件:

Function GetFileNames(ByVal FolderPath As String) As Variant
Dim Result As Variant
Dim i As Integer
Dim MyFile As Object
Dim MyFSO As Object
Dim MyFolder As Object
Dim MyFiles As Object
Set MyFSO = CreateObject("Scripting.FileSystemObject")
Set MyFolder = MyFSO.GetFolder(FolderPath)
Set MyFiles = MyFolder.Files
ReDim Result(1 To MyFiles.Count)
i = 1
For Each MyFile In MyFiles
Result(i) = MyFile.Name
i = i + 1
Next MyFile
GetFileNames = Result
End Function

您只需检查文件夹中每个文件的
datelastmedited
时间戳。快速检查它是否是最新的将“排序”到顶部

Option Explicit

Sub test()
    Debug.Print "most recently modified file is " & GetNewestModifiedFilename("C:\Temp")
End Sub

Function GetNewestModifiedFilename(ByVal folderPath As String, _
                                   Optional fileType As String = "xls*") As String
    Dim MyFSO As Object
    Dim MyFolder As Object
    Dim MyFiles As Object
    Set MyFSO = CreateObject("Scripting.FileSystemObject")
    Set MyFolder = MyFSO.GetFolder(folderPath)
    Set MyFiles = MyFolder.Files

    Dim mostRecentFilename As String
    Dim mostRecentTimestamp As Date
    Dim MyFile As Object
    For Each MyFile In MyFiles
        Debug.Print MyFile.Name & ", modified " & MyFile.DateLastModified
        If Mid(MyFile.Name, InStrRev(MyFile.Name, ".") + 1) Like fileType Then
            If MyFile.DateLastModified > mostRecentTimestamp Then
                mostRecentFilename = MyFile.Name
                mostRecentTimestamp = MyFile.DateLastModified
            End If
        End If
    Next MyFile
    GetNewestModifiedFilename = mostRecentFilename
End Function

我认为你正在寻找的是一个类似于所选答案的东西

您可以调整代码以满足在函数中传递参数的特定需要,如下面的函数。请注意,参数目录的末尾必须包含反斜杠(例如“C:\Users\”)

函数NewestFile(目录为字符串)为字符串
'用途:从指定目录获取最新的文件名
将文件名设置为字符串
Dim MostRecentFile作为字符串
Dim MostRecentDate作为日期
Dim FileSpec作为字符串
'指定文件类型(如果有)
FileSpec=“*.xls”
FileName=Dir(目录和文件规范)
如果文件名为“”,则
MostRecentFile=FileName
MostRecentDate=FileDateTime(目录和文件名)
文件名“”时执行此操作
如果FileDateTime(目录和文件名)>MostRecentDate,则
MostRecentFile=FileName
MostRecentDate=FileDateTime(目录和文件名)
如果结束
FileName=Dir
环
如果结束
NewestFile=MostRecentFile
端函数
编辑:为获得更大的灵活性,您还可以添加选项(如PeterT的修订答案中所示)以使用可选的FileSpec参数搜索另一种类型的文件,如下面的可选函数中所示。对于这个函数,如果您没有为FileSpec提供任何值,它将查看所有文件

Function NewestFile(ByVal Directory As String, Optional ByVal FileSpec As String = "*.*") As String
'PURPOSE: Get the newest .xls file name from
Dim FileName As String
Dim MostRecentFile As String
Dim MostRecentDate As Date

'Specify the file type, if any
FileName = Dir(Directory & FileSpec)

If FileName <> "" Then
    MostRecentFile = FileName
    MostRecentDate = FileDateTime(Directory & FileName)
    Do While FileName <> ""
        If FileDateTime(Directory & FileName) > MostRecentDate Then
             MostRecentFile = FileName
             MostRecentDate = FileDateTime(Directory & FileName)
        End If
        FileName = Dir
    Loop
End If

NewestFile = MostRecentFile

End Function
函数NewestFile(ByVal目录作为字符串,可选ByVal FileSpec作为字符串=“**”)作为字符串
'目的:从中获取最新的.xls文件名
将文件名设置为字符串
Dim MostRecentFile作为字符串
Dim MostRecentDate作为日期
'指定文件类型(如果有)
FileName=Dir(目录和文件规范)
如果文件名为“”,则
MostRecentFile=FileName
MostRecentDate=FileDateTime(目录和文件名)
文件名“”时执行此操作
如果FileDateTime(目录和文件名)>MostRecentDate,则
MostRecentFile=FileName
MostRecentDate=FileDateTime(目录和文件名)
如果结束
FileName=Dir
环
如果结束
NewestFile=MostRecentFile
端函数
速度问题:Dir函数与FileSystemObject


就速度而言,如果要查看的文件夹包含少量文件,则这两种方法将在大致相同的时间内为您提供相同的结果。但是,如果该文件夹中有很多文件,使用Dir函数方法而不是FileSystemObject应该可以大大加快宏的执行速度。我还没有测试过它,但这似乎是从中的答案得出的结论。

您的代码正确地用给定文件夹中的文件名填充
结果
数组。那些不是正确的文件怎么办?@PeterT它目前对文件类型没有限制,也不返回最近修改的文件名伟大的答案!但是,问题提到该函数应该只查看*xls文件。添加了一个简单的可选参数来限制文件类型搜索。它已返回最近修改的文件名。
Function NewestFile(ByVal Directory As String, Optional ByVal FileSpec As String = "*.*") As String
'PURPOSE: Get the newest .xls file name from
Dim FileName As String
Dim MostRecentFile As String
Dim MostRecentDate As Date

'Specify the file type, if any
FileName = Dir(Directory & FileSpec)

If FileName <> "" Then
    MostRecentFile = FileName
    MostRecentDate = FileDateTime(Directory & FileName)
    Do While FileName <> ""
        If FileDateTime(Directory & FileName) > MostRecentDate Then
             MostRecentFile = FileName
             MostRecentDate = FileDateTime(Directory & FileName)
        End If
        FileName = Dir
    Loop
End If

NewestFile = MostRecentFile

End Function