【原创】VBA学习笔记(3) VBA错误类型和调试方法

一 认识程序里的三类错误

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

 

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值