网易首页 > 网易号 > 正文 申请入驻

VBA 处理同一数据 不同的方法能差30倍

0
分享至

一直以为我的VBA代码已经很成熟了

在处理一个比较复杂的数据流程时,我基本上实现了"一键操作"——8个步骤依次执行,生成报表,全程自动化。

听起来很不错对吧?

但随着数据量的增加,处理速度越来越慢。昨天实际跑了一次:251秒(4.2分钟)



数据流程到底有多复杂?

先说说我每天要面对的数据处理任务:

数据源:4份表

  • 计划表
  • 热区表
  • 冷区表
  • 机组表

需要生成:3份核心表

  • 总表
  • 未分表
  • 已分表

处理步骤:8个独立模块

步骤

功能

操作的表

N01

尺寸提取

计划

N02

批号+炉号合并

热区→总表

N03

前面数据填充

计划→总表

N04

后面数据填充+计算

计划/热区/冷区→总表

N05

切头切尾标记

计划→总表

N06

分班基础数据

总表→未分班/已分班

N07

班次日期写入+重量拆分

机组→已分班

N08

废明细写入

废明细→已分班

数据量:大约1200-1500行,30多列,8个步骤加起来要处理将近30万次单元格操作。

听起来很复杂?确实复杂。但更让人头疼的是速度。

为什么VBA这么慢?

我一开始以为是数据量大的问题。但后来发现,慢的根本原因是读写方式不对

For i = 2 To lastRowdValue = ws.Cells(i, 4).Value      ' 读1个单元格iValue = ws.Cells(i, 9).Value      ' 再读1个result = ExtractNumber(dValue)     ' 处理ws.Cells(i, 26).Value = result     ' 写1个Next i

看起来没问题?实际上,这里藏着一个巨大的性能陷阱。

VBA读写Excel单元格,本质上是跨进程通信。

每次Cells(i,j).Value都要走一遍这个流程:

VBA代码 → COM接口 → Excel引擎 → 内存

一次还好,但一万次呢?

我们的报表里,30万次单元格操作 = 30万次跨进程通信。

每次通信约0.001-0.002秒,再算上Excel的计算、屏幕刷新、格式检查...

251秒,一点不少。。。。
打个比方:

  • 不用数组:每次从北京搬1块砖到上海,搬了30万趟
  • 用数组:一次把30万块砖装进集装箱,一次性运过去(一位大佬给我的回复。)
大佬的提醒:"数组"

在以前文章评论区,有位大佬留下一句话:"为什么不用数组"

我开始上网查资料,发现数组才是处理大批量数据的王。

数组优化的核心就一句话:

一次读入,内存处理,一次写回。

' 改成数组版本Dim dataArr As Variant' 一次性读取所有数据dataArr = ws.Range("A3:Z" & lastRow).ValueFor i = 1 To UBound(dataArr, 1)' 所有操作都在内存数组中完成dValue = dataArr(i, 4)iValue = dataArr(i, 9)result = ExtractNumber(dValue)dataArr(i, 26) = resultNext i' 一次性写回ws.Range("A3:Z" & lastRow).Value = dataArr

COM调用次数从30,000次骤降到3次(读1次 + 写1次,再加上一次数组赋值)。

速度差距,就是这么来的。

分批改造的过程第一步:先挑简单的改

N01(数据提取写入)是最简单的,只有一个循环,没有复杂的逻辑。先用它做实验。

' 原版:15秒Sub N01原版()For i = 1 To lastRowws.Cells(i, 26) = ExtractNumber(ws.Cells(i, 4))Next iEnd Sub' 数组版:0.8秒Sub N01数组版()dataArr = ws.Range("A3:Z" & lastRow).ValueFor i = 1 To UBound(dataArr, 1)dataArr(i, 26) = ExtractNumber(dataArr(i, 4))Next iws.Range("A3:Z" & lastRow).Value = dataArrEnd Sub

从15秒到0.8秒,18倍提升

第二步:改N04(最复杂的核心步骤)

N04要同时查3个表(计划、热区、冷区),原来需要40多秒。这是最大的瓶颈。

改完后实测:从40秒降到2秒

第三步:翻车时刻——数组不是万能药

N07(已分班日期写入)是8个步骤里最复杂的,涉及到:

  • 从机组表匹配班次
  • 插入新行(Rows.Insert)
  • 复制行数据(Rows.Copy)
  • 按支数比例拆分重量
  • 桔黄色标记分班数据
  • 补全空值、写入公式

