6

调试 Excel VBA 代码

 3 years ago
source link: https://zhiqiang.org/coding/debug-excel-vba.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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.


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK