VBA 调错方法.
很多来贴吧问问题的尤其是刚接触VBA的朋友一旦遇到vba不工作, 就不知道该怎么办了, 上来求救, 也说不出个所以然. 大家想帮忙也不方便.下边介绍下vba环境中常见的几种调试方法.
默认的情况下vba如果出错, 会弹出窗口提示错误信息, 给出的信息对于纠错是非常关键的. 同时, 光标也会自动跳到处的行, 便于查错.
以下的三个语句是常见的设置vbe(vba的环境)对于错误的处理方式.
On Error Resume Next 如果出错, 不提示, 忽略此行, 执行下一行. (不建议, 潜在风险高)
On Error GoTo lLable 如果出错, 跳转到定义的标签lLable处 (不建议, 通常在特殊情况下使用)
On Error GoTo 0 默认设置, 通常来说是不得已使用上边的设置以后重新将设置改回来
如前边所说, 在出现错误的时候, 如果是默认设置系统会提示错误信息. 其实vba的错误信息通常只有几种, 对象或者变量没有找到, 赋值错误, 上下标越界, 文件没找到等等, 简单的来说就是系统没得到她想要的, 虽然没有直接告诉你为什么, 不过已经给了你提示, 有了提示, 下边的工作就是找原因了. vba本身提供了多种方法来监视程序的运行, 下边一一介绍. (个人用的是英文版, 所以下边请以英文为准, 中文多是凭记忆和猜测, 如有错误请指正)
1. 本地窗口 Local: 通过View 视图 -> Local 本地窗口 来开启. 在vba运行时会显示当前程序定义的变量. 无需设置, 简单易用, 但是内容是固定的, 不可手动添加, 无法看到非定义的变量
2. Watch 窗口: 通过View 视图 -> Watch 来开启, 需要手动输入想观察的变量, 可以在任何规定的时候监视制定的变量或表达式. 缺点是需要一一手动添加.
3. Immediate 立即窗口, 通过View 视图 -> Immediate 来开启, 一个类似于命令行或DOS的窗口, 可以在这里输入任何程序或者表达式, 回车后代码立刻生效, 如果要查询变量, 可以通过输入 ? + 变量来获得 如 ? thisworkbook.Name. 缺点是每次需要回车,或者输入代码才可以获得信息,只能够监视数值,不能够查看对象的结构,但是非常灵活,可以程序运行一半的时候临时给变量赋值,也可以得到一些自定义的function的计算结果,这是local和watch不具备的.
想要在程序运行中获得信息,那么通过Local和Watch以及Immediate的话,就需要在某一部暂停程序,通常有3种做法.
a, 系统出错自动暂停 (大家最怕看到的)
b, 代码输入 stop 程序运行到这一步的时候会停止,可通过F5继续 (可保存)
c, 通过点击代码行最左边的边框来设置断点 (不可保存)
(几种运行代码的方式,F5自动运行,F8一行一行运行包括调用的代码,Shift+F8一行一行运行,如遇到调用其它的代码也认为是一行,执行到本程序的下一行)
有的时候大家可能不像要暂停程序,那如何来了解程序的运行情况呢,通常有如下三种方法。
4. debug.print 会在immediate窗口显示后边接的表达式的内容相当于上边的 ? thisworkbook.Name 的用法,对于调试多循环的程序很有帮助,信息只会显示在vbe的immeidate的窗口中,如果不开vbe窗口那么信息是隐藏的,可以不让用户看到.
5. Application.StatusBar = "Msg",在系统的状态栏中显示信息。用户可以看到,了解到程序运行的状况,不需要打开vbe窗口.(Application.StatusBar = False,可以将状态栏的控制权交回给系统)
6. 系统输出,常见的方式是 MsgBox "Msg" 系统会弹出窗口,提示信息,点击确定前会中断程序。也有其他的做法,比如在某个sheet中输出数据等等。
这三种用法和immediate一样,都有共同的缺点,不能够监视对象,或者整个数组。只对单一的数值起作用。