有句俗话说的好,一段优秀的代码,三分靠编写七分靠调试。今天我就给大家聊一下VBA代码调试的问题:一段代码写完了,运算结果却不对,到底应该如何发现并改正错误?
本章概要如下:
❶ 语法检查
❷ 逻辑检查
❸ 样本调式
❹ 运行调试
❺ 错误处理
对于新手而言,初期编写的VBA代码并不会有复杂的逻辑,最常见的错误就是语法错误。
典型有以下3种。
1) 声明对象变量,漏了关键字Set。
Sub t()
Dim sht As Worksheet
sht = Worksheets(1)
MsgBox sht.Name
End Sub
以上代码第3行将第1个工作表赋值变量sht,但由于并未使用关键字Set,代码会返回下图所示的错误信息:对象变量或with块变量未设置。
正确代码如下:
Sub t()
Dim sht As Worksheet
Set sht = Worksheets(1)
MsgBox sht.Name
End Sub
2)循环或判断语句不完整。
当有多层循环语句或者条件判断语句嵌套时,新手朋友容易遗漏Next或者End If语句。需要注意的是,当If语句嵌套在循环语句中时,如果缺少End If,系统会提示”编译错误,Next没有For”。这提示张冠李戴的不要太明显。
以下代码缺失End If语句。
Sub t3()
Dim sht As Worksheet
For Each sht In Worksheets
If sht.Name = "看见星光" Then
If sht.Cells(1, 1) = "excel" Then
MsgBox "对"
'这里少了End If 你发现了吗?
Next
End Sub
运行后提示错误如下:
解决此类错误,最好是养成代码缩进与提前输入结构语句的习惯。关于代码缩进的规则,VBA系列教程里有详细的讲述,这里不再啰嗦。而输入结构语句是指…
写了For语句后,立刻空两行写Next语句,再在循环体中编写其它语句。
For Each sht In Worksheets
Next
写了If语句后,也空两行写End If语句。
If sht.Name = "看见星光" Then
End If
3)工作表对象缺失
这个错误基本上每个VBA学员都遇见。
有段代码如下:
代码看不全可以左右滑动…
Sub t4()
Dim arr
arr = Worksheets(1).Range("a1:b" & Cells(Rows.Count, 1).End(xlUp).Row)
End Sub
第3行代码将第1个工作表的A:B列数据区域赋值数组arr。其中
Cells(Rows.Count, 1).End(xlUp).Row部分,
本意是返回Worksheets(1)第1列最后一个存在数据的单元格的行号,这代码看起来似乎正常无误。
但是,我们在VBA教程里讲过,如果单元格前未指定工作表对象,则默认为当前活动工作表——当前活动工作表,未必就是Worksheets(1),代码运行后,arr数组也就未必会返回正确的结果。
正确代码参考如下:
Sub t4()
Dim arr
With Worksheets(1)
arr = .Range("a1:b" & .Cells(Rows.Count, 1).End(xlUp).Row)
End With
End Sub
注意Cells前有个.代表With所引用的Worksheets(1)对象。
2、逻辑错误相比于语法错误,麻烦的是逻辑错误。
代码运算的逻辑,有些来源于数据分析与处理的基本逻辑,有些来源于公司的业务逻辑。对于后者,往往只有行业内的人才能通过你的描述快速理解。
这时就有可能发生这样的情景:有的朋友发出来一段代码,也不说运算逻辑,就问为什么代码运行后不提示错误,但结果并不对……
坦白的说,这种行为就给有人问为什么输入公式1+1不提示错误,但结果也不等于预想的3,差不了多少——就让人很无语。
如何梳理逻辑错误呢?
首先,正如我们一直强调的,所谓编程,就是顺序、分支和循环。顺序就是运算的先后顺序,分支就是运算的条件层次,循环就是遍历数据,所以请养成做思维导图的习惯,通过思维导图梳理清楚代码运算的顺序和条件层次——相信我,这非常有助于你快速而准确的编写代码。
然后,在代码中尽量增加注释。注释的好处我们在VBA系列教程中编写VBA代码有哪些注意事项里有详细解释,像我这么傲骄的人,这里不再重复,你懂得图片。
最后,请继续往下看(*^▽^*)
3、样本调试不论是检查代码的语法错误还是逻辑错误,都离不开样本调试;也就是用一个样本数据逐步运行代码,发现并修正错误。上面这句话包含了两个重点词汇:样本数据、逐步运行。
样本数据要求小而全。
上一篇:表格制作快速入门:全了,SUBSTITUTE函数常用套路集合! 下一篇:表格制作快速入门:10个动画,告诉你Excel排序怎么用
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。