您能只用下面的一行代码为指定的单元格设置字体样式,不需要选择单元格区域。
Range(\
如果您考虑到您想要宏所做的事情(本例中为使字体加粗),那么您可以查阅应用到Font对象的属性和方法列表,您将知道只需使用Bold属性编写这个宏代码以实现所需的功能。代码如下:
Sub NowThis2()'快约10倍Dim Start As Double, Finish As DoubleStart = Timer'--------------------------------------'为进行测试,将循环100次Dim N As LongFor N = 1 To 100'***************************Range(\= True'***************************Next'--------------------------------------Finish = TimerMsgBox \本次运行的时间为\
您也能在用户界面中通过执行不同的方法来录制产生结果相同的操作对宏录制器进行试验。例如,如果您通过标准工具栏上的粗体按钮格式化某区域为粗体,那么宏录制器将使用Bold属性。
下面将要讲到的设置对象变量代替长对象引用,使用With?End With语句、执行For Each?Next循环语句,根据程序环境尽量减少OLE引用,等等,均是简化代码的好方法。
强制声明变量
在VBE编辑器中的菜单“工具——选项”对话框中“编辑器”选项卡中,您应该始终保持“要求变量声明”复选框被选中,这样将在模块代码顶部出现Option Explicit语句,要求您在编写代码时对所有出现的变量均进行声明,这样,在使用变量时减少内存需求并加速性能。
(1)要节省内存资源,必须始终用特定的数据类型声明所有变量。如果不使用特定的数据类型声明变量,VBA会创建Variant类型的变量,这将比任何其他数据类型要求更多的内存。
(2)清楚每种数据类型需要多少内存以及它可以存储的值的范围。除使用较小的数据类型会导致隐性转换的情况外,应始终使用尽可能小的数据类型。例如,因为Integer类型的变量将被转换成Long类型的变量,应该将那些存储整型值的变量声明为Long类型,而不是Integer类型。
(3)除非确实需要,应避免使用浮点数据类型。尽管Currency数据类型更大,但它比 Single
数据类型快,因为Currency数据类型不使用浮点处理器。
(4)如果在一个过程中多次引用一个对象,可以创建对象变量,并将对给对象的引用指派给它。因为对象变量存储对象在内存中的位置,VBA将不必再次查找其位置。
(5)将对象变量声明为特定的类型(不是Object类型),以便利用早期绑定。
(6) 减少”Variant”类型变量的使用
虽然您可能发现在您的代码中使用Variant(变体)变量是方便的,但是如果您将变量清楚地声明为特定的数据类型,然后用VBA处理存储在该变量中的值,要比处理存储在Variant变量里的值快。
如果执行不涉及分数值的数学运算,那么在您的代码中使用Long型变量比使用Variant变量更快。Long型变量也是在For?Next循环中索引值变量类型的最好选择。
然而,您要注意到,您使用特定类型变量所获取的速度是以失去灵活性为代价的。例如,当使用特定数据类型时,您可能遭到变量溢出或类型不匹配的情形,而不会像Variant变量会自动进行类型转换处理。
(7) 声明时指定特定的对象类型
当您的宏被编译或者是运行(后台编译)时,会解析对象及它们的方法和属性的引用。经过宏编译解析的引用比在程序运行时必须被解析的引用要更快,因此,您最好跳过后台编译。
如果您声明变量和参数为特定的对象类型(比如Range或Worksheet),VBA在编译您的程序时将解析引用为这些对象的属性和方法。(如果要查找指定对象类型列表,请参见”对象浏览器”)
减少变量的作用范围并及时释放变量
主要是对象变量,在其使用完后,及时释放。例如,
Dim TempObj As AnyObject,AnObj As AnyObjectSet TempObj=New AnyObjectSet AnObj=TempObjSet TempObj=Nothing ‘释放对象变量
使用常量
变量会发生变化,因此VBA在程序运行时必须获取当前变量的值。
在应用程序中使用常量会使程序运行更快。在编译您的代码时,常量仅计算一次并被存储。
常量也能使您的宏程序更易阅读和维护。如果在您的程序中有一些不变的字符串或数值的话,您可以声明它们作为常量。
尽可能使用早期绑定
绑定是指将程序调用与实际代码相匹配。为了实现早期绑定,先应创建对对象库的引用。早期绑定可以在代码中使用定义在对象库中的常量,可以自动列出对象的方法和属性,但早期绑定只有在所控制的对象拥有独立的类型库或对象库文件才适用且还需要已安装了特定的库。而后期绑定则只是在运行时才知道对象的类型并对对象进行引用,因此不具备上述特点。
使用早期绑定创建对象通常更有效率,使代码能获得更好的性能。因为对象的早期绑定引用在编译时可以通过VBE的解析,而不是通过运行时模块解析,因此早期绑定的性能要好得多。虽然在程序设计时不可能总是使用早期绑定,但应该尽可能使用它。
使用For Each?Next循环
可以使用For Each?Next循环来保证程序代码更快地执行。在使用For Each?Next循环时,对于存储在集合或数组中的每个对象执行一组语句,程序更简洁,也更容易阅读、调试和维护。当For Each?Next语句迭代集合时,自动指定一个对集合当前成员的引用,然后在到达集合的尾部时跳出循环语句。
与使用计数进行循环相比,在遍历集合或数组时使用For Each?Next循环将更快。在多数情况下,使用For Each?Next循环也更方便,并且使您的宏更简洁、更容易阅读和调试。
下面的示例运行很慢,因为在每次循环重复时它设置并调用了行变量.Row(i)。
Sub DoSomethingSlow() Dim
Start
As
Double,
Finish
As
DoubleStart
=
Timer'-------------------------------------- Dim Cell As Range, i As Long
With Sheet1.Range(\For i = 1 To 10000 Set Cell = .Rows(i) If Cell > 0 Then
Cell.Font.ColorIndex = 5 End If Next End With
Finish = TimerMsgBox \本次运行的时间是\– Start End Sub
下面的示例代码更简洁,其运行速度大约是上面代码的2~3倍。因为For Each?Next循环自动记录行数并定位,而不需要调用变量i。
Sub DoSomethingFaster()'快两至三倍 Dim
Start
As
Double,
Finish
As
DoubleStart
=
Timer'-------------------------------------- Dim Cell As Range With Sheet1
For Each Cell In .Range(\If Cell > 0 Then
Cell.Font.ColorIndex = 5 End If Next End With
Finish = TimerMsgBox \本次运行的时间是\– Start End Sub
在执行循环时考虑如何能够尽可能地节省资源
(1)分析循环以查看是否正在不必要地执行一些消耗内存的重复操作。例如,是否可以在循环外(而不是在循环中)设置某些变量?每次都通过循环执行的转换过程是否可以在循环之外执行?
(2)考虑是否必须在满足特定的条件时才执行循环。如果是,也许可以更早地退出循环。例如,
假设正在对一个不应该包含数字字符的字符串进行数据验证。如果循环要检查字符串中的每个字符以确定其中是否包含数字字符,那么您可以在找到第一个数字字符时立即退出循环。
(3)如果必须在循环中引用数组的元素,可以创建一个临时变量存储该元素的值,而不是引用数组中的值。从数组中检索值比从相同类型的变量读取值要慢。
(4) 将属性和方法放在循环外部
在代码运行时,获取变量的值快于获取属性的值。因此,如果您的代码在循环内部获取属性的值,您可以在循环外部将该属性的值先指定给一个变量,然后在循环内部使用此变量代替属性的值,这样的代码将运行得更快。
下面所示的代码运行较慢,因为在每次重复循环时都必须获取Sheet的Range属性的值。 Sub
TryThisSlow()Dim
Start
As
Double,
Finish
As
DoubleStart
= =
Timer'--------------------------------------Dim MyLoop As LongFor MyLoop = 2 To 4001Cells(MyLoop,
\本次运行的时间是\
下面的示例与上面所产生的结果相同,但比上面的要更快,因为在循环开始以前我们已经将Sheet的Range属性的值指定给了单独的变量MyVar。这样,代码将在每次重复循环时利用该变量的值,而不必每次都要调有属性。
Sub TryThisFaster()'快约35%以上Dim Start As Double, Finish As DoubleStart = Timer'--------------------------------------Dim MyVar As String, MyLoop As LongMyVar = Sheet1.Range(\MyLoop = 2 To 4001Cells(MyLoop, 2) = MyVarNext'--------------------------------------Finish = TimerMsgBox \本次运行的时间是\
如果您在一个循环内部使用多个对象访问,您也可以使用With?End With将您能够移动的对象移到循环外部。下面的示例在每次循环重复时都调用Sheets对象和Cells属性。 Sub
NowTryThisSlow()Dim
Start
As
Double,
Finish
As
DoubleStart
=
Timer'--------------------------------------Dim c As LongFor c = 1 To 8000Sheet1.Cells(c, 5) = cNext'--------------------------------------Finish =
2)
Sheet1.Range(\
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库Excel VBA性能改善(2)在线全文阅读。
相关推荐: