如何通过VBA一次性将同目录下的多个CSV文件导入至Excel同一张工作表的首个空行
如何通过VBA一次性将同目录下的多个CSV文件导入至Excel同一张工作表的首个空行
嗨,我来帮你调整代码实现批量导入的需求!你的原代码已经有不错的基础,只需要修改几个关键部分,就能让它遍历目录下所有CSV文件,并把数据依次追加到目标工作表的首个空行里。
修改思路
- 用
Dir函数遍历指定目录下的所有CSV文件,替代原代码中只打开单个文件的逻辑 - 每次导入前自动定位目标工作表的最后一行数据,确保新数据追加到后面,不会覆盖已有内容
- 可选处理:如果所有CSV文件都有相同表头,第一个文件保留表头,后续文件跳过表头避免重复(你可以根据实际需求调整)
修改后的完整代码
Sub loadDataFromCSV() Const csvPath = "N:\Temp voor automatisering\" Const csvFilePattern = "*.csv" Dim ws As Worksheet, csv As Workbook Dim csvFileName As String Dim lastRow As Long, firstImport As Boolean ' 关闭屏幕更新和提示,提升运行速度 Application.ScreenUpdating = False Application.DisplayAlerts = False ' 设置目标工作表,这里用你指定的"NGSimport" Set ws = ThisWorkbook.Worksheets("NGSimport") ' 标记是否是第一次导入(用来处理表头) firstImport = True ' 获取目录下第一个CSV文件 csvFileName = Dir(csvPath & csvFilePattern) ' 遍历所有CSV文件 Do While csvFileName <> "" ' 打开当前CSV文件 Set csv = Workbooks.Open(csvPath & csvFileName) With csv.ActiveSheet If firstImport Then ' 第一次导入:复制所有数据(包含表头)到目标表的A1开始位置 .Columns("A:U").Copy ws.Range("A1").PasteSpecial xlPasteValues firstImport = False Else ' 后续导入:找到目标表的最后一行,跳过CSV的表头,复制数据到空行 lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row + 1 .Range("A2:U" & .Cells(.Rows.Count, "A").End(xlUp).Row).Copy ws.Range("A" & lastRow).PasteSpecial xlPasteValues End If End With ' 关闭当前CSV文件,不保存更改 csv.Close SaveChanges:=False ' 获取下一个CSV文件 csvFileName = Dir Loop ' 恢复屏幕更新和提示 Application.DisplayAlerts = True Application.ScreenUpdating = True MsgBox "所有CSV文件已导入完成!", vbInformation End Sub
关键代码说明
- 遍历CSV文件:
Dir函数会自动获取目录下匹配*.csv的文件,通过Do While循环逐个处理,直到没有更多文件 - 定位空行:
ws.Cells(ws.Rows.Count, "A").End(xlUp).Row会找到A列最后有数据的行号,加1就是首个空行的位置 - 表头处理:用
firstImport变量标记是否是第一次导入,第一次保留表头,后续跳过表头(如果你的CSV没有表头或者不需要跳过,直接把A2改成A1即可) - 性能优化:开头关闭
ScreenUpdating和DisplayAlerts,避免频繁刷新屏幕和弹出提示框,让代码运行更快
注意事项
- 确认
csvPath路径是否正确,末尾要加上反斜杠\ - 确保目标工作表
NGSimport存在,否则会报错 - 如果你的CSV列数不是A到U,可以调整代码中的列范围(比如改成
A:Z或者实际的列数)
备注:内容来源于stack exchange,提问作者Caroline
相关产品推荐
相关产品推荐

