将UsedRange存入数组能否加速批量文件向中心工作簿的数据传输?
用数组替代Copy方法确实能大幅提升数据传输效率!
绝对可以——而且效率提升非常明显,尤其是当你处理大量数据的时候。我之前踩过类似的坑:用Copy方法导入几万行数据要花好几分钟,换成数组操作后几十秒就完成了,差别特别大。
为什么数组更快?
Copy方法慢主要有这几个原因:
- 它会触发Excel的界面渲染(哪怕你开了
ScreenUpdating=False,底层还是有额外开销) - 依赖剪贴板操作,这会带来额外的系统资源占用
- 需要多次和Excel对象模型交互,而VBA和Excel界面之间的交互本身就是比较耗时的
而数组操作是直接在内存里读写数据,一次性把源区域的数据读入数组,再一次性写入目标工作表,全程只和Excel对象模型交互两次,开销直接降到最低。
你示意代码的问题&正确写法
你的示意代码里赋值逻辑搞反了,而且没处理数组的维度匹配问题。这里给你修正后的完整代码:
Dim sourceWs As Worksheet Dim targetWs As Worksheet Dim dataArr As Variant Dim sourceRange As Range ' 绑定源工作表和目标工作表 Set sourceWs = wb.Worksheets("Sheet1") Set targetWs = wbTemplate.Worksheets(varWsName(i)) ' 获取源数据区域并读入数组 Set sourceRange = sourceWs.UsedRange If Not sourceRange Is Nothing Then ' 处理单个单元格的特殊情况(单个单元格读入的是单个值,不是二维数组) If sourceRange.Cells.Count = 1 Then ReDim dataArr(1 To 1, 1 To 1) dataArr(1, 1) = sourceRange.Value Else dataArr = sourceRange.Value End If ' 把数组写入目标工作表,自动匹配行列大小 With targetWs .Range("A1").Resize(UBound(dataArr, 1), UBound(dataArr, 2)).Value = dataArr End If End If
额外注意事项
- 如果需要保留单元格格式、公式或者条件格式,那数组就不适用了(数组只复制值),这种情况还是得用
Copy或者PasteSpecial - 记得加上
ScreenUpdating=False和EnableEvents=False这些优化开关,配合数组使用效率会更高 - 如果源工作表的
UsedRange可能为空,最好加个判断避免报错
内容的提问来源于stack exchange,提问作者NidenK
相关产品推荐
相关产品推荐

