调试Excel VBA代码

作者:

Excel VBA 出错时给出的错误信息极少,需要充分利用各种工具来进行调试。

1. 编译错误

常见的编译错误有:

  • 错误的源代码格式,比如 if 后面缺少 then :在编辑器中该行会变成红色。
  • 错误的语法结构,比如 if 和 end if 没有对应上:代码运行前会给出编译错误提示。
  • 类型不匹配:函数输入的参数与定义时的参数类型不同时会出现该类错误。
  • 变量未定义:指使用了没有申明的变量类型(当 Option Explicit 时)

建议:

  1. 格式规范化,严格缩进。VBA 插件 Smart Indent 是一个很好的辅助工具。这样做让源代码更具备可读性,从而更快检测源代码格式和语法结果错误,。
  2. 勾选上「工具——选项——编译器——要求变量声明」,或者在每个代码模块最前面手工加上 Option Explicit 。在代码编辑中,很多错误只是因为手误,这个选项会让编译器强制检查变量申明,从而在编译时便发现错误。

2. 运行中出错或者运行结果错误

当程序编译没有问题,但运行中出错或者运行的结果与想象中不符,就需要用到 VBA 的调试功能。下面是 VBA 提供的几个重要的调试功能,这些功能能让程序停在某些特定的位置上等待检查:

  • F9 :设置程序断点,在代码左侧栏点击有相同效果。重新按 F9 即取消断点。
  • F8 :单步跟踪,当调用子函数会跟踪到子函数内部
  • Shift+F8 :单步跟踪,但不会进入子函数内部
  • Ctrl+Shift+F8 :跳出正在跟踪的函数,直接返回上一层函数。
  • F5 :运行程序,直到出现错误、程序结束或程序断点为止
  • Ctrl+F8 :运行程序,直到出现错误、程序结束、程序断点或当前光标所在行为止
  • debug.print var :在立即窗口中显示 var 的值
  • debug.assert var :当 var==false 时程序自动停止

以上命令也可在菜单和命令栏中获取。

在调试过程中,可通过下面几种方法查看各个变量的值,当变量和预期不一样时,也就找到了程序出错的原因,便能对照修改:

  • 立即窗口(快捷键 Ctrl+G ):在该窗口里会显示 debut.print 的结果值,以及随时计算和运行代码。在代码前面添加「?」,可以在立即窗口中显示运行结果。
  • 监视窗口:可以将变量以及表达式添加到监视窗口,可以实时查看变量和表达式的值。支持将代码窗口里的变量和表达式拖入到见识窗口
  • 本地窗口:本地窗口里可以查看目前的 local 变量和 global 变量的变量值。
  • 编辑窗口:将鼠标停在编辑窗口的变量上可显示该变量的值。

有一些方法可减少程序错误以及降低调试的难度:

  • 添加重要的代码注释。
  • 源代码格式规范化,增加代码可读性。VBA 插件 Smart Indent 是一个很好的辅助工具。
  • 尽可能声明变量类型,少用 Variant 变量。
  • 注意函数的参数传递方式,默认为传引用,子函数会修改变量的值。
  • 尽量将功能函数化,不同的功能分开写。
  • 避免在 VBA 中引用绝对地址,如 Range("A1")。可先在 Excel 中定义名称"abc=\ \(A\\) 1",然后引用 Range("abc")。
  • 避免使用 ActiveSheet, ActiveWorkbook 等可变变量,用 Sheet1,ThisWorkbook 这种绝对变量。绝对变量不受外界操作影响。

Q. E. D.

类似文章:
编程 » VBA, Excel
如果不提供错误处理方法, VBA在出错时会停留在出错之处。Excel/VBA 提供 On Error关键词来处理程序运行过程中的错误,具体有下面两种用法:
编程 » Excel, VBA
无意中发现一个 Excel VBA 对待参数的一个"不正常"现象。这种处理方式可能无意中导致程序结果错误,而且你很难发现你的错误所在:
编程 » Excel, VBA
最近学到一招,效果不错~
编程 » Excel, VBA
某些时候需要打开 Excel 文件来获取或者写入数据,但又不希望跳出打开的 Excel 文件窗口,可以用下面的代码:
风险管理 » VaR Primer
在计算 VaR 之前,需要先明确所计算 VaR 的参数。最重要的两个参数为时间期限和置信度,前者对应所需衡量风险的时间段,后者对应风险的容忍度。
碎碎念 » TED, 魔术
刚看了一个 TED 视频, 大衛布萊恩: 如何閉氣超過十七分鐘 ,里面有这么一段