ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 33889|回复: 56

[讨论] VBA数组运算速度 - ReDim 和 ReDim Preserve 速度对比

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2013-5-5 18:56 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
      这几天,在学习VBA数组,找了很多资料,关于在VBA数组运算中,再深入提高速度的资料比较少!这几天,在香川群子等多位老师的指导下和下面一个测试时间的实例,和大家分享在VBA数组中再深入提高速度要注意的方面!希望各位经验非富的前辈们,也能讨论一下,在vba数组中提速的经验,让我们这些初学能速度提高!在此谢谢大家了!

例1:香川群子老师:  数组中运用函数影响速度
  http://club.excelhome.net/thread-1006177-2-1.html

例2:ReDim 和 ReDim Preserve  速度对比
ReDim 和 ReDim Preserve  速度对比.jpg 这是我机子测试出来的时间!
Sub ReDim_Preserve1维()
Dim arr(), i%, k%, sj As Double
[a1] = "测试内容"
[b1] = "测试时间"
sj = Timer
For k = 1 To 500
    For i = 1 To 20000
    ReDim Preserve arr(1 To i)
    Next
Next
[B2] = Timer - sj
[a2] = " 1维 ReDim Preserve"
Redim1维
ReDim_Preserve2维
Redim2维
Beep
End Sub
'

Sub Redim1维()
Dim arr(), k%, sj As Double
sj = Timer
For k = 1 To 500
    ReDim arr(1 To 20000)
Next

[B3] = Timer - sj
[a3] = " 1维 Redim"
End Sub
'

Sub ReDim_Preserve2维()
Dim arr(), i%, sj As Double
sj = Timer
    For i = 1 To 2000
    ReDim Preserve arr(1 To 2000, 1 To i)
    Next   
[B4] = Timer - sj
[a4] = " 2维 ReDim_Preserve"
End Sub
'
Sub Redim2维()
Dim arr(), sj As Double
sj = Timer
    ReDim arr(1 To 2000, 1 To 2000)
[B5] = Timer - sj
[a5] = " 2维 Redim"
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-5-5 19:11 | 显示全部楼层
邀请收到,这个问题论坛上好像讨论过,关键字Preserve 影响速度,应尽量避免使用它
如果我们知道数组的最大下标取值范围,可直接声明固定数组,或仅使用一次ReDim
1、最大下标取值范围是常数
Dim arr(1 To 20000)
2、最大下标取值范围是变量
Dim arr()
lr = Range("a65536").End(xlUp).Row
ReDim arr(1 To lr)

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-5-5 19:45 | 显示全部楼层
收到邀请了。Preserve  关键字俺用到的情况比较少,经验不够,准备写写试验一下。
赵老师,裙子老师这些高手参与讨论,俺跟着学习学习也是很有益处。
感谢

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-5-5 19:56 | 显示全部楼层
zhaogang1960 发表于 2013-5-5 19:11
邀请收到,这个问题论坛上好像讨论过,关键字Preserve 影响速度,应尽量避免使用它
如果我们知道数组的最大 ...

赵老师:
       用您的关键字,我搜过了,找到一些关于速度方面的,先整理在此,以后有找到再加上!
1. 数组数据类型定义对速度的影响(老鸟绕道)
       http://club.excelhome.net/thread-646030-1-1.html

2.有提到不提倡用preserve

      2.1  如何实现动态数组存储一下每一行哪一列中存储了什么数据?          
             http://club.excelhome.net/thread-944809-1-1.html
      2.2  动态数组与固定数组速度比较
             http://club.excelhome.net/thread-998348-1-1.html

3.把数据放入数组中,然后一次性回写单元格,提高速度

      3.1 数组写单元格的问题!   
            http://club.excelhome.net/thread-861667-1-1.html
      3.2 优化代码提高效率---期待高手指点!
            http://club.excelhome.net/thread-866924-1-1.html



补充内容 (2013-9-25 23:59):
ReDim Preserve解决,已装入单元格的数组改变末维的大小的方法!
http://club.excelhome.net/thread-1058630-1-1.html

TA的精华主题

TA的得分主题

发表于 2013-5-5 19:56 | 显示全部楼层
一个简单的道理是多一道工序就多一份时间,不知道这个理在此地是否行得通。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-5-5 20:03 | 显示全部楼层
maditate 发表于 2013-5-5 19:56
一个简单的道理是多一道工序就多一份时间,不知道这个理在此地是否行得通。

我有个想法,对照您的意思,你看对吗?
1、如果,没必要在循环中处理的的值,就放到循环外,不能图方便查阅,就把一类内容放一起!

TA的精华主题

TA的得分主题

发表于 2013-5-5 20:06 | 显示全部楼层
jinbo3535 发表于 2013-5-5 20:03
我有个想法,对照您的意思,你看对吗?
1、如果,没必要在循环中处理的的值,就放到循环外,不能图方便查 ...

现在的电脑不必十年前的电脑,运行速度足够快,只要你愿意不必循环的放进循环也没问题。只要结果不错就行。

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-5-5 20:18 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
maditate 发表于 2013-5-5 20:06
现在的电脑不必十年前的电脑,运行速度足够快,只要你愿意不必循环的放进循环也没问题。只要结果不错就行 ...

谢谢您,明白了!

TA的精华主题

TA的得分主题

发表于 2013-5-5 21:46 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 香川群子 于 2013-5-6 22:55 编辑

使用VBA内存数组时,读、写入数组时首先需要检索行、列位置。

而数组中定位置也并非人类脑子中想一想那么简单,
实际上是要用到二分法查找定位的。

比如,dim arr(1 to 100, 1 to 2)

tmp = arr(20,1) 这么简单一句要求,
但电脑计算机并不能直接定位到第20行、第1列。
而是要先计算该数组的一半 = 50,然后发现 20<50
于是接着计算50的一半 = 25,然后发现 20<25
于是接着计算25的一半 = 12,然后发现 20>12
于是接着计算12 -25 的一半 = 18,然后发现 20>18
…………
<50 →<25 →>12 →>18 →<21 →>19 →=20

这样子经过6步计算最后才定位到arr(20,1) 的。

…………
听上去挺麻烦的……但已经比从1 开始 逐个遍历直至找到20要快一些了。


因此,你当然可以理解下述结果:
一维数组显然要比二维数组速度更快一些。因为只需确定1个列位置就够了,少了一次定位计算。



这个可能是错误的……我似乎有关于VBA中也用到二分法的例子,但一下子找不出来了啊。
暂且不删。


评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-5-5 22:37 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
香川群子 发表于 2013-5-5 21:46
使用VBA内存数组时,读、写入数组时首先需要检索行、列位置。

而数组中定位置也并非人类脑子中想一想那么 ...

原来计算机是这样运算的!老师,您不说,这些资料应该很难找到的!谢谢你···
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-4-28 07:22 , Processed in 0.042792 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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