如何优化VBA代码实现工作表复制到新工作簿存为CSV并提升运行速度
VBA批量导出CSV优化方案
一、直接赋值报错原因修复
你之前的直接赋值写法有两个错误:
- 赋值方向写反:你是要把源文件
closedbook的数据写到新文件newbook,原代码写反了赋值方向 - 范围不匹配:源范围是整列A到AW,目标只写了单个单元格A1,两边范围大小必须一致才能批量赋值
正确写法只取有效数据范围,避免空行占用资源:
' 先获取源数据最后一行,跳过整列空单元格 Dim lastRow As Long lastRow = closedbook.Sheets("new rates").Cells(closedbook.Sheets("new rates").Rows.Count, "A").End(xlUp).Row ' 同范围直接赋值,完全跳过剪贴板,速度远高于复制粘贴 newbook.Sheets(1).Range("A1:AW" & lastRow).Value2 = closedbook.Sheets("new rates").Range("A1:AW" & lastRow).Value2
二、各环节优化点
1. 源文件打开优化
你现在打开文件没有加只读参数,会因为文件锁、链接更新等操作拖慢速度,修改打开代码:
' 只读后台打开,跳过链接更新、只读提示等弹窗 Set closedbook = Workbooks.Open( _ Filename:=filetopen, _ ReadOnly:=True, _ UpdateLinks:=False, _ IgnoreReadOnlyRecommended:=True, _ Visible:=False _ )
2. 数据复制优化
- 不要直接操作整列(A:AW),只取有效数据范围,250M文件整列有104万行,实际有效数据可能只有几十万行,直接减少80%以上的运算量
- 新建工作簿时只生成1个工作表,避免多余工作表占用资源:
Set newbook = Workbooks.Add(xlWBATWorksheet)
3. SharePoint上传优化
直接调用Excel的SaveAs保存到SharePoint网络路径是耗时最长的核心原因:Excel会边写入边上传,额外开销是本地保存的5~10倍。
优化方案:先保存到本地临时文件夹,再复制到SharePoint路径:
' 先存本地临时目录 Dim tempSavePath As String tempSavePath = VBA.Environ("TEMP") & "\Total_RF_CSV.csv" newbook.SaveAs Filename:=tempSavePath, FileFormat:=xlCSV, Local:=True ' 再复制到SharePoint路径(前提是SharePoint目录已同步到本地资源管理器) FileCopy tempSavePath, "https://website.sharepoint.com/sites/Folder/Shared Documents/Folder/Another Folder/18/Calculators/2021/Folder/work/Total_RF_CSV.csv" ' 删除临时文件 Kill tempSavePath
如果你的SharePoint没有同步到本地,可以映射网络驱动器后再用本地路径复制,速度依然远高于直接SaveAs到网络URL。
三、优化后完整代码
Option Explicit Sub CSVformWorksheet() Dim year As String Dim filetopen As Variant Dim diaFile As FileDialog Dim closedbook As Workbook Dim newbook As Workbook Dim lastRow As Long Dim tempSavePath As String year = Format(Now(), "yyyy") Set diaFile = Application.FileDialog(msoFileDialogFilePicker) With diaFile .AllowMultiSelect = False .InitialFileName = "https://website.sharepoint.com/sites/folders/Shared Documents/Fodler/AnotherFolder/" & year & "/" .Show If .SelectedItems.Count = 0 Then Exit Sub ' 处理用户取消选择的情况 filetopen = .SelectedItems(1) End With If filetopen <> False Then With Application .ScreenUpdating = False .AskToUpdateLinks = False .DisplayClipboardWindow = False .DisplayAlerts = False .EnableAnimations = False .Calculation = xlCalculationManual .EnableEvents = False ' 额外禁用事件,减少不必要触发 End With ' 只读打开源文件 Set closedbook = Workbooks.Open( _ Filename:=filetopen, _ ReadOnly:=True, _ UpdateLinks:=False, _ IgnoreReadOnlyRecommended:=True, _ Visible:=False _ ) ' 新建仅1个工作表的工作簿 Set newbook = Workbooks.Add(xlWBATWorksheet) ' 批量赋值替换复制粘贴 lastRow = closedbook.Sheets("new rates").Cells(closedbook.Sheets("new rates").Rows.Count, "A").End(xlUp).Row newbook.Sheets(1).Range("A1:AW" & lastRow).Value2 = closedbook.Sheets("new rates").Range("A1:AW" & lastRow).Value2 ' 先存本地再传SharePoint tempSavePath = VBA.Environ("TEMP") & "\Total_RF_CSV.csv" newbook.SaveAs Filename:=tempSavePath, FileFormat:=xlCSV, Local:=True FileCopy tempSavePath, "https://website.sharepoint.com/sites/Folder/Shared Documents/Folder/Another Folder/18/Calculators/2021/Folder/work/Total_RF_CSV.csv" Kill tempSavePath ' 关闭文件 closedbook.Close SaveChanges:=False newbook.Close SaveChanges:=False ' 恢复Excel设置 With Application .ScreenUpdating = True .AskToUpdateLinks = True .DisplayClipboardWindow = True .DisplayAlerts = True .EnableAnimations = True .Calculation = xlCalculationAutomatic .EnableEvents = True End With ThisWorkbook.Connections("Query - Total_RF CSV").Refresh MsgBox "File was saved to the folder | Data refreshed", vbInformation End If End Sub
预期提升效果
优化后整体耗时可压缩到2~3分钟以内,其中上传环节可提速70%以上,数据复制环节提速80%以上。
内容的提问来源于stack exchange,提问作者Nikita
相关产品推荐
相关产品推荐

