分享

VB,VBA优化技巧整理

 雄Frank 2011-11-16
《Word非常接触》目录
[分享] 分享一些关于VBA代码优化提速的资料 [复制链接]
说明:下面的资源是在网上收集到的关于VB的代码优化提速技巧的资料,鉴于VBA与VB的关系,资料中绝大多数技巧对于VBA同样适用。其中的大多数代码都是亲自在VBA中测试过的,某些地方加了一点注解。
(1)固定长度字符串数组:赋值快,释放快!
          固定长度字符串的处理速度通常慢于可变长度字符串,这是因为所有的VB字符串函数和命令只能识别可变长度字符串.因此,所有固定长度字符串必然被转换为可变长度字符串.
          但是,由于固定长度字符串数组占据着一块连续的内存区域,因此在被分配以及释放时,速度明显快于可变长度的数组.比如:在一个Pentium 233MHz机器上,对于一个固定长度为100,000的数组,给其中30个位置分配数值,大约只花费半秒种的时间.而如果是可变长度的数组,同样的操作要耗费8秒之多!后者的删除操作耗时大约0.35秒,但固定长度的数组几乎可以立即"毙命"!如果应用程序中涉及到这么大的一个数组操作,选择固定长度方式数组绝对是确定无疑的了,无论是分配数值,还是释放操作,都可以风驰电掣般完成.
(2)所有的比较操作结果或者是0(false),或者是-1(True).所以,下面例子中的2段代码是完全相同的,但是第2段要运行得快些:
1、传统方法:
01.If SomeVar > SomeOtherVar Then
02.x = x + 1
03.End If
2、更简练的方法
01.x = x - (SomeVar > SomeOtherVar)
http://www.cnblogs.com/dxy1982/archive/2011/09/17/2159544.html

Excel VBA 学习总结 - 代码优化之道

代码规范的优化
  优化了算法,采用了合适的函数和对象实现了算法后,代码其实还是有优化的空间,比如编程习惯,代码风格等,下面从这些方面总结一下。
1、尽量减少无用的操作,如对象的激活和选择
事实上大多数情况下激活和选择操作都只是有一点视觉效果,但很遗憾这对于VBA来说不是必需的。例如:

Sheets(″Sheet3″).Select
Range(″A1″).Value = 100
Range(″A2″).Value = 200可改为:

With Sheets(″Sheet3″)
 .Range(″A1″).Value = 100
 .Range(″A2″).Value = 200
End With
2、尽量减少使用对象引用,即减少“.”的使用,尤其在循环中
每一个Excel对象的属性、方法的调用都需要通过OLE接口的一个或多个调用,这些OLE调用都是需要时间的,减少使用对象引用能加快VBA代码的运行。例如
(1)使用With语句。

Workbooks(1).Sheets(1).Range(″A1:A1000″).Font.Name=″Pay″
Workbooks(1).Sheets(1).Range(″A1:A1000″).Font.FontStyle=″Bold″则以下语句比上面的快:

With Workbooks(1).Sheets(1).Range(″A1:A1000″).Font
   .Name = ″Pay″
   .FontStyle = ″Bold″
End With
(2)使用对象变量。
  如果你发现一个对象引用被多次使用,则你可以将此对象用Set 设置为对象变量,以减少对对象的访问。如:
Workbooks(1).Sheets(1).Range(″A1″).Value = 100
Workbooks(1).Sheets(1).Range(″A2″).Value = 200则以下代码比上面的要快:

Set MySheet = Workbooks(1).Sheets(1)
MySheet.Range(″A1″).Value = 100
MySheet.Range(″A2″).Value = 200 (3)在循环中要尽量减少对象的访问。

For k = 1 To 1000
 Sheets(″Sheet1″).Select
 Cells(k,1).Value = Cells(1,1).Value
Next k则以下代码比上面的要快:

Set TheValue = Cells(1,1).Value
Sheets(″Sheet1″).Select
For k = 1 To 1000
 Cells(k,1).Value = TheValue
Next k
(3)在循环中要尽量减少对象的访问。
For k = 1 To 1000
 Sheets(″Sheet1″).Select
 Cells(k,1).Value = Cells(1,1).Value
Next k
则以下代码比上面的要快:
Set TheValue = Cells(1,1).Value
Sheets(″Sheet1″).Select
For k = 1 To 1000
 Cells(k,1).Value = TheValue
Next k
3、有效地使用数组与变量,尽量少使用单元格直接参与计算
  通常单元格的操作都比较慢,可以先将单元格的值读入变量或数组变量,对变量进行运算,这样可以提高处理的速度。处理结束以后,只要用一个语句就可以将数组中的数据传递回单元格区域中。
  在创建已知元素的确定数组时,使用Array函数对于节约空间和时间以及写出更具效率的代码是非常理想的。例如:
Dim Names As Variant
Names=Array(“Fan”,“Yang”,“Wu”,“Shen”)   此外,应该尽量使用固定大小的数组。如果确实选择使用了动态数组,应该避免数组每增加一个元素就改变一次数组的大小,最好是每次增加一定数量的元素。
下面是一些扩展读物,有兴趣的同学可以试试看:
vba执行速度慢的对策

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多