|
本帖最后由 香川群子 于 2013-4-6 17:07 编辑
liucqa 发表于 2013-4-6 11:21
你用vb指针测试一下数组的速度
呵呵,如果是用工作表函数Max求VBA内存数组的最大值,
速度显然没有VBA内存数组直接For……Next循环快。(数组循环速度最快)
但是,如果同样使用工作表函数Max,但【求和对象】为【工作表单元格区域】的引用时,
则速度会比VBA内存数组直接For……Next循环【更快】。
这可能不符合很多人的常识,但事实如此。
推测或许Excel在把数据写入工作表单元格内时,已经做了一些数值计算、统计的工作,方便引用。
因此速度加快。- Sub test()
-
- Dim i&, j&, k&, m&, n&
-
- m = 10000 '数据行数m
- n = 100 '数据列数n
- ReDim arr&(1 To m, 1 To n)
- For i = 1 To m
- For j = 1 To n
- arr(i, j) = Rnd * 16777216
- Next
- Next
- [a1].Resize(m, n) = arr '产生随机数并写入工作表【这很重要!】
-
-
- '以下为速度比较:
- Dim ii&, nn&, tms
- nn = 1 '速度比较重复次数nn,可以调整
-
- tms = Timer
- For ii = 1 To nn
- k = Application.Max(arr) '用工作表函数Max检查【VBA数组】的最大值
- ' k = WorksheetFunction.Max(arr)
- Next
- MsgBox "工作表Max求数组对象 耗时:" & vbCr & Format(Timer - tms, "0.000s ") & k
-
- tms = Timer
- For ii = 1 To nn
- k = Application.Large(arr, 1) '用工作表函数Large检查【VBA数组】的最大值
- ' k = WorksheetFunction.Large(arr, 1)
- Next
- MsgBox "工作表Large求数组对象 耗时:" & vbCr & Format(Timer - tms, "0.000s ") & k
-
- tms = Timer
- For ii = 1 To nn
- k = Application.Large(Range("A1").Resize(m, n), 1) '用工作表函数Large检查【区域】的最大值
- Next
- MsgBox "工作表Large求Range区域 耗时:" & vbCr & Format(Timer - tms, "0.000s ") & k
-
- tms = Timer
- For ii = 1 To nn
- k = Application.Max(Range("A1").Resize(m, n)) '用工作表函数Max检查【区域】的最大值
- Next
- MsgBox "工作表Max求Range区域 耗时:" & vbCr & Format(Timer - tms, "0.000s ") & k
- '因为可以直接利用工作表内容,所以速度提高!
- '推测是数据写入工作表函数的过程中,Excel已经做了很多基础工作,包括求总和所以速度更快。
-
-
- tms = Timer
- For ii = 1 To nn
- k = 0
- For i = 1 To m
- For j = 1 To n
- If arr(i, j) > k Then k = arr(i, j) '数组循环比较查找最大值
- Next
- Next
- Next
- MsgBox "数组循环比较 耗时:" & vbCr & Format(Timer - tms, "0.000s ") & k
-
-
- End Sub
复制代码
测试时,可以按以下组合:
1. m=10000: n=1 即1万行1列时: 速度比较循环次数 nn=100
2. m=10000: n=10 即1万行10列时: 速度比较循环次数 nn=10
3. m=10000: n=100 即1万行100列时: 速度比较循环次数 nn=1
结果都是: 工作表Max函数求Range区域对象的最大值时,速度比VBA内存数组的For……Next遍历比较还要快!
而且,已经dim arr()为长整型,更加方便VBA中数组的运算效率了。
|
|