VBA调试技巧

我们写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,立即窗口

这个窗口就用处非常多了,可以这么说,可以没有本地窗口和监视窗口,但是如果没立即窗口,调试效率直接少一半

我们常用立即窗口打印变量值

  1. 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值到立即窗口

  1. 前面加问号直接查看

上面代码,我们单步执行的时候,想看前面lastRow变量的值,直接立即窗口输入?lastRow回车,就直接可以查看变量值,也可以这样执行一个function函数,直接查看函数的值

执行语句或者程序

执行某个语句

比如我们调试的过程,关闭了屏幕刷新,这个时候看不到Excel界面显示的,需要临时打开屏幕刷新

我们就可以直接在立即窗口执行语句application.ScreenUpdating=True,就打开屏幕刷新

执行某个程序

直接立即窗口,输入程序名字,回车就可以了

四,断点

什么是断点?

我们想让程序执行过程中在某处停止,就可以在那行代码上打一个断点

如何打断点?

下面两种方式都可以

  1. 左侧边栏,需要停止位置点击鼠标右键就可以了

  2. 鼠标放到要断点代码位置,点击下图位置,或者快捷键F9

不打断点可不可以直接执行到某行?

可以的,我们在单步调试的过程中,鼠标当到要执行的位置,鼠标右键,点运行到光标处

还有没有其他方法,让代码某处停止?

还是有的,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

上面代码就做个了一个判断,满足条件才停止,这个在我们代码调试过程中是经常用的技巧

posted @ 2024-03-09 22:13  lyfegf  阅读(841)  评论(0)    收藏  举报