Office中国论坛/Access中国论坛

标题: 避免VBA陷阱(转自MSDN,很适合初学者) [打印本页]

作者: admin    时间: 2007-8-31 11:49
标题: 避免VBA陷阱(转自MSDN,很适合初学者)
避免VBA陷阱(转自MSDN)

有时,VBA使你避免危险

作为Access-Office-VB ADVISOR 的技术编辑,我见过许多编程风格。我常常惊异于VBA程序员能够找到不同的方法来执行相同的任务,同时我也对VBA能够容忍如此差的技术而感到沮丧。VBA是一种相当宽容的语言,几乎能够运行一切那些糟糕的程序员所赋予它的任务。

在我评价和测试本刊的文章之前,请首先关注五、六个我最经常遇到的编程错误。有一些编程手段对于每一个VBA代码都是必不可少的。

毫无疑问,我所遇到的最常见的问题如下:

Dim rs1, rs2 As Recordset

此处到底是什么类型的变量呢?在其他编程语言里,等价的语句将导致两个数据记录型变量,而在VBA中,你得到的是一个数据记录(rs2)和另一个变量(rs1)。虽然变量rs1运行时毫无错误,并且程序运行顺利,但是程序还是处于一种相当不确定的状态中。

一个变量应当是参数可变的一种特定数据类型,它能够被赋予任何没有问题的数值,因此,变量rs1能够按照下面表述的形式接受任何数据记录型赋值:

Set rs1 = CurrentDb.OpenRecordset(“tblEmloyees”, dbOpenDynaset)

问题在于每当代码中的rs1被执行时,VBA引擎都必须指明rs1变量的具体数值,在VBA决定如何处理该变量时,需要消耗额外的CPU时钟周期。而且,所有变量都会比等价的单个数据类型占据更多的内存。这些变量会降低应用程序的性能,使运行更加缓慢。

此处还有一个例子,变量strMsg具有如下定义:

Dim strMsg

任何包含strMsg的语句都将肯定比strMsg已经被定义为一个字符串的情况下要运行的缓慢。

如果你对变量指定数据类型,对其进行定义的基础是要使你的应用程序运行的更快、更可靠。

另外一个常见的问题是糟糕的代码缩排。下述代码段让人难以理解,如果将For…Next和If…End If循环进行仔细地缩排效果就会好得多:

For i=1 to 20

If Condition1 Then

Call SomeOperation1

If Condition2 Then

Call AnotherOperation

End If

End If

Call AthirdOperation

Next

逻辑相关的语句,尤其是那些被当作独立单元进行执行的语句,应当缩进两格。如果你没有花一点时间指明一段逻辑相关的语句之间的逻辑关系,你可能会消耗更多的时间,因此进行适当的代码缩排是值得的。

接下来的问题不太好用书面形式进行表述。因为刊物页面的幅宽有限,我不能将我所见到的长达470个字符的语句展示给你们。假设页面是标准的65个字符的幅宽,那么仅仅这个单句,就要换行8次,因此在编辑时,就要不得不向右滚动屏幕8次才能看清全句。尽管能够这样做,你也不可能一下把握全句的逻辑关系。显然,采用少量的分隔符将本长句划分为一些更短的句子,将便于管理。

与长句类似,但并不象那么严重的一个问题如下:

Dim i As Integer , str As String , rs _

As Recordset , db As Database , db1 As Double

在单行中进行许多定义,尤其当最后一个句子的末尾远远超出了编辑窗口的右端边界,将使得在大量的定义中查找某一个定义变得更加困难。

此处还有一个常常易犯的编程问题:

If (Condition) Then

  rs.AddNew

  rs.FirstName = txtFirstName

  rs.LastName = txtLastName

  rs.Address = txtAddress

  rs.City = txtCity

  rs.State = txtState

  rs.ZipCode = txtZipCode

  rs..Update

End If

VBA提供特别的With…End with结构处理同一个对象的多个成分:

If (Condition) Then

  With rs

    .AddNew

    !FirstName = txtFirstName

    !LastName = txtLastName

    !Address = txtAddress

    !City = txtCity

    !State = txtState

    !ZipCode = txtZipCode

.Update

  End With

End If

采用With…End With结构不仅可以使得表述简单,而且执行起来相当快。一旦VBA获得rs对象的句柄,那么With…End With代代码码块中的每一个成分将执行得更快。

VBA的诸多优点中有一条是其对语句的使用方式具有较高的宽容性,在C或Pascal程序中可能会引起崩溃的代码也许能够在VBA中毫无错误地得以运行,但是这样的灵活性常常会付出代价。体系结构糟糕的VBA程序或其子程序比精心构造的程序运行得要缓慢,并且效率低下,另外调试和维护起来也更加困难。以上所有问题在矫正时都只需耗费少许的时间,但是花在学习和提高VBA代码编制技术上的时间将由更快的执行速度和更容易的日常维护来获得补偿。




作者: heqing3000    时间: 2007-8-31 14:04
咋竖着来,看得好力,
作者: rjacky    时间: 2007-8-31 14:34
好像是机器自动翻译的文章,在一些关键的地方词语表达有点怪,让人不知道是哪种或什么意思
作者: duomu    时间: 2007-9-2 09:57
确实如此,不过还有更多的需要我等初学者注意的,比如变量的命名规则,加强程序可读性及维护的注释等......
作者: corot_liu    时间: 2009-6-9 14:48
谢谢分享
作者: chaojianan    时间: 2009-10-17 16:00
很基础,但很实用。
作者: xxiaoxin321    时间: 2009-10-17 22:22
很基础的东西,值得好好学习!




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3