excelperfect
主要内容:
- 了解程序bugs
- 避免程序bugs
- 使用VBA的调试工具
- 发布Excel应用程序
VBA提供了一些出色的工具来帮助你查找和修复程序bugs。本课程将讲解什么是bugs、如何处理它们,并介绍一些与发布应用程序有关的因素。
调试应用程序
在发布Excel应用程序之前,对其进行充分调试很重要。即便如此,某些bugs可能会超出测试范围而只能由用户发现并报告;因此,对于你而言重要的是要知道如何使用VBA的调试工具来进行调试去找到并修复bugs。
什么是Bugs?
Bug是导致程序无法正常运行的代码错误。可以将bug视为类似于错误(error),尽管这两个术语在编程界具有不同的含义。
错误(有时称为运行时错误)是阻止程序运行的问题。如果处理不当,将有可能导致程序在其运行时中止。你可以在第26课中了解有关处理运行时错误的信息。
相反,bug不会阻止程序运行。而是,它导致程序产生不正确的结果。例如,将数据插入工作表错误部分的数据输入程序被视为bug。同样,如果用于某些数值计算的代码产生不正确的结果,则也将其视为bug。由于实际上存在无限数量的潜在bug,因此无法列出或描述Excel程序中可能出现的错误。以这种方式思考——程序应该做的任何事情都可能做错。
虽然VBA会向你报告错误,但没有对于bug的处理机制。发现bug的唯一方法是测试你的程序,然后再次测试。下一节将介绍一些有助于减少bug的编程实践。
提示:在测试程序中的bug时,寻求帮助总是一个好主意。其他测试人员可能会发现一些你漏掉的bugs。
避免Bugs
减少程序bugs的最重要步骤是始终使用OptionExplicit语句。该语句生效时,必须显式声明程序中的每个变量。如果尝试使用未声明的变量,则VBA会显示一条错误消息。这样可以防止漏掉拼写错误的变量名。如果没有OptionExplicit,则仅将拼写错误的变量名视为新变量,并且结果很可能是bug。
除了始终使用OptionExplicit外,还有以下准则可以帮助减少程序bugs:
- 如果你的程序包含很多代码,将其分成相对较小的过程。大型过程更容易出现bugs,并且在发生bug时更难修复。对于“大”过程的构成没有严格的原则指导,但是如果一个过程超过25至30行代码,请开始考虑将其分解为两个或更多小过程的方法。
- 仅在确实需要时才使用全局变量和公共变量。尽管这种类型的变量似乎可以简化某些编程任务,但它们容易出现问题。几乎所有需要全局变量或公共变量的情况都可以使用过程参数和函数返回值进行处理。
- 必要时,请确保对数字变量使用浮点数据类型。在某些情况下使用整数类型可能会导致舍入错误和bugs。
调试工具
几乎所有bugs都是由两个因素导致的——单独工作或组合工作:
- 程序执行接收到错误的路径。
- 一个或多个变量取不正确的值。
VBA的调试工具旨在跟踪这两种bugs的原因。
断点
在VBA编辑器中,可以在任何代码行上设置断点。当执行到达该行代码时,VBA进入中断模式,这使你可以执行各种调试任务(稍后将对此进行解释)。要设置断点,将编辑光标放在该代码行上,然后按F9。你也可以使用相同的技术来删除断点。带有断点的行在深色背景上显示为浅色文本,在相邻页边空白处显示一个圆圈图标,如图24-1所示。你可以根据需要在程序中设置任意多个断点。
图24-1:具有暗红色背景和小圆圈的断点在页边显示
提示:通过选择“工具”→“选项”,可以在“选项”对话框的“编辑器选项”选项卡上更改断点和其他代码元素的显示格式。
断点对于跟踪程序执行很有用。当VBA处于中断模式时,你可以执行其他调试操作,如以下各节所述。当VBA在断点处停止时,该行以黄色突出显示。
VBA在执行包含断点的行之前停止。换句话说,当VBA在断点处停止时,包含该断点的行尚未执行。也可以仅在包含可执行代码的行上设置断点。其中不包括Dim语句。VBA不允许你在不可执行的行上设置断点。
跳转命令
VBA在断点处停止后,通常需要继续执行程序。有几种选择,如表24-1所示。
表24-1:在中断模式下执行命令
VBA的跳转命令的使用取决于调试会话的详细信息。例如,如果要跟踪每行代码的执行,则可以使用“逐语句”。如果你已经确定bug不是由某个特定程序引起的,使用“逐过程”来执行该程序代码,并在完成后暂停。如果你认为已找到该bug并希望更正代码以对其进行修复,使用“重新设置”结束该程序。
在中断模式下代码编辑
VBA使你可以在中断模式下修改代码。当你认为已发现问题并希望立即解决该问题时,此功能很有用。然而,进行一些编辑后,VBA无法从暂停位置继续执行,必须重置项目才能重新启动。在这种情况下,VBA将显示一个警告对话框。
使用监视
监视使你能够在执行期间确定程序变量的值。检查变量的最简单方法是在中断模式下。只需将鼠标指针停留在代码中变量的名称上,VBA就会弹出一个带有当前值的小窗口。如果这还不够,VBA提供了更复杂的监视工具。
VBA可以在程序调试期间监视任何变量或表达式的值。监视表达式可以是任何VBA表达式,例如程序变量、对象属性或函数调用。通过设置监视,你可以关注变量或属性的值以查看其是否以及何时更改。
可以使用多种方法来使用监视表达式:
- 可以监视其值。VisualBasic在“监视”窗口中显示表达式值(定义监视表达式时,此窗口会自动打开)。每当程序进入中断模式时,显示的值都会更新。
- 可以指定每当表达式的值更改时,程序就进入中断模式。
- 可以指定每当表达式的值为True时程序进入中断模式。
要设置监视表达式,选择“调试➪添加监视”以打开“添加监视”对话框,如图24-2所示。
图24-2:“添加监视”对话框
接着,按照下列步骤操作:
1.在“表达式”框中输入监视表达式。如果光标位于变量或属性名称上,或者你已在代码中选择了表达式,则将在此处自动输入。
2.将“上下文”下的设置保留为默认值。
3.在“监视类型”下,选择所需的监视类型。
4.单击“确定”。
你添加的任何监视都会显示在“监视”窗口中,如图24-3所示。每个监视表达式都显示在其自己的行上;该行左端的图标标识监视的类型(“监视表达式”,“值更改时中断”或“值为True时中断”)。“监视”窗口中的列显示以下信息:
- 表达式。被监视的表达式
- 值。表达式的当前值,如果程序未执行或变量超出范围,则为<溢出上下文>
- 类型。表达式的数据类型(如果有)
- 上下文。在其中计算表达式的上下文(工程的一部分)
图24-3:监视窗口显示所有已定义的监视
当执行为其定义监视的程序时,每次程序中断时,监视窗口中的数据都会更新。
提示:如果看不到“监视窗口”,从VBA编辑器菜单中选择“视图——监视窗口”。
表24-2列出了各种调试情况下一些监视示例。
使用快速监视
你可以使用“快速监视”来快速查看变量或表达式的值。当程序处于中断模式时,将编辑光标放在感兴趣的变量或属性名称上,或突出显示要评估的表达式,按Shift F9或选择“调试➪快速监视”以显示“快速监视”对话框,如图24-4所示。此对话框显示感兴趣的变量或表达式及其当前值。单击“添加”按钮将变量或表达式添加为常规监视表达式。
图24-4:快速监视窗口
发布应用程序
发布Excel应用程序可以是一个简单或复杂的过程。如果你的应用程序是在小型办公室内部使用的,则分发可能仅包括使工作簿文件在服务器上可用以及向同事发送电子邮件。对于其他情况,例如可在Web上常规下载的共享软件应用程序或将在整个大型多办公室组织中发布的应用程序,情况可能会变得更加复杂。例如,要使用Excel应用程序,你必须安装Excel或者Excel查看器。
至少,发布工程需要使包含该工程的Excel工作簿文件可供最终用户使用。一些工程包含多个工作簿,而其他则包含相关文件,例如联机帮助。因为创建了该工程,所以你要注意该文件及其需要的文件。
要点回顾
本课程向你展示了如何使用VBA的调试工具,并探讨了发布Excel应用程序时涉及的因素。
程序bug是使程序无法正确运行的代码错误。
大多数bugs是由于变量取不正确的值和/或程序执行分支不正确造成的。
可以在程序中的任何位置设置断点,以强制程序在该点暂停。
当程序在中断模式下暂停时,可以单步执行代码以查找错误。
VBA的监视可让你在程序执行期间跟踪程序变量的值。
自我测评
1.运行时错误与程序错误有何不同?
2.如何在代码中设置断点?
3.逐语句执行命令和逐过程执行命令有什么区别?
4.描述两种在中断模式下快速查看变量值的方法。
5.如果不能确定应用程序的所有用户都将运行最新版本的Excel,该怎么办?
注:本文是在知识星球App的完美Excel社群中发表的Excel VBA编程系列文章中的一篇,这些文章正陆续更新中,近期会全部更新完成。
欢迎在下面留言,完善本文内容,让更多的人学到更完美的知识。