ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[Excel 程序开发] [开_80]速度速度速度!大家都来比一比![已总结]

[复制链接]

TA的精华主题

TA的得分主题

发表于 2006-2-16 11:12 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

4秒钟,够不够快?

还不够?有时3秒它就结束了.

由于4列合填满数据,文件较大,所以删了不少.不可检查时可以先运算你的写数据,再点run按钮.

ZY4wMk48.rar (25.72 KB, 下载次数: 54)


TA的精华主题

TA的得分主题

 楼主| 发表于 2006-2-17 10:12 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

to:shuyee

此答案正确!只是代码中过多的使用辅助单元格和公式往往会影响速度,尽管如此代码仍有可借鉴之处,前面朋友提供的一些答案可供你进一步参考。

TA的精华主题

TA的得分主题

发表于 2006-2-17 10:30 | 显示全部楼层
是的.我没看.确实还是结合数组快.当然在数组开销上也还是有讲究的,我原来试过想把4列全读进来,Myarr(1 to 262144)as integer,262144=65536*4,整型变量2字节,262144*2=524288,竟然用要用掉500K,实在是个大错误.

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-2-17 14:12 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

呵呵!是要这么多呢,如果定义成long还会需要更多内存。不过内存数组用来处理大量的循环计算往往会比公式快很多。当然不少工作表函数的执行效率也很高,所以两者经常可以结合起来使用以使代码更精简或更快速,但是应尽量不要借助辅助单元格。另外其实你的代码比起常规思路的程序已经快上很多了,所以还是值得恭喜一下:)

TA的精华主题

TA的得分主题

发表于 2006-2-20 13:49 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

我在求前500个值的个数时,首先就想到用countif,结果是奇慢无比,改用frequency几乎是立即出结果.看样子是countif要重复判断供给要查找的每一个值,而frequency却只要排一次序,再作判断,所以要快很多(排序算法毕竟经过若干年的发展,微软使用的也会是相当成熟的了,而判断相等并计数,却没这么幸运了.).只是拙见.

谢谢你的赞美.就不说受之有亏之类的了,说声谢谢.

TA的精华主题

TA的得分主题

发表于 2006-3-1 17:10 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2006-3-2 08:52 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

t = Timer
arr1 = Range("a1:d65536")
imax = WorksheetFunction.Max(arr1)
imin = WorksheetFunction.Min(arr1)
Debug.Print Timer - t

这两步计算就干掉0.3秒,是不是我的机子出问题了?

TA的精华主题

TA的得分主题

发表于 2006-3-8 19:18 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

请各路高手把脉,速度实在提不上来了! 不知从那儿下手? 晕!(达到这种速度很大程度受益于UNARTHUR和山菊花的提示)

Sub 按钮2_单击()
Dim i As Long
Dim j%, iTemp%, iMax%
Dim a1()
Dim t
t = Timer
Application.ScreenUpdating = False
a1 = Range("A:D")
iMax = WorksheetFunction.Max(Range("A:D"))
ReDim a2(0 To 499)
For j = 1 To 4
For i = 1 To 65536
If a1(i, j) > iMax - 500 Then
iTemp = a1(i, j)
a2(iMax - iTemp) = a2(iMax - iTemp) + 1
End If
Next
Next
For i = 0 To 499
Cells(i + 1, "k") = (iMax - i) & "\" & a2(i)
Next
Application.ScreenUpdating = True
MsgBox "运行时间" & Format(Timer - t, "0.000") & "秒"
End Sub

TA的精华主题

TA的得分主题

发表于 2006-3-9 01:30 | 显示全部楼层

写完后,看看别人写的真是相差甚远呀!学习ING

[em06]

写了一个速度最慢的!发上来倒数第一是没有问题了!

QF1tNNVg.rar (15.91 KB, 下载次数: 39)
[此贴子已经被作者于2006-3-9 1:31:29编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-3-9 10:11 | 显示全部楼层

估计时间也差不多了,现献丑公布我的答案:

Dim arr, counts() As Integer, arr2(1 To 500, 0)
Dim maximum&, minimum&, temp&
Dim i&, j&, k&, p&, t1
maximum = Application.Max(Range(Cells(1, 1), Cells(65536, 4)))
minimum = Application.Min(Range(Cells(1, 1), Cells(65536, 4)))
arr = Range(Cells(1, 1), Cells(65536, 4))
ReDim counts(minimum To maximum) As Integer
temp = arr(1, 1)
For j = 1 To 4
For i = 1 To 65536
If arr(i, j) <> temp Then counts(temp) = counts(temp) + 1
temp = arr(i, j)
Next i
Next j
counts(temp) = counts(temp) + 1
i = 1
For p = maximum To minimum Step -1
If counts(p) <> 0 Then
arr2(i, 0) = p & "\" & counts(p)
If i = 500 Then Exit For
i = i + 1
End If
Next p
Range(Cells(1, 7), Cells(500, 7)) = arr2

LGDgako5.rar (9.72 KB, 下载次数: 115)

总结评述就以19楼的为准,暂时没有新的内容了。期望版主为该贴评分。

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

本版积分规则

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

GMT+8, 2024-11-22 14:53 , Processed in 0.032733 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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