ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创]补充一些编程加速的小技巧

[复制链接]

TA的精华主题

TA的得分主题

发表于 2006-2-28 17:25 | 显示全部楼层 |阅读模式
论坛中已有不少关于提高代码运算速度的帖子,已经提到的我就不再赘述了,感兴趣的朋友不妨搜索一下。我只补充一些鲜有提及的小技巧,并不是很多,如果有新的我会继续补充进来。 以下语句的运算速度 (C)>(B)>(A)。 1,(A) if a>b then c>d endif (B) if a>b then c>d 注释:如果代码中的if语句只需要返回一个结果,请您尽量使用(B)语句。 2, (A) c=iif(a>b,10,100) (B) if a>b then c=10 else c=100 endif (C) c=100 if a>b then c=10 注释:(1) iif()函数书写简单可惜速度并不快,这是经我试验得到的结论,可能其它软件会有不同,例如foxpro帮助就指出:"iif( ) 函数比等价语句 IF ... ENDIF 执行速度快得多。" 可是对于VBA我得出的结论恰好相反。(B)>(A) (2) 如果代码中的if语句需要返回2个结果,建议您先对[U]最可能出现的结果[/U]赋值(c=100),然后再对其进行[U]单句的if判断。[/U] 3, (A) if a=0 or b=0 or c=0 then c=100 (B) if a*b*c=0 then c=100 注释:如果可能,请尽量减少if判断的条件。 4,(A) if flag=0 then d=100 (B) dim flag as Boolean ...... if flag=0 then d=100 注释:对于真假判断的[U]请明确定义变量类型[/U]为Boolean,千万别偷懒。计算机对于处理二进制数据有先天的优势。这些都应该养成长期的习惯。 5,(A) for i=1 to 100 for j=1 to 100 a=arr(i,j) ...... b=arr(i,j) ...... b=arr(i,j) next j (B) for i=1 to 100 for j=1 to 100 temp=arr(i,j) a=temp ...... b=temp ...... b=temp next j next i 注释:返回一个数组中指定坐标的元素比返回一个简单变量值要慢很多,数组越大差别就越明显。因此当您需要[U]反复调用[/U]同一数组元素时,不妨先用一个简单变量将存贮数组元素,然后再多次调用这个变量就可以了。在数组编程中这是一个很重要且很容易被忽视的提速技巧。 6,(A) sub calc() line1: ..... ..... ..... a=5 b=6 goto line1 end sub (B) sub calc(a&,b&) ....... ....... ....... call calc(5,6) end sub 注释:代码中使用递归编程往往能事半功倍,例如很多需要分而治之的运算尤为实用。现今很多成熟的算法都是通过递归来实现的。另外递归受堆栈空间的限制,这是使用中需要注意的。 7,最后是一点提示:大家在编写代码的时候经常会镶套很多诸如for,do等等循环,请您仔细检查您的循环语句,以减少重复语句的计算。例如不要对[U]同样的变量反复赋相同的值[/U]或进行[U]相同的重复if判断[/U]。我优化的代码中这样的例子是很多的。 以上这些希望对大家有所帮助![em27]
[此贴子已经被作者于2006-2-28 17:38:27编辑过]

TA的精华主题

TA的得分主题

发表于 2006-2-28 17:27 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
N有帮助的了。谢谢![em27][em27]

TA的精华主题

TA的得分主题

发表于 2006-2-28 17:31 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2006-2-28 18:34 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2006-2-28 22:52 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
如果可能,对IF语句进行分解:
(1)IF A AND B THEN
写成
IF A THEN
IF B THEN

(2)IF A OR B
写成
IF A THEN
...
ELSE IF B THEN

或者
IF A THEN GOTO D1
IF B THEN GOTO D1
GOTO D2
D1:
....
D2:
麻烦是肯定的,用于当计算条件复杂且对速度要求高时.
[此贴子已经被作者于2006-3-1 17:52:25编辑过]

TA的精华主题

TA的得分主题

发表于 2006-2-28 23:02 | 显示全部楼层
for each...in.. 快于 for... to...
证明如下:
Sub TestFor()
Dim i&, j%, s, rg As Range
Dim t1, t2, t3
t1 = Timer
For i = 1 To 65535
For j = 1 To 10
s = Cells(i, j)
Next
Next
t2 = Timer
For Each rg In Range("a1:j65535")
s = rg
Next
t3 = Timer
MsgBox t2 - t1 & Chr(10) & t3 - t2
End Sub

TA的精华主题

TA的得分主题

发表于 2006-3-1 09:24 | 显示全部楼层

与一些参考书籍的说法不太一致,发现

c = False
If a > b Then c = True

快于

c = (a > b)

Sub xx()
Dim a As Integer, b As Integer, c As Boolean, t As Single
a = 5
b = 6
t = Timer
For i = 1 To 10000000
c = False
If a > b Then c = True
Next
Debug.Print Timer - t

For i = 1 To 10000000
c = (a > b)
Next
Debug.Print Timer - t
End Sub

TA的精华主题

TA的得分主题

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

to;northwolves

没发现和我说的哪一条相关吖?请不妨说清楚一些。

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-3-1 10:07 | 显示全部楼层
谢谢qee用兄的补充,第一点是我没想到的,第二点就可惜不适用于数组操作。现在偶很少写操作工坐表的代码了,呵呵!

TA的精华主题

TA的得分主题

发表于 2006-3-1 10:22 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
学习,谢谢!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-3-28 18:17 , Processed in 0.045887 second(s), 9 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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