目录:
- 在出现错误后继续
- 为了帮助您保持所有错误处理业务的顺利进行,下面是一个快速而简洁的总结。错误处理代码块具有以下特征:
- 以下示例循环选择范围中的每个单元格,并将该值转换为其平方根。如果所选单元格中包含负数或文本,则此过程将生成错误消息:
当您需要处理Excel VBA中的错误时,可以使用OnError语句。但是,首先需要了解一些事情。您可以通过三种方式使用On Error语句。
语法 | 执行的操作 |
---|---|
On Error GoTo label | 执行此语句后,VBA将在指定标签后的
语句处继续执行。您必须在标签后面包含冒号 ,以便VBA将其识别为标签。 |
On Error GoTo 0 | 执行此语句后,VBA恢复正常的
错误检查行为。在使用其中一个 其他On Error语句之后,或者当您要删除过程中的错误处理 时,请使用此语句。 |
On Error Resume Next | 执行此语句之后,VBA将忽略所有错误
,然后继续执行下一条语句。 |
在出现错误后继续
在某些情况下,只需要在发生错误时正常结束。例如,您可能会显示一条描述错误的消息,然后退出该过程。 (前面显示的EnterSquareRoot5示例使用这种技术。)在其他情况下,如果可能的话,您希望从错误中恢复。
要从错误中恢复,您必须使用Resume语句。这将清除错误情况并让您在某个位置继续执行。您可以通过三种方式使用Resume语句。
语法 | 执行的操作 |
---|---|
继续执行 | 继续执行导致错误的语句。如果你的错误处理代码纠正了这个问题,那么使用
,并且可以继续 。 |
继续执行 | 执行继续执行紧跟在导致错误的
语句之后的语句。这基本上忽略了 错误。 |
继续 标签 | 继续执行您指定的 标签 。 |
Sub EnterSquareRoot6()Dim Num As Variant Dim Msg As As String Dim Ans As Integer TryAgain:'设置错误处理On Error GoTo BadEntry'提示值Num = InputBox(“输入值”)如果Num =“”Then Exit Sub'插入平方根ActiveCell。 Value = Sqr(Num)Exit Sub BadEntry:Msg = Err。数字&“:”&错误(错误号码)消息=消息&vbNewLine&vbNewLine消息=消息&“确保范围被选中,”Msg = Msg&“表不受保护,Msg = Msg&”和你输入一个非负值。 “Msg = Msg&vbNewLine&vbNewLine&”再试一次? “Ans = MsgBox(Msg,vbYesNo + vbCritical)If Ans = vbYes Then Resume TryAgain End Sub
这个过程有另一个标签:TryAgain。如果发生错误,则继续执行BadEntry标签,代码显示下面的消息。如果用户通过单击“是”进行响应,则“恢复”(Resume)语句将启动,执行将跳转回TryAgain标签。如果用户单击否,过程结束。
如果发生错误,用户可以决定是否再次尝试。
请注意,错误消息还包含错误编号以及“官方”错误描述。在继续之前,Resume语句清除错误条件。要看到这一点,请尝试用下面的语句代替上例中的倒数第二个语句:
如果Ans = vbYes Then GoTo TryAgain
如果使用GoTo而不是Resume,则代码无法正常工作。为了演示,输入一个负数。你得到错误提示。单击是再次尝试,然后输入
另一个 负数。第二个错误没有被捕获,因为原来的错误条件没有被清除。 错误处理概述
为了帮助您保持所有错误处理业务的顺利进行,下面是一个快速而简洁的总结。错误处理代码块具有以下特征:
它在On Error语句中指定的标签之后立即开始。只有发生错误时,才能通过宏访问它。这意味着您必须在标签之前立即使用诸如Exit Sub或Exit Function之类的语句。
-
它可能需要一个Resume语句。如果在发生错误时选择不中止过程,则必须在返回主代码之前执行Resume语句。
-
知道何时忽略错误
-
在某些情况下,忽略错误是完全可以的。这就是On Error Resume Next语句发挥作用的时候。
以下示例循环选择范围中的每个单元格,并将该值转换为其平方根。如果所选单元格中包含负数或文本,则此过程将生成错误消息:
Sub SelectionSqrt()Dim cell As Range If TypeName(Selection)<>“range”Then Exit Sub For Each cell In Selection cell。 Value = Sqr(cell。Value)Next cell End Sub
在这种情况下,您可能只想跳过包含无法转换为平方根的值的单元格。您可以通过使用If-Then结构来创建各种错误检查功能,但您可以通过简单地忽略发生的错误来设计一个更好(更简单)的解决方案。
下面的例程通过使用On Error Resume Next语句完成此操作: SelectionSeq()Dim单元格作为范围如果TypeName(选择)<>“范围”然后Exit Sub On Error Resume Next对于每个单元格In选择细胞。 Value = Sqr(cell。Value)Next cell End Sub
通常,如果您认为错误对您的任务无害或无关紧要,则可以使用On Error Resume Next语句。