如何将多工作簿的文件创建日期填入对应导入数据行的Z列
问题分析与解决方案
问题根源
- 循环范围错误:原代码循环源文件的行号(
2 To LastRow),直接写入目标表对应行的Z列,导致每次导入都覆盖目标表前N行的Z列数据,而非本次新增的行。 - 代码结构混乱:
If FileToOpen <> False Then的闭合End If位置错误,导致逻辑分支混乱。 - 冗余操作:在循环内重复获取文件创建日期,完全没必要,浪费运行资源。
修正后的VBA代码
Sub GetFile() Dim FileToOpen As Variant Dim OpenWorkbook As Workbook Dim DataWorksheet As Worksheet Dim DestCell As Range Dim SourceLastRow As Long Dim TargetStartRow As Long Dim TargetEndRow As Long Dim FileCreationDate As Date Application.ScreenUpdating = False Set DataWorksheet = Sheet1 FileToOpen = Application.GetOpenFilename(FileFilter:="Excel Files (*.xlsx*),*xlsx*") If FileToOpen <> False Then Set OpenWorkbook = Application.Workbooks.Open(FileToOpen) ' 获取源文件有效数据行数 With OpenWorkbook.Sheets(1) SourceLastRow = .Cells(.Rows.Count, "A").End(xlUp).Row .Range("A2:Y" & SourceLastRow).Copy End With ' 确定目标表的粘贴起始行 If DataWorksheet.Range("A2") = "" Then Set DestCell = DataWorksheet.Range("A2") Else Set DestCell = DataWorksheet.Range("A1").End(xlDown).Offset(1, 0) End If ' 粘贴数据 DestCell.PasteSpecial xlPasteValuesAndNumberFormats ' 计算本次新增数据的行范围 TargetStartRow = DestCell.Row TargetEndRow = TargetStartRow + SourceLastRow - 2 ' 减去源文件表头行(从A2开始复制) ' 仅获取一次文件创建日期 FileCreationDate = CreateObject("Scripting.FileSystemObject").GetFile(FileToOpen).DateCreated ' 给本次新增的所有行填充Z列(第26列) DataWorksheet.Range(DataWorksheet.Cells(TargetStartRow, 26), DataWorksheet.Cells(TargetEndRow, 26)).Value = FileCreationDate ' 清理操作 OpenWorkbook.Close False Application.CutCopyMode = False End If Application.ScreenUpdating = True End Sub
关键修改说明
- 精准定位新增行:通过
TargetStartRow和TargetEndRow计算出本次导入数据在目标表中的行范围,确保只给新增行填充日期。 - 优化日期获取:将文件创建日期的获取移到循环外,仅执行一次,提升代码运行效率。
- 修正逻辑结构:调整
If语句的闭合位置,确保代码分支逻辑清晰正确。
内容的提问来源于stack exchange,提问作者Charisma
相关产品推荐
相关产品推荐

