代码调试

  1. 逐句运行:F8,将工作簿窗口和VBE窗口并排显示;模块→在代码窗口右上角的过程下拉框中选择所需执行的过程,按F8,当前运行的语句显示为黄色,继续按F8,即可以执行一行,持续按F8;;
  2. 设置断点:F9;断点就是在程序中设置VBA代码暂时停止运行的位置,程序进入中断模式,此时在立即窗口和本地窗口可以查看变量以及对象的属性值。
  3. 立即窗口:执行单行的语句或显示Debug.pring所打印的表达式的值;按Ctrl+G打开,在窗口中输入过程名,按Enter,即可运行该过程。可用于程序调试中,可以运行单行的语句或调用过程,也可以用问号表示某变量或常量的值,如?thisworkbook.Name。

    Debug.Print?"A等于"?&?A

    在“立即窗口”中显示该内容;

  4. 本地窗口:单步调试时,在中断状态下可以非常方便地查看当前运行的过程中所包含的变量的值和对象的状态;
  5. 清除所有断点:调试→清除所有断点
  6. On Error Resume Next:忽略错误而继续执行后续语句;

    代码如果有错误时,可以忽略,而不会中断;

On Error GoTo 0语句表示禁止当前过程中任何已启动的错误处理程序。

假设在过程中有On Error GoTo line和On Error Resume Next语句,那么本语句可以使用On Error GoTo line和On Error Resume Next失效。所以On Error GoTo 0语句不会单独使用。

如果在过程中使用了或者On Error GoTo line和On Error Resume Next语句,限制了程序出错时该如何处理,而在后续的过程中如果不再需要按该规则执行,则可以在适当的地方插入On Error GoTo 0语句,表示清除前面的错误处理机制。

使用Debug对象

有两个方法,Print和Assert;

Print方法可以在不暂停程序运行的情况下监控某个变量在代码执行过程中的变化。Print方法在立即窗口显示文本。

Assert方法只有在Visual Basic编辑器中起作用,此方法和if语句类似,它判断一个条件是否成立,但是if语句不会暂停程序的执行。如果此方法的参数不成立,程序将在该语句暂停并进入中断模式。

立即窗口调试

Sub immediateTest()

Dim sh As Variant

Dim strTmp As String

For Each sh In Sheets

If strTmp = "" Then

strTmp = sh.Name

Else

strTmp = strTmp & vbCrLf & sh.Name

End If

Next

MsgBox strTmp

End Sub

'程序逐句运行到第5行代码时,在[立即窗口]中输入“?sheets.count”后按Enter键,将在下一行打印工作表总数。

'输入“?sh.name”后按Enter键,将在下一行打印出循环中的工作表名称;

'也可以调用自定义函数而打印出函数返回的值,如“?AssertTest(10,5)”

 

'立即窗口改变变量的值查看运行情况

Sub test2()

Dim i As Integer

For i = 1 To 100

Debug.Print i * i

Next i

End Sub

'逐句运行到i=2时,可以在立即窗口中输入i=88,断续逐句运行(F9),可以查看打印结果;

 

'立即窗口也可以直接运行一行VBA语句;

'For Each sh In Sheets: Debug.Print sh.Name: Next

 

 

监视窗口调试

Sub watchTest()

Dim Iradius As Integer

Dim k As Integer

For Iradius = 1 To 10

Debug.Print GetCircleArea(Iradius)

If Iradius > 7 Then

k = 1

End If

Next Iradius

End Sub

Function GetCircleArea(ByVal Iradius As Integer) As Double

GetCircleArea = Iradius * Iradius * 3.1415926

End Function

'可以监视指定的表达式,如GetCircleArea(Iradius),Iradius=5;

'调试→添加监视,监视类型:当监视值为真时中断

删除监视:监视窗口中选择→del