一 认识程序里的三类错误
1.1 编译错误(语法错误):
- 比如拼写错误,符号错误,格式错误等等 ,一般是比较低级的错误
- 运行前,编译时就会报错的
- 因为代码运行前,编辑器会先检查语法错误
- VBA里的编译错误,就是写在VBE里,还没运行就报错的那类错误
1.2 运行错误(和数据关系较大):
- 运行时才会出错的错误
- 比如一个语句运行时发现此操作会无法进行,卡住,或者返回值报错等等
- 这种一般是因为处理数据时发生错误,一般是和数据相关
- 可能是数据错误,也可能是运算方法错误/0, 或数据和方法不匹配,又或是边界情况没处理好
1.3 逻辑错误(语义错误):
- 甚至运行也不报错,并不代表就一定正确,只是不符合你的目标,需要你自己查
二 coding时的三种模式(三种状态)
2.1 开发时三种运行模式:开发,运行,中断模式
- 设计模式:
- 正在编写代码,增加UI等等,查看各种状态栏等
- 运行模式:
- 代码正在运行
- 中断模式:break mode
- 代码运行中断等待(代码出错,或 故意中断)
- 主动进入中断模式方法:
- 方法1: ctrl+break / ctrl pause 可强行中断,比如遇到死循环
- break mode可以被禁用:
- Application.EnableCancelKey=xlDisabled
- 方法2:VBE里设置断点
- 方法3:代码中加入 stop (单独行)
- 下图是举例,2种方法效果相同
2.2 调试模式
- 逐语句
- 只会在一个过程内的语句内,逐个语句使用,返回有回到过程最开始
- 逐过程----按 F8 逐个语句运行
- F5是直接运行
2.3 发布时,工程版本的两种版本类型:debug版本和release版本
- 一般各种测试log需要放在debug模式下,release是发版本的,要保证BUG少,速度快,不要有乱七八糟的东西
- 在Debug模式下,编译器会记录很多调试信息,也可以加入很多测试代码,方便我们程序员测试,以及出现bug时的分析解决
- Release模式下,就没有上述那些调试信息,而且编译器也会自动优化一些代码,这样生成的程序性能是最优的,但是如果出现问题,就不方便分析和测试了,
- Release模式通常用于正式发布
- Assert断言指令,是属于调试代码,当然只能在debug模式下用
三 代码错误(预)处理--用错误陷阱进行错误捕捉
3.1 对可能出现的错误的预处理的2种方式,配合抛出异常语句使用
- 程序出错了,肯定是希望告诉你为什么,而不是原因不明!,所以要抛出异常
- 另外,代码也需要根据预估的异常先做处理,避免代码运行时各种卡住,不够健壮
- On error resume next 前面需要加 exit sub呢,是为了避免正常语句执行时走到,异常处理语句,
- exit sub
- On Error GoTo label
- 需要配合使用
- label: 报错信息等
- exit sub
- On Error Resume Next
- 需要配合使用
- 一般下一句就是报错后的处理,报错信息等
四 查错第1步:熟悉各种错误
参考我整理各种常见BUG报错
五 查错第2步 ,根据经验定位错误的位置
- 熟悉代码
- 至少了解,代码的执行次序
- 基础次序:顺序从上往下执行
- 特殊次序:分支语句,循环语句
- 根据语句的执行次序,从上往下取鲁BUG
- 代码的基本次序是顺序,所以报错也是顺序的,只会先报第1条,前面卡住了后面就不检查了。不代表只有这1个错误
直接在立即窗口写代码
5.1 直接敲代码
- 如果是debug.print 这种,可以直接使用
- 调用函数,不返回值
- 比如 sqr(16)
- 在立即窗口中运行 VBA语句,不用加 ?等
5.2 需要返回值,记得前面加 ?或print
- 如果是调用函数等,前面先打 英文半角 ? 或 print 会输出结果
- 比如 ?sqr(9) 否则不返回结果
debug.Print 11
11
sqr(9)
?sqr(9)
3
print sqr(16)
4
本地窗口
- 本地窗口会显示变量值等
- 但是注意,运行完成后这些内容会马上清楚
- 可以加 打断语句等
监视窗口
- 邮件选择某些变量,可以添加进监视窗口
六 高级查错
6.1 出错调试: 先中断!
- 程序出错了,肯定是希望告诉你为什么,而不是原因不明!,所以要抛出异常
- 调试方法1:中断操作(可中断死循环)
- Ctrl+pause/break键盘
- 中断
debug.assert
和stop功能类似
http://www.excelpx.com/thread-117425-1-1.html
6.3 出错调试:跟踪调试,打断点等
- 如何调试
- 打断点,逐步看值:行首标记打断点
- 逐步运行,F8
- 标记一行后,选择断点,可以看 数值的变化,逐个变化
- 添加监视窗口,监视变量
参考资料
搜 VBA debug
http://www.cnblogs.com/wuzhiblog/p/vba_seven.html
https://blog.csdn.net/iamlaosong/article/details/39894719
http://www.360doc.com/content/17/1003/18/30583536_692032205.shtml
http://www.360doc.com/content/16/0904/08/30583536_588259694.shtml