我们写VBA代码的时候,很少会一次性就能通过,往往执行报错,然后找BUG
这里我们就说说一些常用的VBA代码调试技巧
一,代码书写上的误区
1,喜欢嵌套写代码
因为公式写的比较多,我们往往喜欢嵌套来书写代码
比如,下面案例
Sub test()
Dim arr
arr = Range("a1:b" & Cells(Rows.Count, 1).End(3).Row).Value
End Sub
上面代码我们把得到最大单元格写到一行里,但是如果我们的最大单元格按C列判断的时候,上面代码就出问题了,但是我们调试的时候,是看不出Cells(Rows.Count, 1).End(3).Row
这句代码值是多少?
造成我们找半天才发现,最大行有问题(还有很多嵌套用的情况,这个案例可能不明显)
比较好调试的写法
Sub test()
Dim arr, lastRow
lastRow = Cells(Rows.Count, 1).End(3).Row
arr = Range("a1:b" & lastRow).Value
End Sub
拆分成2行来书写,每一步都能看到返回值
2,不开启强制变量声明
位置在工具,选项里
这个要勾选
不强制,你定不定义变量都可以,但是,我们如果写一个比较复杂的程序的时候,变量比较多
比如我们定义了个dic,但是写的过程中变成了fic,没声明不会报错,我们程序会错,还检查不出来,这是调试中比较难发现的错误
我们强制定义勾选了,这种写错,没定义的,执行时就会报错了,一下就看出来了
二,调试的技巧
1,调出调试和注释菜单
如上图,在空白菜单鼠标右键,勾选编辑和调试
2,代码单步执行
如上图位置,点击可以单步执行,快捷键是F8
3,过程调试
如上图位置,点击可以直接执行整个SUB或者FUNCTION,不需要跳进去单步执行,快捷键Shist+F8
Sub test()
Dim arr, lastRow
lastRow = GetLastRow(ActiveSheet, 1) '我已经知道这个函数肯定没问题,就直接过程执行得到结果就好了
arr = Range("a1:b" & lastRow).Value
End Sub
Function GetLastRow(sht As Worksheet, col)
GetLastRow = sht.Cells(sht.Rows.Count, col).End(3).Row
End Function
lastRow = GetLastRow(ActiveSheet, 1)
这里就可以直接快捷键Shist+F8
跳过就好了
4)跳出执行
如上图位置,快捷键Ctrl+Shift+F8
这个是什么意思呢?
就比如调试的时候,我们执行到另外一个程序里了,这个程序没问题,我们点击这个就一口气执行完这个程序,回到主函数里
三,辅助查看
1,本地窗口
当我们调试的时候,本地窗口就能看到我们定义的变量值,方便我们查看那些变量出了问题
2,监视窗口
当我们一些变量希望能单独查看,不要在这么多变量一起
我们可以点击变量,鼠标右键,添加监视
这个窗口我们比较常用的是字典查看item的值的是,因为本地窗口是看不到字典的item的
添加监视的时候,我们自己写dic.items就好,就能查看了
3,立即窗口
这个窗口就用处非常多了,可以这么说,可以没有本地窗口和监视窗口,但是如果没立即窗口,调试效率直接少一半
我们常用立即窗口打印变量值
Debug.Print
语句打印
Sub test()
Dim arr, lastRow
lastRow = GetLastRow(ActiveSheet, 1)
Debug.Print lastRow
arr = Range("a1:b" & lastRow).Value
End Sub
上面代码我们通过Debug.Print
语句打印变量lastRow
值到立即窗口
- 前面加问号直接查看
上面代码,我们单步执行的时候,想看前面lastRow
变量的值,直接立即窗口输入?lastRow
回车,就直接可以查看变量值,也可以这样执行一个function函数,直接查看函数的值
执行语句或者程序
执行某个语句
比如我们调试的过程,关闭了屏幕刷新,这个时候看不到Excel界面显示的,需要临时打开屏幕刷新
我们就可以直接在立即窗口执行语句application.ScreenUpdating=True
,就打开屏幕刷新
执行某个程序
直接立即窗口,输入程序名字,回车就可以了
四,断点
什么是断点?
我们想让程序执行过程中在某处停止,就可以在那行代码上打一个断点
如何打断点?
-
左侧边栏,需要停止位置点击鼠标右键就可以了
-
- 鼠标放到要断点代码位置,点击上图位置,或者快捷键
F9
- 鼠标放到要断点代码位置,点击上图位置,或者快捷键
上面2种方法都可以
不打断点可不可以直接执行到某行?
可以的,我们在单步调试的过程中,鼠标当到要执行的位置,鼠标右键,点运行到光标处
还有没有其他方法,让代码某处停止?
还是有的,stop
语句
Sub test()
Dim arr, lastRow
lastRow = GetLastRow(ActiveSheet, 1)
Debug.Print lastRow
arr = Range("a1:b" & lastRow).Value
Stop
End Sub
上面代码直接运行,就会在stop处停止
stop语句在什么时候用?
一些复杂的需要停止的时候,比如我们希望最后一行如果不是9的时候才停止,否则不停止
Sub test()
Dim arr, lastRow
lastRow = GetLastRow(ActiveSheet, 1)
If lastRow <> 9 Then Stop
Debug.Print lastRow
arr = Range("a1:b" & lastRow).Value
End Sub
上面代码就做个了一个判断,满足条件才停止,这个在我们代码调试过程中是经常用的技巧
标签:VBA,End,技巧,代码,arr,lastRow,调试,Sub From: https://www.cnblogs.com/lyfegf/p/18063483