ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: ljy688

[求助] 不少版主看后都认为超难:全表代码寻优化提速,已写功能需求及原始数据清单

[复制链接]

TA的精华主题

TA的得分主题

发表于 2010-12-7 22:26 | 显示全部楼层
都在这里忽悠?

哈哈

TA的精华主题

TA的得分主题

发表于 2010-12-7 22:45 | 显示全部楼层
原帖由 excelflower 于 2010-12-7 21:15 发表

也不是绝对的,例如操作格式,就无法避免。
老师是说尽量用数组、字典,把数据读取到内存中,然后比较分析,再把结果、一次性写入工作表。【在内存中读取值和赋值的速度,远远快于工作表的读写】
COPY、PASTE,有 ...


单元格的格式为什么要在VBA去做???

而且Application.Union可以把多个不相邻的range,当作一个去处理,永远没必要逐个单元格去搞。。。。。。

[ 本帖最后由 灰袍法师 于 2010-12-7 22:47 编辑 ]

TA的精华主题

TA的得分主题

发表于 2010-12-7 22:50 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
原帖由 灰袍法师 于 2010-12-7 22:45 发表


单元格的格式为什么要在VBA去做???

而且Application.Union可以把多个不相邻的range,当作一个去处理,永远没必要逐个单元格去搞。。。。。。

多谢老师赐教 学生又进步啦

TA的精华主题

TA的得分主题

发表于 2010-12-7 23:18 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
问个傻问题:
UNION多个RANGE之后的区域能赋值给数组么?

TA的精华主题

TA的得分主题

发表于 2010-12-7 23:54 | 显示全部楼层
学习了。
有个问题,即使是数组,也有静态和动态的,占用内存多,也是很影响速度的吧?

TA的精华主题

TA的得分主题

发表于 2010-12-7 23:59 | 显示全部楼层
原帖由 AVEL 于 2010-12-7 23:18 发表
问个傻问题:
UNION多个RANGE之后的区域能赋值给数组么?

好像只能得到第一个range的值.

TA的精华主题

TA的得分主题

发表于 2010-12-8 00:00 | 显示全部楼层
原帖由 朗儒月 于 2010-12-7 23:54 发表
学习了。
有个问题,即使是数组,也有静态和动态的,占用内存多,也是很影响速度的吧?

这点影响是毛毛雨啦.

TA的精华主题

TA的得分主题

发表于 2010-12-8 00:02 | 显示全部楼层

回复 57楼 朗儒月 的帖子

呵呵 能占用多大的内存啊。

现在一般电脑的内存都到2G了,还怕这点占用。?

TA的精华主题

TA的得分主题

发表于 2010-12-8 01:28 | 显示全部楼层
原帖由 AVEL 于 2010-12-7 23:18 发表
问个傻问题:
UNION多个RANGE之后的区域能赋值给数组么?


可以,不过如果RANGE是不相邻的区域,或者相邻但是合并后的形状不是矩形,那么只有第一个区域会赋值给数组

另外,如果是相邻的区域而且形成一个矩形区域,那么所有区域都会赋值给数组
请在A1:C3区域填入某些数据,然后执行下面代码,观察arr的变化

Dim rng1 As Range, rng2 As Range, rng3 As Range, rng As Range, arr
Set rng1 = Range("A1:A3")
Set rng2 = Range("B1:c1")
Set rng3 = Range("b2:C3")

Set rng = Application.Union(rng2, rng3)
arr = rng.Value

Set rng = Application.Union(rng, rng1)

arr = rng.Value
...............................
下面是个作业,excelflower做一下,看看是不是真的懂

A列有100个随机整数,范围是0-100,写个程序把所有 <60的单元格设置为红色

嗯,正确地完成以后,为了证明程序速度很快,把A列改为10000个随机整数,再运行一次。。。。。。嘿嘿嘿

是的,我知道条件格式很轻松就能完成,这也是为什么我们根本不需要在VBA里面处理格式问题

[ 本帖最后由 灰袍法师 于 2010-12-8 02:03 编辑 ]

TA的精华主题

TA的得分主题

发表于 2010-12-8 01:51 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
原帖由 朗儒月 于 2010-12-7 23:54 发表
学习了。
有个问题,即使是数组,也有静态和动态的,占用内存多,也是很影响速度的吧?


正如camle和AVEL筒子在上面指出的一样

内存浪费很少是需要我们去考虑的,我前面的附件就犯了担心内存不足的错误,导致代码更加复杂(所谓的过度设计)

一般来说,同样的数据,放在Excel工作表单元格里面,占用内存 >=  放在VBA数组里面

只复制一两份的话,本来Excel工作表就已经占用这么多内存了,再多2-3倍肯定也是没问题的。

所以除非你要把几百万个单元格复制十几份(不是十几次啊,而是同时存在多个副本),否则都不用担心内存不足

反倒是节约内存的动态数组,如果不断地redim,那么速度是会受到影响,大概每redim 100万次需要几十秒吧,也不算很严重。

一个折中的方案是,采用动态数组,但是每次redim都增加1000个记录,而不是1个,那么就可以大大减少redim的次数,又保证浪费内存不会超过1000个记录的大小,缺点呢:当然就是你要自己记录数组的最后一条记录在哪里,不能直接用ubound了。

[ 本帖最后由 灰袍法师 于 2010-12-8 02:00 编辑 ]
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-25 08:59 , Processed in 0.038555 second(s), 6 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表