我试了三次改写成数组版,每次都以数据错乱告终。

第一次:数据全部丢失
第二次:数据重复,翻了一倍
第三次:格式全乱,颜色标记消失

结论:当涉及到插入行、复制行、动态行号变化时,数组版的风险极高。

我选择了认怂——N07保持原始代码。与其为了快30秒冒着数据全乱的风险,不如接受这3-5秒的代价。(这里请大佬请点一二 有没有什么好办法处理!)

最终结果对比

版本

耗时

数据准确性

结论

原始VBA

251秒

✅ 准确

太慢

全数组版

5秒

❌ 数据错乱

不能用

混合方案

10秒

✅ 准确

生产可用

各步骤详细对比

步骤

原版耗时

数组版耗时

提升

N01

15秒

0.8秒

18倍

N02

10秒

0.7秒

14倍

N03

20秒

1秒

20倍

N04

40秒

2秒

20倍

N05

10秒

0.5秒

20倍

N06

15秒

0.8秒

18倍

N07

50秒

保持原版

N08

30秒

保持原版

总计

190秒

~10秒

19倍

从251秒到10秒,提升了25倍!

给同样在学习VBA的朋友的建议

1、不要想着一次性完成所有的工作,那是大佬们的操作,我们可以一步一步的分步骤来来拆分。
可以分为N个步骤来完成。

2、一步一步来调试,完成一步保存一步。最终也可以成功。。最后可以加一个"主控"来实现一键操作。

3、学以致用,我用得到的我去学习,用不到,可以先了解。就和这次的“数组”,不知道的时候,就只会认为VBA就是这么个速度。知道了,学习了,才知道“数组”,能让VBA的速度这么快。

4、复杂逻辑别硬上数组

当涉及到Rows.Insert、Rows.Copy时,数组处理极其复杂,风险极高。

什么时候该用数组?什么时候不该?

场景

建议

大量单元格读写

✅ 用数组

纯数据循环处理

✅ 用数组

需要插入/删除行

⚠️ 谨慎使用

需要复制行数据

⚠️ 谨慎使用

涉及行号动态变化

⚠️ 谨慎使用

总结

对比维度

不用数组

用数组

差距

单次读写

跨进程通信

内存操作

1000倍+

1000行×30列

30,000次通信

2次通信

15,000倍

实际耗时

190-251秒

10秒

19-25倍

代码复杂度

简单

稍复杂

可接受

风险

中(需测试)

从251秒到10秒,不是魔法,只是把"每次搬一块砖"变成了"一次搬一车砖"。

如果你的VBA代码还在逐行读写单元格,花一个下午改造一下,省下4分钟,也给自己省下一份焦虑。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
一天内两名人离世,最大97岁,无儿无女成遗憾

一天内两名人离世,最大97岁,无儿无女成遗憾

眼底星碎
2026-08-12 14:42:37
千里探亲反被亲戚丢弃,俩娃几天没吃饭饿到发昏,结局太暖心

千里探亲反被亲戚丢弃,俩娃几天没吃饭饿到发昏,结局太暖心

大鱼简科
2026-08-12 09:36:51
知名演员贾冰首度回应“私人饭局爆粗口被偷拍曝光”:这两天的热搜快给我热馊了,网友都很支持我,但我确实没爆粗口啊

知名演员贾冰首度回应“私人饭局爆粗口被偷拍曝光”:这两天的热搜快给我热馊了,网友都很支持我,但我确实没爆粗口啊

极目新闻
2026-08-12 15:16:00
涉嫌严重违纪违法,汪应兵被查

涉嫌严重违纪违法,汪应兵被查

都市快报橙柿互动
2026-08-12 13:15:21
《披荆斩棘6》邵兵官宣退赛,被指是为了保住年轻的哥哥?

《披荆斩棘6》邵兵官宣退赛,被指是为了保住年轻的哥哥?

楚楚号
2026-08-13 06:51:36
24小时卖命、洗内裤接口水、浴缸陪睡,多位助理反水曝特殊服务

24小时卖命、洗内裤接口水、浴缸陪睡,多位助理反水曝特殊服务

看尽落尘花q
2026-08-08 05:26:21
程梦圆遗体寻获不足24小时,恶心行为遭队长怒斥

程梦圆遗体寻获不足24小时,恶心行为遭队长怒斥

