Excel宏导出工作表为独立CSV文件:部分导出文件空白如何解决
问题根因
- 原代码直接对当前活动的原工作簿执行
SaveAs存为CSV格式,而CSV本身仅支持存储单个工作表。第一次循环导出Sheet1后,你打开的原工作簿已经被替换为仅包含Sheet1数据的CSV文件,后续处理Sheet2、Sheet3时操作的是这个单页CSV文件,自然导出结果为空白 - 该写法会直接修改你的原工作簿,存在原文件被覆盖损坏的风险
- 全局
On Error Resume Next会跳过所有错误,无法定位异常点
修正后代码
Sub Export_Files_Click() Dim ws As Worksheet Dim savePath As String Dim newWb As Workbook ' 先判断原工作簿是否已保存,避免路径为空 If ActiveWorkbook.path = "" Then MsgBox "请先保存当前工作簿再执行导出", vbExclamation Exit Sub End If savePath = ActiveWorkbook.path & "\" & Left(ActiveWorkbook.Name, InStr(ActiveWorkbook.Name, ".") - 1) ' 关闭屏幕更新提升速度 Application.ScreenUpdating = False For Each ws In ThisWorkbook.Worksheets ' 仅导出Sheet1和Sheet2,不需要导出指定表的话删掉这个If判断即可 If ws.Name = "Sheet1" Or ws.Name = "Sheet2" Then ' 将当前工作表复制为独立的新工作簿 ws.Copy Set newWb = ActiveWorkbook ' 保存新工作簿为CSV,加Local参数避免中文乱码 newWb.SaveAs Filename:=savePath & "_" & ws.Name & ".csv", FileFormat:=xlCSV, Local:=True, CreateBackup:=False ' 关闭临时工作簿不保存 newWb.Close SaveChanges:=False End If Next Application.ScreenUpdating = True MsgBox "导出完成", vbInformation End Sub
代码说明
- 每次导出时先将目标工作表复制为独立的临时工作簿,全程不对原工作簿执行任何修改操作,完全不会覆盖原文件
- 临时工作簿仅包含当前需要导出的单个工作表,符合CSV格式的存储规则,不会出现导出空白的问题
- 新增
Local:=True参数,避免导出的CSV出现中文乱码 - 加了工作表名称判断,仅导出你需要的Sheet1和Sheet2,如果需要导出所有工作表删掉If判断即可
- 关闭屏幕更新大幅提升大批量数据导出的速度
内容的提问来源于stack exchange,提问作者SumerOf94
相关产品推荐
相关产品推荐

