Office中国论坛/Access中国论坛

标题: 【原创 / 文章】VBA代码调试图文教程(一) [打印本页]

作者: LucasLynn    时间: 2006-5-18 20:57
标题: 【原创 / 文章】VBA代码调试图文教程(一)


  对于一个真正的软件工程而言,程序员最多的时间并不是用在编码上,而是调试上,一段代码刚写完的时候,通常是貌似完美,实际上能不能运行,其中包含着多少错误,即便是最优秀的程序员也无法预知。于是我们需要通过调试来找出我们代码中的错误,并且将其一一修复,使我们的代码最终能够实现我们预期的功能。

  VBA代码也是如此,值得庆幸的是微软为我们提供了完善的调试环境,也就是我们经常用的VBAIDE(VBA集成开发环境),有很多Access新手在开始学习编写VBA代码的时候,往往一门心思学习各种语法、函数等等,却忽略了学习VBAIDE的使用方法,这样做的结果是你常常会面对一个貌似完美但是实际上无法运行的程序束手无策。

  本文将完整介绍VBA代码的调试方法,虽然本文不是VBAIDE的完整教程和文档,但是通过对于本文的学习和实践,你可以学会自己来寻找代码中的错误。

  本文中选用了“Office中国论坛”中网友antywjl的求助问题作为例子,来进行我们的第一次调试练习。例子附件如下:
[attach]17823[/attach]

  对于一个调试系统而言,我们将会经常接触到以下概念:

1、编译
  编译是调试中最基本的功能,所谓编译就是把我们能够看懂的编程语言代码,转化成机器能够看懂的代码,不同系统的编译功能是不同的,VBA编译系统生成的是一种中间代码——PCode,至于他是什么,我们不需要深究,但是我们需要理解一点,就是只有所有语法全部正确的代码,才能够通过编译,因此这一功能有助于我们检查我们的代码的语法是否正确,包括变量是否作了应有的声明等等。
  通常我们的语法中有显而易见的错误时,VBAIDE会用红色字体来显示有问题的代码行,但是调试不仅仅限于这些代码行,而是整个程序的检查,红色字体仅能识别一行内就能确定的错误,调试则能够识别全代码范围的错误,例如变量类型声明不符等等。
  在我们的例子中,我们打开企业资料窗体代码,可以看到如下图位置,有一行红色的代码,说明了这行代码存在语法问题。

[attach]17856[/attach]

  问题在于代码中缺少应有的空格,在&前后添加空格后问题解决。现在代码中已经没有红色代码了,那么让我们来尝试一下编译,选择『调试』菜单中的『编译系统』选项,我们得到了如下图的结果:

[attach]17857[/attach]

  出错信息显示:变量声明类型不符,并且自动选中了出错的代码“Stemp&”,很明显,这也是缺少空格造成的,但是由于&作为变量名后缀,也是一种合法的语法,因此单行无法识别这个错误,但是全代码编译时,问题就暴露出来了。于是我们添加上空格,并且去掉后面两个不必要的“\”。
  再次编译,我们又遇到了下图中的错误,仔细一看,代码中标签声明处Exit后有两个下划线,而调用处只有一个,

[attach]17858[/attach]

  明显的打字错误。修正后再次编译,通过。
  编译,并不能找到我们代码中的所有错误,因为计算机还没有聪明到能够理解我们人类到底想干什么,但是编译依然是调试最重要的一步,因为他至少能让你修正语法,使得你的程序可以被执行,只有能够被执行,才能继续我们后面的调试。


(未完待续,在后面的内容中,我们将继续讲解断点、单步、和监视的使用方法)






[此贴子已经被作者于2006-5-18 14:05:29编辑过]


作者: WDLRCZT    时间: 2006-5-18 21:36
第一处错误:

STemp = "INSERT INTO 企业"
     STemp = STemp& \ "(网点编号,客户经理编号,名称,客户号,法人代码,帐号)\"
     STemp =STemp&"VAlUES('"&Me![网点编号]&"','"&Me![客户经理编号]&"','"&Me![名称]&"','"&Me![客户号]&"','"&Me![法人代码]&"','"&Me![帐号]&"')"

我把以上三行改为:

    STemp = "INSERT INTO 企业 (网点编号,客户经理编号,名称,客户号,法人代码,帐号) SELECT'" & Me![网点编号] & "','" & Me![客户经理编号] & "','" & Me![名称] & "','" & Me![客户号] & "','" & Me![法人代码] & "','" & Me![帐号] & "';"

这是一条追加SQL语句,不知道你的要求是不是这样



第二处错误:

    把Resume Exit_保存_Click改为
      Resume Exit__保存_Click
因为Exit后的小线长短不一致造成的

看看以上能不能解决你的问题

   


作者: LucasLynn    时间: 2006-5-18 22:01
以下是引用WDLRCZT在2006-5-18 13:36:00的发言:


第一处错误:

STemp = "INSERT INTO 企业"
     STemp = STemp& \ "(网点编号,客户经理编号,名称,客户号,法人代码,帐号)\"
     STemp =STemp&"VAlUES('"&Me![网点编号]&"','"&Me![客户经理编号]&"','"&Me![名称]&"','"&Me![客户号]&"','"&Me![法人代码]&"','"&Me![帐号]&"')"

我把以上三行改为:

    STemp = "INSERT INTO 企业 (网点编号,客户经理编号,名称,客户号,法人代码,帐号) SELECT'" & Me![网点编号] & "','" & Me![客户经理编号] & "','" & Me![名称] & "','" & Me![客户号] & "','" & Me![法人代码] & "','" & Me![帐号] & "';"

这是一条追加SQL语句,不知道你的要求是不是这样

第二处错误:

    把Resume Exit_保存_Click改为
      Resume Exit__保存_Click
因为Exit后的小线长短不一致造成的

看看以上能不能解决你的问题

   







赫赫,这是一篇如何调试代码的教程,只是引用了一个网友的数据库作为例子来讲解调试的过程而已。







作者: WDLRCZT    时间: 2006-5-18 22:07
理解错了
作者: eyewitnes    时间: 2006-5-18 22:23

作者: antywjl    时间: 2006-5-19 00:03
期待中!这是新手们急需学习的材料,谢谢!
作者: 无忧    时间: 2006-5-19 17:16
列入永久收藏了,下一讲什么时候开始呢?

还比较期待LucasLynn 老师能给大家讲讲对象浏览器的使用,或者,如果有相关的学习链接也行,这些基本的东西,都不太会用[attach]17876[/attach]

作者: K仔    时间: 2006-5-19 17:24
收藏了~期待下一篇
作者: LucasLynn    时间: 2006-5-19 17:48
以下是引用无忧在2006-5-19 9:16:00的发言:


列入永久收藏了,下一讲什么时候开始呢?

还比较期待LucasLynn 老师能给大家讲讲对象浏览器的使用,或者,如果有相关的学习链接也行,这些基本的东西,都不太会用



我会加入的。




作者: LucasLynn    时间: 2006-5-21 00:04
本文第二章已发布。
作者: 情比金坚    时间: 2006-5-21 06:12
收藏
作者: wjw8216    时间: 2008-6-5 15:24
谢谢,收藏了,急需要这样的文章[:33]




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