教程中国
PHOTOSHOP CS9.0中文版 MAYA 8.5 FOR WINDOWS Corel Painter v9.0 Flash MX2004 中文版 Illustrator cs2 中文版
VC++6.0含sp6 中英文版 VB6.0 +sp6 简体中文版 Borland Delphi 7汉化版 MSDN for vb6.0中文版 Visual Studio 2005简体
教程中国下属 文件存储共享专家BIBIDU.COM 提供大型软件,教材,源码,电影,音乐,图书等下载 更多精品请点此进入
  您目前所在位置: 教程中国 >> 编程基地 >> VB >> 避免VBA陷阱--有时,VBA使你避免危险 RSS订阅
避免VBA陷阱--有时,VBA使你避免危险
教程(视频,书籍)下载:  ASP.NET AutoCAD 数据库 C# ASP java photoshop 网页设计 delphi 3dmax Flash C++ VB 张孝祥 实例   更多请进入BIBIDU搜索
IT搜索引擎   
避免VBA陷阱--有时,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代码编制技术上的时间将由更快的执行速度和更容易的日常维护来获得补偿。

来源:upschool.cn
作者:
关键字:避免VBA陷阱,有时,VBA使,避免危险
发表日期:2006-12-20 19:35:14

网页显示有限 阅读全文请下载本文完整版WORD文档

上一篇:利用VBA的键盘类   下一篇:Excel中Basic程序的运行


2009-1-10 10:22:33
本文的相类似文章
  • 为什么有时Oracle数据库不用索引来查找数据?
  • 同条SQL,有时buffer get会暴增
  • 避免VBA陷阱--有时,VBA使你避免危险
  • 用VB“破解”有时间限制的程序
  • 小学生字典将鸡解释成妓女 自称富有时代气息
  • 适应教师成长 符合地区特点 富有时代特色
  • 有时间也不知如何玩 孩子们为啥不会玩了?
  • 贫困学生有时为何和“钱”过不去?
  • 没有时间上学
  • 贫困学生有时为何和“钱”过不去?
  • 在学习中进步 在进步中成长 教程中国相随您的成长之路
    华腾联合科技股份有限公司版权所有
    广告联系:Rosibo@163.com