通信人家园

 找回密码
 注册

只需一步,快速开始

短信验证,便捷登录

搜索

军衔等级:

  四级通信军士

注册:2005-6-15
跳转到指定楼层
1#
发表于 2009-10-17 08:54:28 |只看该作者 |倒序浏览
本文转自:http://www.officefans.net/cdb/viewthread.php?tid=64569

       很多朋友已习惯用数组方法来写vba,而且功力深厚,运行的速度教人羡慕,因小弟系初学,故以这个专题,抛砖引玉,请朋友们尽情发挥,嘉惠我等后学末进。
我们就以一个简单的例子开始。把一列数字中的双数数字取出来。如取2,4,6…
附件中有4个按钮,第一个按钮是在a列产生数据,也许太整齐,不过没关系,我们要的是后面取双数值的方法。第二个按钮是传统循环方式取a列的双数值到b列。

Dim i&, j&, t!
t
= Timer
For i = 1 To 60000
   
If Cells(i, 1) Mod 2 = 0 Then
         j
= j + 1
         Cells(j,
2) = Cells(i, 1)
   
End If
Next i
MsgBox Timer - t


很慢吧?这还是数字的处理,若是处理文本起来那會更慢的。
接着我们看第三个按钮,换成简单的数组方式编辑:

Dim i&, j&, t!, c(1 To 60000) As Long '定义c为1到60000的一维数组
t = Timer
For i = 1 To 60000
   
If Cells(i, 1) Mod 2 = 0 Then
         j
= j + 1
         c(j)
= Cells(i, 1) '把符合的加到数组
    End If
Next i
[c1].Resize(j,
1) = Application.Transpose(c) '一维数组是横向的,故须要转排
MsgBox Timer - t



是否快了不少?这就是数组的优势了,这里示范的是直接在单元格中判断存取,
有一点值得注意的是:excel对工作表上单元格的存取速取远逊于对内存数组的存取速度,所以接着在下面第4个按钮我们尝试把存取范围置入内存数组中:

Dim i&, j&, t!, rng, c() As Long
t
= Timer
rng
= [a1:a60000] '先把数据放到内存数组中
For i = 1 To 60000
   
If rng(i, 1) Mod 2 = 0 Then
         j
= j + 1
        
ReDim Preserve c(1 To j) '因为不能预知数组大小,所以定义动态数组范围
         c(j) = rng(i, 1)
   
End If
Next i
[d1].Resize(j,
1) = Application.Transpose(c)
MsgBox Timer - t



您会发现,这个改变又使速度提升了十几倍。还有再优化的空间吗?肯定是有的,请愿意分享的朋友们一起来发挥吧。至于内存数组须不须要释放?那得看过程的情况,通常过程结束后会自动释放的。

举报本楼

您需要登录后才可以回帖 登录 | 注册 |

手机版|C114 ( 沪ICP备12002291号-1 )|联系我们 |网站地图  

GMT+8, 2024-11-16 01:45 , Processed in 0.284273 second(s), 15 queries , Gzip On.

Copyright © 1999-2023 C114 All Rights Reserved

Discuz Licensed

回顶部