明天去看太阳
2026-08-12 00:45:08
打奉陪到底,中方连下3条禁令,堵死所有后路?对华鹰派急着访华

打奉陪到底,中方连下3条禁令,堵死所有后路?对华鹰派急着访华

混沌录
2026-08-12 20:01:13
太自律!汪小菲官宣九月赴法进修,全家全员上进难怪越做越好

太自律!汪小菲官宣九月赴法进修,全家全员上进难怪越做越好

微风轻拂面
2026-08-13 07:11:49
2026暑期档票房超90亿:沈腾主演《欢迎来龙餐馆》仅2天杀入前5

2026暑期档票房超90亿:沈腾主演《欢迎来龙餐馆》仅2天杀入前5

快科技
2026-08-13 07:31:04
“我对他没有一点母爱了!”妈妈直言厌恶3岁儿子,网友一反常态

“我对他没有一点母爱了!”妈妈直言厌恶3岁儿子,网友一反常态

妍妍教育日记
2026-07-10 08:45:08
WTT瑞典大满贯:8月13日凌晨最新战报!国乒15胜,两大世界冠军惨败

WTT瑞典大满贯:8月13日凌晨最新战报!国乒15胜,两大世界冠军惨败

陈錈爱体育
2026-08-13 04:51:48
DeepSeek V4 Pro正式版深夜“突袭”:多项测试逼近Fable 5,撞车Grok 4.6

DeepSeek V4 Pro正式版深夜“突袭”:多项测试逼近Fable 5,撞车Grok 4.6

华尔街见闻官方
2026-08-13 02:00:57
天坛公园用海绵吸水挤到桶里引关注,回应:铺的“金砖”,海绵可减小伤害

天坛公园用海绵吸水挤到桶里引关注,回应:铺的“金砖”,海绵可减小伤害

潇湘晨报
2026-08-12 17:05:14
特朗普身边“最年轻发言人”月底卸任,不退出政坛,直接转战选举

特朗普身边“最年轻发言人”月底卸任,不退出政坛,直接转战选举

桂系007
2026-08-13 03:58:17
特朗普终于犯下错,最致命错误!美专家曾言:中国啥都没做就赢了

特朗普终于犯下错,最致命错误!美专家曾言:中国啥都没做就赢了

乐界品鉴官
2026-08-12 15:30:41
Alo入华首秀爆了:1分钟成交破千万元,黄牛热炒限量帆布包,义乌已出现“自创款”

Alo入华首秀爆了:1分钟成交破千万元,黄牛热炒限量帆布包,义乌已出现“自创款”

时代周报
2026-08-12 18:12:24
中超争议判罚评议结果出炉:克雷桑绝杀天津进球没任何问题

中超争议判罚评议结果出炉:克雷桑绝杀天津进球没任何问题

臻体育
2026-08-12 22:17:23
拉塞尔·威斯布鲁克退役,历史地位不输勒布朗·詹姆斯

拉塞尔·威斯布鲁克退役,历史地位不输勒布朗·詹姆斯

好火子
2026-08-13 04:56:23
26年深大新生数据出炉!深圳两大高中破百,谁是深大最大生源校?

26年深大新生数据出炉!深圳两大高中破百,谁是深大最大生源校?

一口娱乐
2026-08-13 00:21:09
2026-08-13 08:39:00
侃故事的阿庆
侃故事的阿庆
几分钟看完一部影视剧,诙谐幽默的娓娓道来
761文章数 9192关注度
往期回顾 全部

科技要闻

DeepSeek V4 Pro正式版深夜"突袭"

头条要闻

男子不堪炸街噪音刺死途经骑行辅警 不服死刑判决上诉

头条要闻

男子不堪炸街噪音刺死途经骑行辅警 不服死刑判决上诉

体育要闻

杜兰特,所谓的“联盟小王”

娱乐要闻

老戏骨杨昆两夺金鹰奖,因物业费被告

财经要闻

韩国可能迎来失去的三十年

汽车要闻

全系600km续航/空间表现出色 奇瑞风云T7预售10.99万起

态度原创

旅游
数码
教育
艺术
公开课

旅游要闻

贵州大小井景区“拦路收费”处置进展:将对社会车辆开放通行

数码要闻

王思聪5年前配的100万电脑今天值多少钱?对比后惊了

教育要闻

中考几何,求角A的度数,很多人不会求

艺术要闻

赏心悦目的色调,看了非常治愈!

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版