VBA——程序提速大法之:变量

变量就是临时储存在内存空间的一个"小盒子",我们可以把数值、文本、数组以及对象都可以放在变量里。变量一般常用于循环作为指针,本文我们则重点谈一下变量在代码优化提速中的作用。

我们先下面两段程序开始。

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.


摘自Excel精英陪训。

你可能感兴趣的:(VBA——程序提速大法之:变量)