[点晴永久免费OA]【VBA】百万行 Excel 秒级处理:从「系统假死」到「降维打击」的效率革命

' 关键动作:不再逐行读取,而是「一举吞噬」Dim dataBuffer As VariantdataBuffer = ws.Range("A2:C1000000").Value
' 关键动作:在内存中利用字典实现 O(1) 查找For i = 1 To UBound(dataBuffer, 1) Dim key As String: key = dataBuffer(i, 2) ' 字典映射:瞬间定位数据位置,无需循环搜索 dict(key) = dict(key) + dataBuffer(i, 3) Next i
' 关键动作:最后的一记重拳,仅需一次 I/O 交互ws.Range("E2").Resize(dict.Count, 2).Value = resultMatrix
| 维度 | 传统模式 (Cells) | 巅峰路径 (Memory Array) |
|---|---|---|
| I/O 交互 | 1,000,000 次(极其昂贵) | 2 次(读 1 次,写 1 次) |
| 搜索算法 | 线性搜索 $O(n^2)$ | 哈希索引 $O(1)$ |
| 界面负载 | 频繁触发重绘与事件 | 零触发(静默处理) |
| 百万行表现 | 约 250 秒 / 软件假死 | 约 3 秒 / 瞬时完成 |
Sub Performance_Master_V2() Dim startTime As Double: startTime = Timer Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets(1) ' 环境优化:进入「静默模式」 Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Application.EnableEvents = False ' 第一步:入库(一键读取百万行) Dim lastRow As Long: lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row Dim rawData As Variant: rawData = ws.Range("A2:C" & lastRow).Value ' 第二步:内化(利用字典进行哈希汇总) Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary") Dim i As Long For i = 1 To UBound(rawData, 1) Dim product As String: product = rawData(i, 2) dict(product) = dict(product) + rawData(i, 3) Next i ' 第三步:投弹(构造数组并一次性回写) Dim res() As Variant: ReDim res(1 To dict.Count, 1 To 2) Dim k As Variant, idx As Long: idx = 1 For Each k In dict.Keys res(idx, 1) = k: res(idx, 2) = dict(k): idx = idx + 1 Next k ws.Range("E2").Resize(dict.Count, 2).Value = res ' 恢复环境 Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic Application.EnableEvents = True MsgBox "处理百万行数据耗时:" & Format(Timer - startTime, "0.00") & " 秒"End Sub
阅读原文:https://mp.weixin.qq.com/s/CaloprBXidQRf2GeZ4-KvQ