从另一工作簿复制缺失数据:VBA代码优化提速请求
优化VBA代码提升对比效率
原代码的核心问题是双重循环遍历两个工作表,当数据量达到4000行时,最多会执行1600万次循环操作,这是导致速度慢的根本原因。下面提供针对性优化方案,尤其是用字典替代循环查找,能大幅提升运行效率。
一、基础性能优化开关
先加上这些通用的VBA提速设置,减少Excel后台操作开销:
' 开启性能优化 Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Application.EnableEvents = False
操作完成后必须恢复这些设置(即使代码出错也要恢复,避免Excel异常):
' 恢复默认设置 On Error Resume Next Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic Application.EnableEvents = True On Error GoTo 0
二、用字典(Dictionary)替代双重循环
字典是哈希表结构,查找元素的时间复杂度为O(1),能彻底避免嵌套循环的低效问题。完整优化代码如下:
Sub AddMissing() Dim wb1 As Workbook, wb2 As Workbook Dim ws1 As Worksheet, ws2 As Worksheet Dim lrow1 As Long, lrow2 As Long Dim i As Long Dim dict As Object ' 后期绑定,无需额外引用库 ' 开启性能优化 Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Application.EnableEvents = False ' 初始化工作簿和工作表 Set wb1 = Workbooks("Testbook1.xlsx") Set wb2 = Workbooks("Testbook2.xlsx") Set ws1 = wb1.Sheets("Sheet1") Set ws2 = wb2.Sheets("Sheet1") Set dict = CreateObject("Scripting.Dictionary") ' 获取最后一行行号 lrow1 = ws1.Cells(Rows.Count, 5).End(xlUp).Row lrow2 = ws2.Cells(Rows.Count, 5).End(xlUp).Row ' 将wb1的E列数据加载到字典(键为值,值设为True标记存在) For i = 2 To lrow1 If Not dict.Exists(ws1.Cells(i, 5).Value) Then dict.Add ws1.Cells(i, 5).Value, True End If Next i ' 遍历wb2的E列,查找缺失值并复制到wb1 For i = 2 To lrow2 If Not dict.Exists(ws2.Cells(i, 5).Value) Then lrow1 = lrow1 + 1 ' 更新wb1的最后一行 ws1.Cells(lrow1, 5).Value = ws2.Cells(i, 5).Value dict.Add ws2.Cells(i, 5).Value, True ' 避免重复添加相同值 End If Next i ' 恢复默认设置 On Error Resume Next Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic Application.EnableEvents = True On Error GoTo 0 MsgBox "缺失数据补充完成!" End Sub
优化说明
- 字典存储:先把wb1的E列所有值存入字典,后续只需通过
dict.Exists()就能瞬间判断值是否存在,无需再循环wb1的每一行。 - 避免重复操作:每添加一个缺失值到wb1后,同步更新字典,防止后续重复添加相同值。
- 性能开关:关闭屏幕更新、自动计算和事件响应,减少Excel在后台的不必要操作,进一步提速。
内容的提问来源于stack exchange,提问作者Cortex9000
相关产品推荐
相关产品推荐

