【问题标题】:Finding the latest file for a particular date and then opening files over a specified date range查找特定日期的最新文件,然后打开指定日期范围内的文件
【发布时间】:2021-08-19 20:42:20
【问题描述】:

所以,我还没有为此编写任何特定的代码,但我正在尝试从概念上思考如何做到这一点。

我有一个文件夹,每个工作日的每个小时都会在其中转储一个 .xslx 文件。目前我有一些代码进入,找到最新的文件并打开它,进行一些数据操作(过滤、复制然后粘贴到另一个工作簿等)。

我现在想要的是创建一个时间序列,例如我指定了一个日期范围,比如 2021 年 3 月 1 日到 2021 年 6 月 1 日,让代码找到该范围内每个工作日的最新文件,打开它并执行我已经创建的相同数据操作步骤。

如果有帮助,下面是我当前的代码,它只找到最新的文件(任何日期)。我的问题是如何遍历文件?我需要一个新变量,还是可以将 dtefile 更改为日期范围?

Sub LatestLoad()

Dim FileSys As FileSystemObject
Dim objFile As File
Dim myFolder
Dim strFilename As String
Dim dteFile As Date

    Const myDir As String = "C:\myfolder"

    Set FileSys = New FileSystemObject
    Set myFolder = FileSys.GetFolder(myDir)
   
    dteFile = DateSerial(1900, 1, 1)
    For Each objFile In myFolder.Files
        If objFile.DateLastModified > dteFile Then
            dteFile = objFile.DateLastModified
            strFilename = objFile.Name
        End If
    Next objFile
    Workbooks.Open myDir & "\" & strFilename, ReadOnly:=True
    Workbooks(strFilename).Activate
End Sub

【问题讨论】:

  • If objFile.DateLastModified >= DateSerial(2021, 3, 1) And objFile.DateLastModified < DateSerial(2021, 6, 1) Then 应该遍历这些日期之间的所有文件。你的问题是什么?
  • 一半,我想 - 我还想在每个日期打开每个最后修改的文件?
  • 你的意思是你需要找到这两个日期之间每天最后修改的文件?
  • 只是一个概念问题的输入:这可能是数据库的工作。您将数据填充到数据库中,您可以查询所需的任何数据选择。 Excel文件来自哪里?从数据库?可能有一条直截了当的方法。

标签: excel vba loops date range


【解决方案1】:

您可以使用字典来收集所需的文件,然后循环字典来做您的事情。

Option Explicit

Sub LatestLoad()
    Dim strFilename As String
    
    Const myDir As String = "C:\temp"

    Dim FileSys As FileSystemObject
    Set FileSys = New FileSystemObject

    Dim myFolder As Variant
    Set myFolder = FileSys.GetFolder(myDir)
   
    Dim dteStart As Date
    dteStart = DateSerial(2021, 3, 1)

    Dim dteEnd As Date
    dteEnd = DateSerial(2021, 6, 1)
    
    ' we want to collect all last modified files per day in a dictionary
    Dim LastModFileList As Object
    Set LastModFileList = CreateObject("Scripting.Dictionary")
    
    Dim objFile As File
    For Each objFile In myFolder.Files
        If objFile.DateLastModified >= dteStart And objFile.DateLastModified < dteEnd Then ' check if file is within desired range
            If LastModFileList.Exists(CLng(objFile.DateLastModified)) Then ' check if day already exists in dictionary
                If LastModFileList(CLng(objFile.DateLastModified)).DateLastModified < objFile.DateLastModified Then ' check if current file is older then the one already in the dictionary
                    Set LastModFileList(CLng(objFile.DateLastModified)) = objFile ' set the older file to the dictionary
                End If
            Else ' for this day no file was tracked yet so add the current one
                LastModFileList.Add CLng(objFile.DateLastModified), objFile
            End If
        End If
    Next objFile
    
    ' now all last modified files per day are in the dictionary
    
    Dim Key As Variant
    For Each Key In LastModFileList.Keys ' loop through the dictionary and do things
        Debug.Print Format$(Key, "yyyy-mm-dd"), myDir & "\" & LastModFileList(Key).Name
        'do your work for each file here (open/edit/close)
    Next Key
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2022-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多