如何无需指定文件名,将文件夹最新工作簿设为数据复制源?
VBA自动选取最新CSV文件并复制数据解决方案
问题说明
需要实现VBA代码自动定位指定文件夹内的最新CSV文件,将其中数据复制到目标主工作簿,无需手动指定文件名。现有代码可遍历所有CSV文件,但无法筛选最新文件,且存在主工作簿赋值的逻辑错误。
修正后的完整代码
Sub CopyDataFromLatestCSV() Dim SourceFolder As String Dim MasterWorkbook As Workbook Dim CurrentData As Workbook Dim DataSheet As Worksheet Dim MasterSheet As Worksheet Dim CSVFile As String Dim NextRow As Long Dim SelectedFile As Variant Dim LatestFile As String Dim LatestTime As Date Dim CurrentFileTime As Date ' 设置包含CSV文件的源文件夹路径 SourceFolder = "P:\Fluid Products Engineering\EOP Tester Data\Combination Program\Raw Data\" ' 选择主工作簿(目标工作簿) SelectedFile = Application.GetOpenFilename( _ FileFilter:="Excel Files (*.xls; *.xlsx; *.xlsm), *.xls; *.xlsx; *.xlsm", _ Title:="请选择主工作簿") ' 判断是否取消选择 If SelectedFile = False Then MsgBox "未选择主工作簿,程序退出...", vbInformation Exit Sub Else Set MasterWorkbook = Workbooks.Open(SelectedFile) End If ' 设置主工作表(默认取第一个工作表) Set MasterSheet = MasterWorkbook.Sheets(1) ' 初始化最新文件相关变量 LatestFile = "" LatestTime = 0 ' 遍历文件夹,筛选出最新的CSV文件 CSVFile = Dir(SourceFolder & "*.csv") Do While CSVFile <> "" ' 获取当前文件的修改时间 CurrentFileTime = FileDateTime(SourceFolder & CSVFile) ' 对比并更新最新文件记录 If CurrentFileTime > LatestTime Then LatestTime = CurrentFileTime LatestFile = CSVFile End If ' 获取下一个文件 CSVFile = Dir Loop ' 检查是否找到有效CSV文件 If LatestFile = "" Then MsgBox "源文件夹中未找到CSV文件。", vbExclamation MasterWorkbook.Close False Exit Sub End If ' 打开最新的CSV文件 Set CurrentData = Workbooks.Open(SourceFolder & LatestFile) Set DataSheet = CurrentData.Sheets(1) ' 确定主工作簿中数据粘贴的起始行 NextRow = MasterSheet.Cells(MasterSheet.Rows.Count, "A").End(xlUp).Row + 1 ' 复制最新CSV文件的所有数据到主工作簿 DataSheet.UsedRange.Copy MasterSheet.Cells(NextRow, 1) ' 关闭CSV文件,不保存更改 CurrentData.Close False ' 保存并关闭主工作簿 MasterWorkbook.Close True MsgBox "最新CSV文件数据已成功复制到主工作簿。", vbInformation End Sub
关键修改说明
- 修复主工作簿选择逻辑:原代码错误地将
GetOpenFilename的返回值(字符串/布尔值)直接赋值给Workbook对象,改为先存入Variant类型变量,判断用户是否取消选择后再打开工作簿。 - 新增最新文件筛选逻辑:通过
FileDateTime函数获取文件修改时间,遍历过程中持续对比并保留最新的文件路径。 - 简化数据复制流程:仅处理筛选出的最新CSV文件,而非遍历所有文件,符合需求且提升效率。
- 增加异常判断:添加文件夹无CSV文件的提示,避免后续代码因空文件路径报错。
内容的提问来源于stack exchange,提问作者Nathaniel Wren
相关产品推荐
相关产品推荐

