如何通过VBA宏对文件夹内所有CSV文件执行分列及数据合并操作
现有代码的核心问题
- 未正确拼接完整文件路径:仅通过
Dir()获取了文件名,没有拼接文件夹路径,无法正确打开目标CSV文件 - 操作对象指向错误:原代码直接操作当前活动工作表的A列,没有指向打开的CSV文件的工作表,自然不会产生修改效果
- 缺少遍历迭代逻辑:第一版代码循环内没有执行
filename = Dir,会进入死循环;第二版测试代码中MyFiles变量未赋值就传入Workbooks.Open方法,必然执行失败 - 缺少数据汇总逻辑:仅做了分列操作,没有将处理后的数据写入汇总工作表的相关逻辑
修正后可直接运行的VBA代码
Sub 批量处理CSV并汇总() ' 配置参数区,可根据实际情况修改 Const folderPath As String = "/Users/karlemilthulstrup/Downloads/Test med kun 1Vp/" Dim sumSht As Worksheet, csvWb As Workbook, csvSht As Worksheet Dim lastRow As Long, sumLastRow As Long Dim fileName As String ' 初始化汇总工作表 Set sumSht = ThisWorkbook.Worksheets.Add sumSht.Name = "汇总结果" ' 遍历目标文件夹下所有CSV文件 fileName = Dir(folderPath & "*.csv") Do While fileName <> "" ' 打开CSV文件 Set csvWb = Workbooks.Open(folderPath & fileName) Set csvSht = csvWb.Worksheets(1) ' 执行分列操作 csvSht.Columns("A:A").TextToColumns _ Destination:=csvSht.Range("A1"), _ DataType:=xlDelimited, _ TextQualifier:=xlDoubleQuote, _ ConsecutiveDelimiter:=False, _ Tab:=True, _ Comma:=True, _ FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), _ Array(5, 1), Array(6, 1), Array(7, 1), Array(8, 1), _ Array(9, 1), Array(10, 1), Array(11, 1), Array(12, 1)), _ DecimalSeparator:=".", _ ThousandsSeparator:=",", _ TrailingMinusNumbers:=True ' 复制处理后的数据到汇总表 lastRow = csvSht.Cells(csvSht.Rows.Count, "A").End(xlUp).Row sumLastRow = sumSht.Cells(sumSht.Rows.Count, "A").End(xlUp).Row + 1 ' 第一个文件保留表头,后续文件跳过表头 If sumLastRow = 1 Then csvSht.Range("A1:L" & lastRow).Copy sumSht.Range("A" & sumLastRow) Else csvSht.Range("A2:L" & lastRow).Copy sumSht.Range("A" & sumLastRow) End If ' 关闭CSV文件,不需要修改原文件则SaveChanges设为False,需要保留原文件分列效果设为True csvWb.Close SaveChanges:=False ' 迭代下一个文件 fileName = Dir Loop MsgBox "处理完成,共汇总" & sumSht.Cells(sumSht.Rows.Count, "A").End(xlUp).Row - 1 & "条有效数据" End Sub
使用注意事项
- 运行前请确保
folderPath参数的路径与你实际CSV存放路径一致,Mac系统路径结尾需要保留斜杠 - 如果你的CSV字段数不是12列,可自行修改
FieldInfo参数和复制数据的列范围 - 不需要修改原CSV文件的话,
csvWb.Close的SaveChanges参数保持为False即可
内容的提问来源于stack exchange,提问作者Karl Emil Thulstrup
相关产品推荐
相关产品推荐

