|
本帖最后由 adders 于 2013-6-29 16:51 编辑
我们知道,用VBA实现同一个效果可能有多种不同的方法,写出一个最有效率的代码是大家都追求的,但是假如我水平有限,经验不足,实践不多,或者逻辑线路的设计不够简洁清爽,是不是就无法大幅提高代码速度?当然不是,如果你学会使用以下技巧,即便你的代码设计水平一般,也可以让它的运行大大加快.
首先记住一个原则: 并不是代码写得越短就运行越快!
1)养成声明变量的习惯,当你声明非Variant的变量类型时,会少占用内存,从而加快代码速度.同时在声明数值类型变量时,尽量避免声明浮点类型变量,因为用到浮点运算器会拖慢速度,比如Currency类型就会Single类型运算快,因为前者不用浮点运算处理器.
2)在指向单元格时,[A1]看上去写得比Range("A1")简短好看,但是写成后者其实运行更快.
原因是:[A1]实际运行的是:Application.Evaluate("A1"),要比写Range("A1")运行速度慢约70%.
所以再请记住这句话:并不是代码写得越短就运行越快!
3)大家可能经常看到的在Sub开始的两条语句可以大大加快代码速度:
Application.ScreenUpdating = FALSE '禁止屏幕刷新
Application.Calculation = xlCalculationManual '计算模式为手动
一般在Sub结束前改回:
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = TRUE
4)在引用一个集合目标体(如Worksheets)时,用索引号比用其名称速度会快,如果你明确知道一个"总结"工作表的索引号是1的话,
Worksheets(1)比用Worksheets("总结")速度要快很多,但是索引号的运用会有风险因为表的顺序可能会因增删工作表而经常改变,所以往往实际运用中用工作表名称的方法会更安全更容易些.
5)尽可能运用常量,而不是变量.前面说过声明变量,但是如果你确定这个变量是恒定的,比如你要用的一个路径恒定是C:\MyPath\,则声明:
Const Fp as String = "C:\MyPath\" 比用 Dim Fp as String速度更快!
6)前期绑定比后期绑定速度要快,比如:
Dim WordObj As Word.Application 比用 Dim WordObj As Object 要更快,所以尽可能在VBE的Tools --> References中建立目标索引后直接在代码中引用.
7)For each循环比用For i = 1 to x要快!以下两段代码前者比后者快!
Dim WS as Worksheet
For Each WS In Worksheets
MsgBox WS.Name
Next WS
------------------------------------------
Dim i as Integer
For i = 1 To Worksheets.Count
MsgBox Worksheets(i).Name
Next i
8)尽量不用Selection,基本上EXCEL VBA中很少有必须使用Selection的,凡是前一行是某某.Select,后面接着Selection.干嘛干嘛的,都可以直接去掉Select和Selection,如用:
Range("A1").Font.Bold = True
而不是:
Range("A1").Select
Selection.Font.Bold = True
9)当对某一目标进行多次操作时,尽量用With...End With,如:
With Worksheets("Sheet1").Range("A1")
.Font.Bold = True
.Value = 123
End With
10)EXCEL自带函数运行比自己在VBA里写的函数运行快!如:
MySum = Application.WorksheetFunction.Sum(Range("A1:A100"))
比以下速度快!
For Each C In Range("A1:A100")
MySum = MySum + C.Value
Next C
|
评分
-
查看全部评分
|