ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 2757|回复: 6

文摘:避免VBA陷阱(作者不详)

[复制链接]

TA的精华主题

TA的得分主题

发表于 2002-2-21 17:26 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · 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代码编制技术上的时间将由更快的执行速度和更容易的日常维护来获得补偿。

TA的精华主题

TA的得分主题

发表于 2002-2-22 09:47 | 显示全部楼层
文章写的好! 能改的哥们都改改吧,确实会"提速"不少, 不愿意改的也非必改不可,只要它vba能通过咱们就行,你说呢 谁叫咱大部份不是coding为生的呢 vba赋与人类的自由我们要充分享受!^o^

TA的精华主题

TA的得分主题

发表于 2002-2-22 13:12 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
30兄,这样的好文章,是在哪儿找到的?

TA的精华主题

TA的得分主题

发表于 2003-4-10 17:24 | 显示全部楼层
一针见血,我很喜欢这篇文章!我本人也是一个菜鸟,不过我曾在学校学过BASIC,所以我所赞成这位仁兄的看法的!

TA的精华主题

TA的得分主题

发表于 2003-4-11 08:50 | 显示全部楼层
是VB编程乐园的文章吧,主要是讲VB的,但VBA也是VB的一部分嘛。 大家都去LOOK一下 http://www.vbeden.net http://www.vbeden.COM

TA的精华主题

TA的得分主题

发表于 2015-4-19 14:11 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2015-4-19 15:41 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
学习了,谢谢楼主的分享!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-26 01:15 , Processed in 0.033649 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表