避免错误情况

发生运行时错误时,良好的代码应该处理它。最好的错误处理策略是编写检查错误条件的代码,并简单地避免执行导致运行时错误的代码。

减少运行时错误的一个关键因素是编写做一件事的小程序。程序必须失败的原因越少,整个代码调试就越容易。

避免运行时错误 91 - 未设置对象或 With 块变量:

在分配引用之前使用对象时,将引发此错误。可能有一个接收对象参数的过程:

Private Sub DoSomething(ByVal target As Worksheet)
    Debug.Print target.Name
End Sub

如果没有为 target 分配引用,上面的代码将引发一个错误,通过检查对象是否包含实际的对象引用可以轻松避免:

Private Sub DoSomething(ByVal target As Worksheet)
    If target Is Nothing Then Exit Sub
    Debug.Print target.Name
End Sub

如果没有为 target 分配引用,则永远不会使用未分配的引用,并且不会发生错误。

当一个或多个参数无效时,这种早期退出过程的方式称为保护子句

避免运行时错误 9 - 下标超出范围:

在阵列外部访问数组时会引发此错误。

Private Sub DoSomething(ByVal index As Integer)
    Debug.Print ActiveWorkbook.Worksheets(index)
End Sub

如果索引大于 ActiveWorkbook 中的工作表数量,则上述代码将引发运行时错误。一个简单的保护条款可以避免:

Private Sub DoSomething(ByVal index As Integer)
    If index > ActiveWorkbook.Worksheets.Count Or index <= 0 Then Exit Sub
    Debug.Print ActiveWorkbook.Worksheets(index)
End Sub

Most runtime errors can be avoided by carefully verifying the values we’re using before we use them, and branching on another execution path accordingly using a simple If statement - in guard clauses that makes no assumptions and validates a procedure’s parameters, or even in the body of larger procedures.