Excel VBA编程 优化变量
变量在程序中用来保存运算结果,或运算的中间结果。变量的优化主要是使其占用的内存空间少,访问性能高。通过对变量的优化,可提高程序的执行速度。
1.避免使用变体
变体类型(Variant)的变量是一种特殊的变量,并没有被显示的声明。由于它可以保含任意类型的数据,那么在存储一些数据时,将会浪费系统的内存空间。例如,变体类型的变量需要16个字节的空间来保存数据,而一个整数(Integer)只需要2个字节,那么其它的14个字节就会白白浪费掉。
通常使用变体类型的目的是为了减少设计的工作量和代码量,也有的程序员为了节省时间而使用它。但是如果一个软件经过了严格设计和按照规范编码的话,完全可以避免使用变体类型。在这里,对于Object对象也存在同样的问题。请看下面的代码:
Dim con
Set con = New VBA.Collection
或
Dim con As object
Set con = New VBA.Collection
上面的代码由于在申明的时候没有指定数据类型,在赋值时将浪费内存和CPU时间。正确的格式应该如下列代码所示:
Dim con As New VBA.Collection
2.及时释放对象变量
定义对象(Object)变量后,要为其分配适当的内存。和普通变量不同,他拥有对象的方法、事件和属性等,因而它占用的内存空间较大。
对于内存较小的用户,在编程时声明并使用了对象变量,使用完该对象并没有释放时。当多次运行后,计算机运行速度将会变慢,并有可能会显示【内存错误】的系统提示信息。为了避免这种情况的发生,在不使用对象变量时一定要及时将其释放,清空它所占用的内存空间。
对象变量的资源的释放分二种情况:第一种是显式资源释放,由程序代码明确标明释放的资源;第二种是隐式资源释放,由于程序的执行变量超出生存域,而引起的资源释放。
对象变量的释放通过Set语句和Nothing关键字来实现,其格式如下:
格式:Set 对象变量名=Nothing
例如:
Dim obj1 As TextBox,tmStr As String
obj1.Text = "Hello World!"
tmStr = obj1.Text
Set obj1 = Nothing '释放对象
函数中定义的对像变量,在函数执行后,就会执行隐式资源释放。Set obj1 = Nothing并不是显示资源释放的语句,而是主动将对像的引用放弃。当引用计数减为0后,将导致对像不再
有生存域而引发隐式资源释放。
3.减少使用对象引用
在VBA编程中,对Excel对象的引用是不可避免的,而且是经常性的工作,同时对象的引用也是非常耗时的(在使用Range对象的引用时与使用数组相比较,使用Range对象要慢103倍到104倍)。因此,一定要避免频繁引用Range对象,在必要的时候,可以通过数组等方式来替代(在对工作表的信息查询、矩阵运算等时候,在运算开始前将Range的数据读入数组,运算完成后再写入Range)。
例如,在工作表中使用Range对象为选定的单元格赋值,可使用如下代码:
Dim objRng As Object
Set objRng = Range("A" & 1 & ":" & "J" & 2000)
With objRng
For j = 1 To 2000 Step 1
For i = 1 To 10 Step 1
.Cells(j, i).Value = CStr(j)
Next i
Next j
End With
上面的代码中,为单元格赋值时要循环引用Range对象的Cells方法,要比下面这段代码慢103倍左右。
Dim objRng As Object
Dim a(1 To 2000, 1 To 10) As Variant
Set objRng = Range("A" & 1 & ":" & "J" & 2000)
For j = 1 To 2000 Step 1vba 字符串转数组
For i = 1 To 10 Step 1
a(j, i) = CStr(j)
Next i
Next j
objRng.Value = a
这两段代码速度差异的原因是Range对象的操作非常耗时,而相对于数组的操作时间快的可以忽略不计,因此,对于103的数据量,1次Range对象操作和103次Range对象操作其速度差异可以达103倍。随着数据量增大,虽然数组操作和将数组赋给Range对象时会慢一些,但时间差异将依然以指数级增长。因此,要对Range对象进行频繁操作时,应该尽量使用数组替换。
4.使用数组
在Excel中要处理大量数据时,可使用循环从各单元格读入数据,经过加工处理后再写回单元格区域中。这种方式比在数组中处理数据的速度要慢。因此,如果有大量的数据需要处理时,可先将数据保存到数组中,经过加工处理后,再将数组的数据填充到单元格区域。
在Excel工作表中,工作表是一个二维结构,由行和列组成。这种特性与二维数组类似,因此可以很方便地将工作表单元格区域与二维数组之间进行转换。通过以下语句可将单元格区域赋值给一个二维数组:
myarr = Range(Cells(1, 1), Cells(5, 5))
反过来,也可将二维数组中的值快速的赋值给一个单元格区域,如以下语句将二维数组myarr中的值赋值给单元格区域Rng:
Rng.Value = myarr
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论