作者marki (marki)
看板Office
标题[算表] 请问vba的效能问题
时间Thu Jan 26 09:57:15 2017
软体: Excel
版本: Mac Office 365
各位大大好
小弟刚开始摸索vba
在网路上看到这样一篇文章
http://m.wangchao.net.cn/it/tcdetail_57466.html
大约在文章的1/5位置 有提到
=======================================
本技巧用于优化在Excel和代码之间转换数据的次数。使用数组变量存储所需要的值并执行取值或赋值操作,而不是一次遍历单个单元格并获取或设置单个值。
例如,下面的代码在单元格区域A1:C10000中放置随机数。
代码段一:运行速度较慢的代码
Sub testSlow()
Dim DataRange As Range
Dim Irow As Long
Dim Icol As Integer
Dim MyVar As Double
Set DataRange = Range("A1:C10000")
For Irow = 1 To 10000
For Icol = 1 To 3
MyVar = DataRange(Irow, Icol) '从Excel单元格中读取值30K次
If MyVar > 0 Then
MyVar = MyVar * MyVar ' 改变值
DataRange(Irow, Icol) = MyVar '将值写入Excel单元格中30000次
End If
Next Icol
Next Irow
End Sub
代码段二:运行速度更快的代码
Sub testFast()
Dim DataRange As Variant
Dim Irow As Long
Dim Icol As Integer
Dim MyVar As Double
DataRange = Range("A1:C10000").Value '一次从Excel单元格中读取所有的值,将其放入数组
For Irow = 1 To 10000
For Icol = 1 To 3
MyVar = DataRange(Irow, Icol)
If MyVar > 0 Then
MyVar = MyVar * MyVar ' 改变数组中的值
DataRange(Irow, Icol) = MyVar
End If
Next Icol
Next Irow
Range("A1:C10000").Value = DataRange '一次将所有结果写回单元格
End Sub
=======================================
简单的summary一下我的观察
第一段的程式码就是让电脑读进每一储存格的数据 计算後直接写进储存格
第二段的程式码是让电脑读进每一储存格的数据 先存於阵列(应该就是中国
所称的数组吧)。於阵列中计算後再存进储存格。
我的疑问是这样看起来。不论是第一段或是第二段的程式码应该都需要把储存
格的内容读进记忆体。而第二段程式码还需要多增加一个阵列变数的记忆体。
这样为什麽会比较快啊?
谢谢大家
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 36.239.223.196
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Office/M.1485395842.A.158.html
1F:→ Catbert: 因为"写入储存格"这个动作很花时间 01/26 15:01
2F:推 waiter337: 读资料都很快,但是写资料....超级久 01/26 19:42
3F:→ waiter337: 而且一次贴上10000个资料跟一次贴上一个资料做10000次 01/26 19:43
4F:→ waiter337: 时间後者又更长到夸张,前者可能5秒,後者可能3000秒 01/26 19:43
5F:→ waiter337: 所以超过1000列的资料,基本上都改用阵列,在一次贴上最 01/26 19:44
6F:→ waiter337: 快 01/26 19:44
7F:→ marki: 谢谢 01/26 21:50
8F:推 nicegigi: 太神了 03/08 23:07