变量就是临时储存在内存空间的一个"小盒子",我们可以把数值、文本、数组以及对象都可以放在变量里。变量一般常用于循环作为指针,本文我们则重点谈一下变量在代码优化提速中的作用。
我们先下面两段程序开始。
Sub test1()
Dim x As Integer
Dim y(1 To 10000) As String
For x = 1 To 10000
y(x) = Range("a1") & 20
Next x
End Sub
Sub test2()
Dim x As Integer, SR
Dim y(1 To 10000) As String
SR = Range("A1")
For x = 1 To 10000
y(x) = SR & 20
Next x
End Sub
上面两段程序运行结果都是一样的,都是向数组y中装入值,但运行的速度第一个是0.1,第二段程序是0.01,相差10倍,原因是什么呢?原来第一段程序中是把range("a1")放在循环里面,而第二段程序在循环前就把单元格的值放在了变量sr中。这里的变量就把对象在循环前转换成了数值,大量循环中,数值的计算远比调用对象要快。
可能有同学说,对象肯定要慢,其他还有什么情况可以用变量提速度呢?其实算试同样需要我们关注。详见下例:
.
Sub test1()
Dim x As Long, t
Dim y(1 To 100000) As String
For x = 1 To 100000
y(x) = 2 + 10 + 22 ^ 4 + 20
Next x
End Sub
Sub test2()
Dim x As Long, t, SR
Dim y(1 To 100000) As String
SR = 2 + 10 + 22 ^ 4
For x = 1 To 100000
y(x) = SR + 20
Next x
End Sub
上面代码中,都需要计算2+10+22^4的值,然后用到循环里面,但速度第一个是0.09s,第二段却只有0.07s,差别在哪里呢,原来第一段程序是把算式放在循环内,那么每次循环都要重复的计算一次,而第二个则是在循环外先把计算的结果计算出来,然后再在循环中使用变量的值。这样就避免了在循环中的重复计算。
有同学会问,如果只能在循环中计算,有什么优化方法吗?有,如果我们在循环中要进行多次的重复计算,那么我们同样可以在循环中把计算的结果先放在变量中。再看下面的两段程序,第一个运行速度是0.45s,第二段的则快了一倍,只有0.28s ..........................
Sub test1() '运行时间0.4s
Dim x As Long, t
Dim y(1 To 100000, 1 To 5) As String
t = Timer
For x = 1 To 100000
y(x, 1) = 2 + 10 + 22 ^ 4 + 20
y(x, 2) = 2 + 10 + 22 ^ 4 + 30
y(x, 3) = 2 + 10 + 22 ^ 4 + 50
y(x, 4) = 2 + 10 + 22 ^ 4 + 70
y(x, 5) = 2 + 10 + 22 ^ 4 + 80
Next x
Debug.Print Timer - t
End Sub
Sub test2() '运行时间 0.28s
Dim x As Long, t
Dim y(1 To 100000, 1 To 5) As String, k As Long
t = Timer
For x = 1 To 100000
k = 2 + 10 + 22 ^ 4
y(x, 1) = k + 20
y(x, 2) = k + 30
y(x, 3) = k + 50
y(x, 4) = k + 70
y(x, 5) = k + 80
Next x
Debug.Print Timer - t
End Sub
最后我再讲一个大家可能很少用的绝招,就是变量替代没有声明类型的数组值。
Sub test1() ‘ 0.15s 慢
Dim x As Long, t, arr
Dim y(1 To 9100000, 1 To 5) As Long
t = Timer
arr = Range("a1:b20")
For x = 1 To 900000
y(x, 1) = arr(1, 2) * 20
Next x
Debug.Print Timer - t
End Sub
Sub test2() '运行时间0.12s 快
Dim x As Long, t, arr
Dim y(1 To 9100000, 1 To 5) As Long, k As Long
t = Timer
arr = Range("a1:b20")
For x = 1 To 900000
k = arr(1, 2)
y(x, 1) = k * 20
Next x
Debug.Print Timer - t
End Sub
上面的第二段代码,比第一段多了一个变量K,而且K只是替换ARR(1,2),你肯定在怀疑:这个会提速? 不管你信不信,这个还真可以提速。什么原理呢?原来我们用arr从单元格中取值,数据类型是没有办法定义的,而Y数组的值却是数值型的,所以让一个不知道类型的值和数字相乘,必须会让程序进行多余的判断。而如果用一个已声明变量类型的变量替代arr(1,2)则会提高运行效率。所以上面两个程序,第一段运行时间为.15s,第二段程序运行时间为0.12s,快了0.03s.